From 3455f95226088df528bcd58df8885358f03598bf Mon Sep 17 00:00:00 2001 From: Convly Date: Thu, 20 Apr 2023 15:27:52 +0200 Subject: [PATCH 001/172] Upgrade to TS V5 and fix related breaking changes Co-authored-by: Simone Co-authored-by: Christian Co-authored-by: Bassel Kanso Co-authored-by: Ben Irvin --- package.json | 2 +- packages/core/admin/package.json | 2 +- packages/core/data-transfer/package.json | 2 +- packages/core/helper-plugin/package.json | 2 +- packages/core/strapi/package.json | 2 +- .../lib/templates/ts/plugin-package.json.hbs | 2 +- .../lib/generators/schemas/global.js | 3 -- .../lib/generators/schemas/imports.js | 1 - .../lib/generators/schemas/index.js | 5 +++- .../lib/generators/schemas/schema.js | 1 - .../lib/generators/schemas/utils.js | 8 +----- packages/utils/typescript/package.json | 2 +- yarn.lock | 28 +++++++++---------- 13 files changed, 26 insertions(+), 34 deletions(-) diff --git a/package.json b/package.json index f21269cb9a..4542d36995 100644 --- a/package.json +++ b/package.json @@ -115,7 +115,7 @@ "supertest": "6.3.3", "ts-jest": "29.0.3", "typedoc": "0.23.26", - "typescript": "4.6.2", + "typescript": "5.0.4", "yargs": "17.6.0" }, "engines": { diff --git a/packages/core/admin/package.json b/packages/core/admin/package.json index f80c4e0431..b669f2d644 100644 --- a/packages/core/admin/package.json +++ b/packages/core/admin/package.json @@ -133,7 +133,7 @@ "sift": "16.0.1", "style-loader": "3.3.1", "styled-components": "5.3.3", - "typescript": "4.6.2", + "typescript": "5.0.4", "webpack": "^5.76.0", "webpack-cli": "^5.0.1", "webpack-dev-server": "^4.13.1", diff --git a/packages/core/data-transfer/package.json b/packages/core/data-transfer/package.json index ce753d63aa..86d4602d58 100644 --- a/packages/core/data-transfer/package.json +++ b/packages/core/data-transfer/package.json @@ -69,7 +69,7 @@ "knex": "2.4.0", "koa": "2.13.4", "rimraf": "3.0.2", - "typescript": "4.6.2" + "typescript": "5.0.4" }, "engines": { "node": ">=14.19.1 <=18.x.x", diff --git a/packages/core/helper-plugin/package.json b/packages/core/helper-plugin/package.json index 6b806f9c93..9243548733 100644 --- a/packages/core/helper-plugin/package.json +++ b/packages/core/helper-plugin/package.json @@ -76,7 +76,7 @@ "react-test-renderer": "^17.0.2", "rimraf": "3.0.2", "styled-components": "5.3.3", - "typescript": "4.6.2", + "typescript": "5.0.4", "webpack": "^5.76.0", "webpack-cli": "^5.0.1" }, diff --git a/packages/core/strapi/package.json b/packages/core/strapi/package.json index 1b2e354976..926aaa8ac3 100644 --- a/packages/core/strapi/package.json +++ b/packages/core/strapi/package.json @@ -136,7 +136,7 @@ }, "devDependencies": { "supertest": "6.3.3", - "typescript": "4.6.2" + "typescript": "5.0.4" }, "engines": { "node": ">=14.19.1 <=18.x.x", diff --git a/packages/generators/generators/lib/templates/ts/plugin-package.json.hbs b/packages/generators/generators/lib/templates/ts/plugin-package.json.hbs index 9df004ce27..dffe8c6fa9 100644 --- a/packages/generators/generators/lib/templates/ts/plugin-package.json.hbs +++ b/packages/generators/generators/lib/templates/ts/plugin-package.json.hbs @@ -23,7 +23,7 @@ "react-dom": "^17.0.2", "react-router-dom": "^5.3.4", "styled-components": "^5.3.6", - "typescript": "4.6.3" + "typescript": "5.0.4" }, "peerDependencies": { "react": "^17.0.2", diff --git a/packages/utils/typescript/lib/generators/schemas/global.js b/packages/utils/typescript/lib/generators/schemas/global.js index 6c36eba27a..64fd4d06f5 100644 --- a/packages/utils/typescript/lib/generators/schemas/global.js +++ b/packages/utils/typescript/lib/generators/schemas/global.js @@ -36,17 +36,14 @@ const generateGlobalDefinition = (schemasDefinitions = []) => { const properties = schemasDefinitions.map(schemaDefinitionToPropertySignature); return factory.createModuleDeclaration( - undefined, [factory.createModifier(ts.SyntaxKind.DeclareKeyword)], factory.createIdentifier('global'), factory.createModuleBlock([ factory.createModuleDeclaration( - undefined, undefined, factory.createIdentifier('Strapi'), factory.createModuleBlock([ factory.createInterfaceDeclaration( - undefined, undefined, factory.createIdentifier('Schemas'), undefined, diff --git a/packages/utils/typescript/lib/generators/schemas/imports.js b/packages/utils/typescript/lib/generators/schemas/imports.js index 14c10adde7..b5b31fcc33 100644 --- a/packages/utils/typescript/lib/generators/schemas/imports.js +++ b/packages/utils/typescript/lib/generators/schemas/imports.js @@ -23,7 +23,6 @@ module.exports = { ); return factory.createImportDeclaration( - undefined, undefined, factory.createImportClause(false, undefined, factory.createNamedImports(formattedImports)), factory.createStringLiteral('@strapi/strapi'), diff --git a/packages/utils/typescript/lib/generators/schemas/index.js b/packages/utils/typescript/lib/generators/schemas/index.js index 6fcd044072..24cc279cf1 100644 --- a/packages/utils/typescript/lib/generators/schemas/index.js +++ b/packages/utils/typescript/lib/generators/schemas/index.js @@ -34,7 +34,10 @@ const emitDefinitions = (definitions) => { ts.ScriptKind.TS ); - const printer = ts.createPrinter({ newLine: true, omitTrailingSemicolon: true }); + const printer = ts.createPrinter({ + newLine: ts.NewLineKind.LineFeed, + omitTrailingSemicolon: true, + }); return printer.printList(ts.ListFormat.MultiLine, nodeArray, sourceFile); }; diff --git a/packages/utils/typescript/lib/generators/schemas/schema.js b/packages/utils/typescript/lib/generators/schemas/schema.js index 31ac098027..713ed1d59d 100644 --- a/packages/utils/typescript/lib/generators/schemas/schema.js +++ b/packages/utils/typescript/lib/generators/schemas/schema.js @@ -69,7 +69,6 @@ const generateSchemaDefinition = (schema) => { // Generate the schema's interface declaration const schemaType = factory.createInterfaceDeclaration( - undefined, [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier(interfaceName), undefined, diff --git a/packages/utils/typescript/lib/generators/schemas/utils.js b/packages/utils/typescript/lib/generators/schemas/utils.js index 24c10bdd3a..df84117597 100644 --- a/packages/utils/typescript/lib/generators/schemas/utils.js +++ b/packages/utils/typescript/lib/generators/schemas/utils.js @@ -120,13 +120,7 @@ const toTypeLiteral = (data) => { return [ ...acc, - factory.createPropertyDeclaration( - undefined, - undefined, - identifier, - undefined, - toTypeLiteral(value) - ), + factory.createPropertyDeclaration(undefined, identifier, undefined, toTypeLiteral(value)), ]; }, []); diff --git a/packages/utils/typescript/package.json b/packages/utils/typescript/package.json index 2f62b8f390..c72d229be9 100644 --- a/packages/utils/typescript/package.json +++ b/packages/utils/typescript/package.json @@ -34,7 +34,7 @@ "fs-extra": "10.0.1", "lodash": "4.17.21", "prettier": "2.8.4", - "typescript": "4.6.2" + "typescript": "5.0.4" }, "engines": { "node": ">=14.19.1 <=18.x.x", diff --git a/yarn.lock b/yarn.lock index fa13dcaa38..861a48aa35 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7080,7 +7080,7 @@ __metadata: speed-measure-webpack-plugin: 1.5.0 style-loader: 3.3.1 styled-components: 5.3.3 - typescript: 4.6.2 + typescript: 5.0.4 webpack: ^5.76.0 webpack-bundle-analyzer: ^4.8.0 webpack-cli: ^5.0.1 @@ -7139,7 +7139,7 @@ __metadata: stream-json: 1.7.4 tar: 6.1.13 tar-stream: 2.2.0 - typescript: 4.6.2 + typescript: 5.0.4 uuid: 9.0.0 ws: 8.11.0 languageName: unknown @@ -7274,7 +7274,7 @@ __metadata: react-test-renderer: ^17.0.2 rimraf: 3.0.2 styled-components: 5.3.3 - typescript: 4.6.2 + typescript: 5.0.4 webpack: ^5.76.0 webpack-cli: ^5.0.1 peerDependencies: @@ -7816,7 +7816,7 @@ __metadata: semver: 7.3.8 statuses: 2.0.1 supertest: 6.3.3 - typescript: 4.6.2 + typescript: 5.0.4 uuid: ^8.3.2 bin: strapi: ./bin/strapi.js @@ -7832,7 +7832,7 @@ __metadata: fs-extra: 10.0.1 lodash: 4.17.21 prettier: 2.8.4 - typescript: 4.6.2 + typescript: 5.0.4 languageName: unknown linkType: soft @@ -28801,7 +28801,7 @@ __metadata: supertest: 6.3.3 ts-jest: 29.0.3 typedoc: 0.23.26 - typescript: 4.6.2 + typescript: 5.0.4 yargs: 17.6.0 languageName: unknown linkType: soft @@ -30373,13 +30373,13 @@ __metadata: languageName: node linkType: hard -"typescript@npm:4.6.2": - version: 4.6.2 - resolution: "typescript@npm:4.6.2" +"typescript@npm:5.0.4": + version: 5.0.4 + resolution: "typescript@npm:5.0.4" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 8a44ed7e6f6c4cb1ebe8cf236ecda2fb119d84dcf0fbd77e707b2dfea1bbcfc4e366493a143513ce7f57203c75da9d4e20af6fe46de89749366351046be7577c + checksum: 82b94da3f4604a8946da585f7d6c3025fff8410779e5bde2855ab130d05e4fd08938b9e593b6ebed165bda6ad9292b230984f10952cf82f0a0ca07bbeaa08172 languageName: node linkType: hard @@ -30403,13 +30403,13 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@4.6.2#~builtin": - version: 4.6.2 - resolution: "typescript@patch:typescript@npm%3A4.6.2#~builtin::version=4.6.2&hash=5d3a66" +"typescript@patch:typescript@5.0.4#~builtin": + version: 5.0.4 + resolution: "typescript@patch:typescript@npm%3A5.0.4#~builtin::version=5.0.4&hash=85af82" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 40b493a71747fb89fa70df104e2c4a5e284b43750af5bea024090a5261cefa387f7a9372411b13030f7bf5555cee4275443d08805642ae5c74ef76740854a4c7 + checksum: bb309d320c59a26565fb3793dba550576ab861018ff3fd1b7fccabbe46ae4a35546bc45f342c0a0b6f265c801ccdf64ffd68f548f117ceb7f0eac4b805cd52a9 languageName: node linkType: hard From 8c6a17c2a4779edccfe8eebf52ba14dcdf8497b9 Mon Sep 17 00:00:00 2001 From: Christian Capeans Date: Mon, 24 Apr 2023 17:21:21 +0200 Subject: [PATCH 002/172] Add collectionName to literal properties --- packages/utils/typescript/lib/generators/schemas/schema.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/utils/typescript/lib/generators/schemas/schema.js b/packages/utils/typescript/lib/generators/schemas/schema.js index 713ed1d59d..e0962a40c1 100644 --- a/packages/utils/typescript/lib/generators/schemas/schema.js +++ b/packages/utils/typescript/lib/generators/schemas/schema.js @@ -55,7 +55,7 @@ const generateSchemaDefinition = (schema) => { addImport(parentType); // Properties whose values can be mapped to a literal type expression - const literalPropertiesDefinitions = ['info', 'options', 'pluginOptions'] + const literalPropertiesDefinitions = ['collectionName', 'info', 'options', 'pluginOptions'] // Ignore non-existent or empty declarations .filter((key) => !isEmpty(schema[key])) // Generate literal definition for each property From db90d338a52c40ba9e0d555db49bc66e44f81ebe Mon Sep 17 00:00:00 2001 From: Convly Date: Fri, 28 Apr 2023 15:11:42 +0200 Subject: [PATCH 003/172] tmp --- .../server/controllers/collection-types.js | 62 ++++++++++++++++++- .../server/services/entity-manager.js | 4 +- .../server/services/permission-checker.js | 4 +- packages/core/permissions/lib/engine/index.js | 5 ++ 4 files changed, 69 insertions(+), 6 deletions(-) diff --git a/packages/core/content-manager/server/controllers/collection-types.js b/packages/core/content-manager/server/controllers/collection-types.js index 0bfb296d46..be61a3ec4f 100644 --- a/packages/core/content-manager/server/controllers/collection-types.js +++ b/packages/core/content-manager/server/controllers/collection-types.js @@ -1,9 +1,12 @@ 'use strict'; -const { setCreatorFields, pipeAsync } = require('@strapi/utils'); +const { set, get } = require('lodash/fp'); + +const { setCreatorFields, pipeAsync, traverse } = require('@strapi/utils'); const { getService, pickWritableAttributes } = require('../utils'); const { validateBulkDeleteInput } = require('./validation'); +const traverseQueryFilters = require('@strapi/utils/lib/traverse/query-filters'); module.exports = { async find(ctx) { @@ -45,13 +48,68 @@ module.exports = { if (permissionChecker.cannot.read()) { return ctx.forbidden(); } + const permissionQuery = await permissionChecker.sanitizedQuery.read(ctx.query); + // { $and: { addresses: { elemMatch: { postal_code: { gt: 60 } } } } + // populate: ['addresses'] + // populate: { addresses: { fields: ['postal_code'] } } + // const populate = { + // addresses: { + // fields: ['postal_code'], + // populate: { + // createdBy: { + // fields: [], + // }, + // }, + // }, + // }; + const populateQuery = {}; + await traverse.traverseQueryFilters( + ({ key, value, attribute, path }) => { + if (!attribute) { + return; + } - const entity = await entityManager.findOneWithCreatorRolesAndCount(id, model); + console.log('---visitor---'); + console.log(key, value); + console.log(path, attribute?.type); + + const { type } = attribute; + + if ( + type === 'dynamiczone' || + (type === 'relation' && attribute.relation.toLowerCase().includes('morphTo')) + ) { + return; + } + + if (['relation', 'media', 'component'].includes(type)) { + const attributePath = path.attribute.replaceAll('.', '.populate.'); + console.log('Got a relation', key, attributePath); + Object.assign(populateQuery, set(attributePath, { fields: [] }, populateQuery)); + } else { + const attributePath = path.attribute + .slice(0, path.attribute.lastIndexOf('.')) + .replaceAll('.', '.populate.'); + + if (key !== path.attribute) { + get(attributePath, populateQuery).fields.push(key); + } + } + }, + { schema: strapi.contentType(model) }, + permissionQuery + ); + console.log(JSON.stringify(populateQuery, null, 2)); + + const entity = await entityManager.findOneWithCreatorRolesAndCount(id, model, { + populate: populateQuery, + }); if (!entity) { return ctx.notFound(); } + // if the user has condition that needs populated content, it's not applied because entity don't have relations populated if (permissionChecker.cannot.read(entity)) { return ctx.forbidden(); } diff --git a/packages/core/content-manager/server/services/entity-manager.js b/packages/core/content-manager/server/services/entity-manager.js index 28393bddad..6b3706475b 100644 --- a/packages/core/content-manager/server/services/entity-manager.js +++ b/packages/core/content-manager/server/services/entity-manager.js @@ -125,9 +125,9 @@ module.exports = ({ strapi }) => ({ return this.mapEntitiesResponse(entities, uid); }, - async findOneWithCreatorRolesAndCount(id, uid) { + async findOneWithCreatorRolesAndCount(id, uid, opts = {}) { const counterPopulate = getDeepPopulate(uid, { countMany: true, countOne: true }); - const params = { populate: addCreatedByRolesPopulate(counterPopulate) }; + const params = { populate: addCreatedByRolesPopulate(opts.populate ?? counterPopulate) }; return strapi.entityService .findOne(uid, id, params) diff --git a/packages/core/content-manager/server/services/permission-checker.js b/packages/core/content-manager/server/services/permission-checker.js index 567a1dd4c9..10305ec19a 100644 --- a/packages/core/content-manager/server/services/permission-checker.js +++ b/packages/core/content-manager/server/services/permission-checker.js @@ -75,8 +75,8 @@ const createPermissionChecker = return { // Permission utils - can, - cannot, + can, // check if you have the permission + cannot, // check if you don't have the permission // Sanitizers sanitizeOutput, sanitizeQuery, diff --git a/packages/core/permissions/lib/engine/index.js b/packages/core/permissions/lib/engine/index.js index 1b5fc73d56..cf42c943e7 100644 --- a/packages/core/permissions/lib/engine/index.js +++ b/packages/core/permissions/lib/engine/index.js @@ -104,6 +104,11 @@ module.exports = { ({ result }) => _.isBoolean(result) || _.isObject(result) ); + // conditions: string[] + // resolveConditions: string[] => unknown[] + // removeInvalidConditions: unknown[] => Function[] + // evaluateConditions: Function[] => unknown[] + // removeInvalidResults: unknown[] => (boolean | object)[] const evaluatedConditions = await Promise.resolve(conditions) .then(resolveConditions) .then(removeInvalidConditions) From e5be086429ff468b6b1dcf64a79bf365da12c33a Mon Sep 17 00:00:00 2001 From: Convly Date: Fri, 28 Apr 2023 15:12:01 +0200 Subject: [PATCH 004/172] tmp - condition --- examples/getstarted/src/index.js | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/examples/getstarted/src/index.js b/examples/getstarted/src/index.js index 5abfcc85cf..3df2386e35 100644 --- a/examples/getstarted/src/index.js +++ b/examples/getstarted/src/index.js @@ -7,7 +7,19 @@ module.exports = { * * This gives you an opportunity to extend code. */ - register({ strapi }) {}, + async register({ strapi }) { + await strapi.admin.services.permission.conditionProvider.register({ + displayName: 'Something', + name: 'is-something', + plugin: 'foo', + handler: (user) => ({ + // name: { $ne: 'MARC' }, + // addresses: { notrepeat_req: { name: 'toto' } }, + 'addresses.repeat_req': { $elemMatch: { name: 'toto' } }, + addresses: { $elemMatch: { postal_code: { $eq: '58' } } }, + }), + }); + }, /** * An asynchronous bootstrap function that runs before From e270ec0d9a15fff653d7dbec744d95895bfe5f48 Mon Sep 17 00:00:00 2001 From: Christian Capeans Date: Fri, 12 May 2023 09:31:03 +0200 Subject: [PATCH 005/172] Add more flexibility to controller types --- packages/core/strapi/lib/types/factories.d.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/core/strapi/lib/types/factories.d.ts b/packages/core/strapi/lib/types/factories.d.ts index 64156bbb36..da499d087c 100644 --- a/packages/core/strapi/lib/types/factories.d.ts +++ b/packages/core/strapi/lib/types/factories.d.ts @@ -1,5 +1,5 @@ import { Service, GenericService } from '../core-api/service'; -import { Controller, GenericController } from '../core-api/controller'; +import { CollectionTypeController, Controller, GenericController } from '../core-api/controller'; import { Middleware } from '../middlewares'; import { Policy } from '../core/registries/policies'; import { Strapi } from './core/strapi'; @@ -50,10 +50,10 @@ type ControllerCallback = (para type ServiceCallback = (params: { strapi: Strapi }) => T; export function createCoreRouter(uid: string, cfg?: RouterConfig = {}): () => Router; -export function createCoreController( +export function createCoreController>( uid: string, cfg?: ControllerCallback | T = {} -): () => T & Controller; +): () => Required & Controller; export function createCoreService( uid: string, cfg?: ServiceCallback | T = {} From 6d38d136fd66e5152acb5eca7f7e38325bce16a7 Mon Sep 17 00:00:00 2001 From: Convly Date: Fri, 12 May 2023 15:51:24 +0200 Subject: [PATCH 006/172] Init type system basis --- .../type-system/core/common/controller.d.ts | 8 + .../lib/type-system/core/common/index.d.ts | 5 + .../type-system/core/common/namespace.d.ts | 88 ++++++++++ .../lib/type-system/core/common/registry.d.ts | 59 +++++++ .../lib/type-system/core/common/service.d.ts | 1 + .../lib/type-system/core/common/uid.d.ts | 153 ++++++++++++++++++ .../strapi/lib/type-system/core/index.d.ts | 1 + .../core/strapi/lib/type-system/index.d.ts | 3 + .../core/strapi/lib/type-system/playground.ts | 82 ++++++++++ .../strapi/lib/type-system/shared/index.d.ts | 1 + .../lib/type-system/shared/registries.d.ts | 29 ++++ .../core/strapi/lib/type-system/utils.d.ts | 7 + packages/core/strapi/lib/types/index.d.ts | 3 + 13 files changed, 440 insertions(+) create mode 100644 packages/core/strapi/lib/type-system/core/common/controller.d.ts create mode 100644 packages/core/strapi/lib/type-system/core/common/index.d.ts create mode 100644 packages/core/strapi/lib/type-system/core/common/namespace.d.ts create mode 100644 packages/core/strapi/lib/type-system/core/common/registry.d.ts create mode 100644 packages/core/strapi/lib/type-system/core/common/service.d.ts create mode 100644 packages/core/strapi/lib/type-system/core/common/uid.d.ts create mode 100644 packages/core/strapi/lib/type-system/core/index.d.ts create mode 100644 packages/core/strapi/lib/type-system/index.d.ts create mode 100644 packages/core/strapi/lib/type-system/playground.ts create mode 100644 packages/core/strapi/lib/type-system/shared/index.d.ts create mode 100644 packages/core/strapi/lib/type-system/shared/registries.d.ts create mode 100644 packages/core/strapi/lib/type-system/utils.d.ts diff --git a/packages/core/strapi/lib/type-system/core/common/controller.d.ts b/packages/core/strapi/lib/type-system/core/common/controller.d.ts new file mode 100644 index 0000000000..1e045aafc3 --- /dev/null +++ b/packages/core/strapi/lib/type-system/core/common/controller.d.ts @@ -0,0 +1,8 @@ +import type koa from 'koa'; + +export type ControllerHandler = ( + context: koa.ExtendableContext, + next: koa.Next +) => Promise | void | Promise | unknown; + +export type Controller = Record; diff --git a/packages/core/strapi/lib/type-system/core/common/index.d.ts b/packages/core/strapi/lib/type-system/core/common/index.d.ts new file mode 100644 index 0000000000..4689628ab9 --- /dev/null +++ b/packages/core/strapi/lib/type-system/core/common/index.d.ts @@ -0,0 +1,5 @@ +export * from './controller'; +export * from './service'; +export * from './namespace'; +export * from './uid'; +export * from './registry'; diff --git a/packages/core/strapi/lib/type-system/core/common/namespace.d.ts b/packages/core/strapi/lib/type-system/core/common/namespace.d.ts new file mode 100644 index 0000000000..7c2553e430 --- /dev/null +++ b/packages/core/strapi/lib/type-system/core/common/namespace.d.ts @@ -0,0 +1,88 @@ +import type { AddSuffix, NonEmpty } from '../../utils'; + +/** + * Namespace for admin resources + */ +export type AdminNamespace = 'admin'; + +/** + * Namespace for strapi internal resources + */ +export type StrapiNamespace = 'strapi'; + +/** + * Namespace for scoped APIs resources + */ +export type ApiNamespace = `api::${T}`; + +/** + * Namespace for scoped plugins resources + */ +export type PluginNamespace = `plugin::${T}`; + +/** + * Namespace for global resources + */ +export type GlobalNamespace = 'global'; + +/** + * Represents any namespace + */ +export type Namespace = + | ApiNamespace + | PluginNamespace + | AdminNamespace + | StrapiNamespace + | GlobalNamespace; + +/** + * Return a {@link Separator} based on the given {@link Namespace} ({@link DotSeparator} for {@link ScopedNamespace} and {@link ColonsSeparator} for regular ones) + * + * @example + * type S = GetNamespaceSeparator + * // ^ '::' + * + * type S = GetNamespaceSeparator + * // ^ '.' + * + * type S = GetNamespaceSeparator + * // ^ '.' | '::' + */ +export type GetNamespaceSeparator = T extends ScopedNamespace + ? // 'api::foo' | 'plugin::bar' => '.' + DotSeparator + : // 'admin' | 'strapi' | 'global' => '::' + ColonsSeparator; + +/** + * Adds the corresponding separator (using {@link GetNamespaceSeparator}) at the end of a namespace + * + * Warning: Using WithSeparator with a union type might produce undesired results as it'll distribute every matching suffix to every union members + * + * @example + * type T = WithSeparator + * // ^ 'admin::' + * + * type T = WithSeparator + * // ^ 'api::{string}.' + * + * type T = WithSeparator + * // ^ 'admin::' | 'admin.' | 'api::{string}.' | 'api::{string}::' + * + * type T = WithSeparator | WithSeparator + * // ^ 'admin::' | 'api::{string}.' + */ +export type WithSeparator = AddSuffix>; + +/** + * Represents namespaces composed of an origin and a name, separated by colons + */ +export type ScopedNamespace = `${string}${ColonsSeparator}${string}`; + +/** + * Separators used to join the different parts of a namespace (e.g. building a uid) + */ +export type Separator = ColonsSeparator | DotSeparator; + +type ColonsSeparator = '::'; +type DotSeparator = '.'; diff --git a/packages/core/strapi/lib/type-system/core/common/registry.d.ts b/packages/core/strapi/lib/type-system/core/common/registry.d.ts new file mode 100644 index 0000000000..6bfb1f3628 --- /dev/null +++ b/packages/core/strapi/lib/type-system/core/common/registry.d.ts @@ -0,0 +1,59 @@ +import { UID, ParsedUID, ParseUID } from './uid'; + +/** + * Extract valid keys from a given registry. + * + * It looks for {@link UID} by default but the search can be narrowed to any UID subset using the `U` generic. + * + * @example + * interface Registry { + * 'foo': unknown; + * 'default.foo': 'unknown'; + * 'global::foo': unknown; + * 'api::foo.bar': unknown; + * } + * + * type T = RegistryKeysBy; + * // ^ 'default.foo' | 'global::foo' | 'api::foo.bar' + * type T = RegistryKeysBy; + * // ^ 'global::foo' | 'api::foo.bar' + * type T = RegistryKeysBy + * // ^ 'api::foo.bar' + */ +export type RegistryKeysBy = Extract; + +/** + * Performs a `Q` filtering operation on the given `T` registry. + * + * `Q` needs to be a partial representation of a {@link ParsedUID} + * + * Note: For additional filtering, the registry keys' type can be passed as the third generic. + * + * @example + * interface Registry { + * 'admin::foo': unknown; + * 'admin::bar': unknown; + * 'api::foo.bar': unknown; + * 'api::foo.baz': unknown; + * 'api::bar.foo': unknown; + * 'plugin::foo.bar': unknown; + * } + * + * type T = keyof Query; + * // ^ "api::foo.bar" | "api::foo.baz" | "api::bar.foo" + * + * type T = keyof Query; + * // ^ "admin::bar" | "api::foo.bar" | "plugin::foo.bar" + * + * type T = keyof Query; + * // ^ "api::foo.bar" | "api::foo.baz" | "api::bar.foo" | 'plugin::foo.bar" + * + * type T = keyof Query; + * // ^ "plugin::foo.bar" | "admin::foo" | "admin::bar" + * + * type T = keyof Query }>; + * // ^ "api::foo.bar" | "api::foo.baz" + */ +export type RegistryQuery, U extends UID = UID> = { + [uid in RegistryKeysBy as ParseUID extends Q ? uid : never]: T[uid]; +}; diff --git a/packages/core/strapi/lib/type-system/core/common/service.d.ts b/packages/core/strapi/lib/type-system/core/common/service.d.ts new file mode 100644 index 0000000000..88cc9a9a5a --- /dev/null +++ b/packages/core/strapi/lib/type-system/core/common/service.d.ts @@ -0,0 +1 @@ +export type Service = Record; diff --git a/packages/core/strapi/lib/type-system/core/common/uid.d.ts b/packages/core/strapi/lib/type-system/core/common/uid.d.ts new file mode 100644 index 0000000000..4c00ccd9f4 --- /dev/null +++ b/packages/core/strapi/lib/type-system/core/common/uid.d.ts @@ -0,0 +1,153 @@ +import type { + AdminNamespace, + ApiNamespace, + WithSeparator, + PluginNamespace, + StrapiNamespace, + GetNamespaceSeparator, + Namespace, + Separator, + GlobalNamespace, +} from './namespace'; +import type { AddSuffix, Literal } from '../../utils'; + +type AddStringSuffix = AddSuffix; + +/** + * Template for services' unique identifier + */ +export type BaseServiceUID = AddStringSuffix< + WithSeparator | WithSeparator | WithSeparator +>; + +/** + * Template for controllers' unique identifier + */ +export type BaseControllerUID = AddStringSuffix< + WithSeparator | WithSeparator | WithSeparator +>; + +/** + * Template for policies' unique identifier + */ +export type BasePolicyUID = AddStringSuffix< + | WithSeparator + | WithSeparator + | WithSeparator + | WithSeparator + | WithSeparator +>; + +/** + * Template for middlewares' unique identifier + */ +export type BaseMiddlewareUID = AddStringSuffix< + | WithSeparator + | WithSeparator + | WithSeparator + | WithSeparator + | WithSeparator +>; + +/** + * Template for content-types' unique identifier + */ +export type BaseContentTypeUID = AddStringSuffix< + | WithSeparator + | WithSeparator + | WithSeparator + | WithSeparator +>; + +/** + * Template for components' unique identifier + * + * Warning: Can cause overlap with other UID formats. + */ +export type BaseComponentUID = `${string}.${string}`; + +/** + * Represents any UID + */ +export type UID = + | BaseServiceUID + | BaseControllerUID + | BasePolicyUID + | BaseMiddlewareUID + | BaseContentTypeUID + | BaseComponentUID; + +/** + * Type representation of every UID component. + * + * The separator type is automatically inferred from the given namespace + */ +export interface ParsedUID { + namespace: N; + separator: GetNamespaceSeparator; + name: E; + raw: `${N}${GetNamespaceSeparator}${E}`; +} + +/** + * Parse an UID literal and returns a {@link ParsedUID} type. + * + * Warning: Using ParseUID with a union type might produce undesired results as it'll distribute every matching namespace parsing to every union members + * + * @example + * type T = ParseUID<'admin::foo'> + * // ^ { namespace: 'admin'; separator: '::'; name: 'foo'; } + * + * type T = ParseUID<'api::foo.bar'> + * // ^ { namespace: 'api::foo'; separator: '.'; name: 'bar'; } + * + * type T = ParseUID<'admin::foo' | 'api::foo.bar'> + * // ^ { namespace: 'admin' | 'api::foo' ; separator: '.' | '::'; name: 'foo' | 'bar' | 'foo.bar'; } + */ +export type ParseUID = ResolveUIDNamespace extends infer B extends Namespace + ? GetNamespaceSeparator extends infer S extends Separator + ? U extends `${infer N extends B}${S}${infer E extends string}` + ? ParsedUID + : never + : never + : never; + +/** + * Determines if the UID's namespace matches the given one. + * + * It returns N (the {@link Namespace} literal) if there is a match, never otherwise. + * + * @example + * type T = AssertUIDNamespace<'admin::foo', AdminNamespace> + * // ^ AdminNamespace + * @example + * type T = AssertUIDNamespace<'foo.bar', ApiNamespace> + * // ^ never + * @example + * type T = AssertUIDNamespace<'api::foo.bar', PluginNamespace> + * // ^ never + */ +export type AssertUIDNamespace = U extends AddStringSuffix< + WithSeparator +> + ? N + : never; + +/** + * Extract the namespace literal from a given UID. + * + * @example + * type T = ResolveUIDNamespace<'admin::foo'> + * // ^ AdminNamespace + * @example + * type T = ResolveUIDNamespace<'api::foo.bar'> + * // ^ ApiNamespace + * @example + * type T = ResolveUIDNamespace<'admin::foo' | 'api::foo.bar'> + * // ^ AdminNamespace | ApiNamespace + */ +export type ResolveUIDNamespace = + | AssertUIDNamespace + | AssertUIDNamespace + | AssertUIDNamespace + | AssertUIDNamespace; diff --git a/packages/core/strapi/lib/type-system/core/index.d.ts b/packages/core/strapi/lib/type-system/core/index.d.ts new file mode 100644 index 0000000000..d0b9323665 --- /dev/null +++ b/packages/core/strapi/lib/type-system/core/index.d.ts @@ -0,0 +1 @@ +export * from './common'; diff --git a/packages/core/strapi/lib/type-system/index.d.ts b/packages/core/strapi/lib/type-system/index.d.ts new file mode 100644 index 0000000000..9c61c6034d --- /dev/null +++ b/packages/core/strapi/lib/type-system/index.d.ts @@ -0,0 +1,3 @@ +export * as core from './core'; +export * as shared from './shared'; +export * as utils from './utils'; diff --git a/packages/core/strapi/lib/type-system/playground.ts b/packages/core/strapi/lib/type-system/playground.ts new file mode 100644 index 0000000000..80a452f416 --- /dev/null +++ b/packages/core/strapi/lib/type-system/playground.ts @@ -0,0 +1,82 @@ +import { shared } from '.'; +import { AdminNamespace, ApiNamespace, ParseUID, RegistryKeysBy, RegistryQuery } from './core'; + +declare module '@strapi/strapi' { + export module shared { + export interface Services { + 'api::foo.bar': { + foo: () => {}; + }; + 'api::foo.baz': { + baz: () => {}; + }; + 'api::bar.foo': { + fn(): number; + }; + 'api::bar.baz': { + fn2(): number; + }; + 'strapi::bar': { + method(): string; + }; + 'foo::bar': {}; + 'plugin::bar.foo': {}; + 'admin::permissions': {}; + 'admin::user': { + create(): void; + delete(): Promise; + }; + } + } +} + +type AdminServices = RemoveNamespace>; + +type RemoveNamespace = { [uid in RegistryKeysBy as ParseUID['name']]: T[uid] }; + +declare const adminServices: AdminServices; + +type FooServices = RemoveNamespace< + RegistryQuery }> +>; +declare const fooServices: FooServices; + +type ParseAPI = RegistryQuery< + T, + { namespace: ApiNamespace } +> extends infer S + ? { + [uid in RegistryKeysBy as ParseUID['name']]: S[uid]; + } + : never; + +// declare const services: BuildRegistryTree; +// services.bar.foo(); +// services.baz.baz(); + +type MapParse = { [uid in RegistryKeysBy]: ParseUID }; + +// // Pick uid:value pairs based on the given query (following the ParsedUID format) +// type PickByQuery> = { +// [uid in RegistryKeysBy as ParseUID extends Q ? uid : never]: T[uid]; +// }; + +// type GroupByApiName = { +// [name in A]: PickByQuery extends infer G +// ? { [uid in RegistryKeysBy as ParseUID['name']]: G[uid] } +// : never; +// }; + +// interface API { +// services: PickByQuery; +// } + +// type TrimNamespaces = { [uid in RegistryKeysBy as ParseUID['name']]: T[uid] }; + +// type P = { [uid in RegistryKeysBy]: ParseUID }; +// type AdminServices = TrimNamespaces>; +// declare const adminServices: AdminServices; + +// // Extract internal service for the main Services registry (uid -> service) +// type InternalServices = PickByQuery; +// const internalServices = {} as InternalServices; diff --git a/packages/core/strapi/lib/type-system/shared/index.d.ts b/packages/core/strapi/lib/type-system/shared/index.d.ts new file mode 100644 index 0000000000..62ba4caa69 --- /dev/null +++ b/packages/core/strapi/lib/type-system/shared/index.d.ts @@ -0,0 +1 @@ +export * from './registries'; diff --git a/packages/core/strapi/lib/type-system/shared/registries.d.ts b/packages/core/strapi/lib/type-system/shared/registries.d.ts new file mode 100644 index 0000000000..0a0301d6b6 --- /dev/null +++ b/packages/core/strapi/lib/type-system/shared/registries.d.ts @@ -0,0 +1,29 @@ +/** + * Shared service registry + */ +export interface Services {} + +/** + * Shared controller registry + */ +export interface Controllers {} + +/** + * Shared policy registry + */ +export interface Policies {} + +/** + * Shared middleware registry + */ +export interface Middlewares {} + +/** + * Shared content-types registry + */ +export interface ContentTypes {} + +/** + * Shared component registry + */ +export interface Components {} diff --git a/packages/core/strapi/lib/type-system/utils.d.ts b/packages/core/strapi/lib/type-system/utils.d.ts new file mode 100644 index 0000000000..2bf51c314d --- /dev/null +++ b/packages/core/strapi/lib/type-system/utils.d.ts @@ -0,0 +1,7 @@ +export type Literal = string | number | bigint | boolean; + +export type Contains = `${string}${S}${string}`; +export type NonEmpty = T extends '' ? never : T; + +export type AddSuffix = `${T}${S}`; +export type AddPrefix = `${S}${T}`; diff --git a/packages/core/strapi/lib/types/index.d.ts b/packages/core/strapi/lib/types/index.d.ts index ada06e2723..322c1f4703 100644 --- a/packages/core/strapi/lib/types/index.d.ts +++ b/packages/core/strapi/lib/types/index.d.ts @@ -2,3 +2,6 @@ export * from './core'; export * as utils from './utils'; export * as factories from './factories'; + +export * as registries from './registry'; +export * as shared from '../type-system/shared'; From f3cde5d6dc9515ae4d4efb0c2ff3de8f5f522a6b Mon Sep 17 00:00:00 2001 From: Christian Capeans Date: Mon, 15 May 2023 09:57:39 +0200 Subject: [PATCH 007/172] =?UTF-8?q?Co-authored-by:=20Jean-S=C3=A9bastien?= =?UTF-8?q?=20Herbaux=20=20Co-authored-by?= =?UTF-8?q?:=20Simone=20=20Improve=20types=20for?= =?UTF-8?q?=20controllers=20and=20services?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../strapi/lib/core-api/controller/index.d.ts | 2 +- packages/core/strapi/lib/types/factories.d.ts | 43 ++++++++++++++----- 2 files changed, 34 insertions(+), 11 deletions(-) diff --git a/packages/core/strapi/lib/core-api/controller/index.d.ts b/packages/core/strapi/lib/core-api/controller/index.d.ts index 62ece69d2d..3f0eb84aa9 100644 --- a/packages/core/strapi/lib/core-api/controller/index.d.ts +++ b/packages/core/strapi/lib/core-api/controller/index.d.ts @@ -23,5 +23,5 @@ export interface CollectionTypeController extends Controller { } export type GenericController = Partial & { - [method: string | number | symbol]: (ctx: Context) => unknown; + [method: string | number | symbol]: (ctx: Context, next: Next) => unknown; }; diff --git a/packages/core/strapi/lib/types/factories.d.ts b/packages/core/strapi/lib/types/factories.d.ts index da499d087c..83786db952 100644 --- a/packages/core/strapi/lib/types/factories.d.ts +++ b/packages/core/strapi/lib/types/factories.d.ts @@ -1,8 +1,20 @@ -import { Service, GenericService } from '../core-api/service'; -import { CollectionTypeController, Controller, GenericController } from '../core-api/controller'; +import { + Service, + GenericService, + CollectionTypeService, + SingleTypeService, +} from '../core-api/service'; +import { + CollectionTypeController, + SingleTypeController, + Controller, + GenericController, +} from '../core-api/controller'; import { Middleware } from '../middlewares'; import { Policy } from '../core/registries/policies'; import { Strapi } from './core/strapi'; +import { SchemaUID } from './utils'; +import { GenericService } from '../core-api/service/index'; type ControllerConfig = T; @@ -50,11 +62,22 @@ type ControllerCallback = (para type ServiceCallback = (params: { strapi: Strapi }) => T; export function createCoreRouter(uid: string, cfg?: RouterConfig = {}): () => Router; -export function createCoreController>( - uid: string, - cfg?: ControllerCallback | T = {} -): () => Required & Controller; -export function createCoreService( - uid: string, - cfg?: ServiceCallback | T = {} -): () => T; + +export function createCoreController< + T extends SchemaUID, + S extends Partial> +>(uid: T, cfg?: ControllerCallback | S): () => Required>; + +export function createCoreService>>( + uid: T, + cfg?: ServiceCallback | S +): () => Required>; + +type GetBaseSchemaController = + Strapi.Schemas[T]['kind'] extends 'collectionType' + ? CollectionTypeController & GenericController + : SingleTypeController & GenericController; + +type GetBaseSchemaService = Strapi.Schemas[T]['kind'] extends 'collectionType' + ? CollectionTypeService & GenericService + : SingleTypeService & GenericService; From 6be11d9836b74a78ead8eb3153595d8ee0b48b49 Mon Sep 17 00:00:00 2001 From: Christian Capeans Date: Mon, 15 May 2023 12:28:57 +0200 Subject: [PATCH 008/172] Update types for router --- packages/core/strapi/lib/types/factories.d.ts | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/packages/core/strapi/lib/types/factories.d.ts b/packages/core/strapi/lib/types/factories.d.ts index 83786db952..327fb513d7 100644 --- a/packages/core/strapi/lib/types/factories.d.ts +++ b/packages/core/strapi/lib/types/factories.d.ts @@ -40,11 +40,11 @@ type CollectionTypeRouterConfig = { delete?: HandlerConfig; }; -type RouterConfig = { +type RouterConfig = { prefix?: string; - only?: string[]; - except?: string[]; - config: SingleTypeRouterConfig | CollectionTypeRouterConfig; + only?: Array; + except?: Array; + config: T; }; interface Route { @@ -61,12 +61,18 @@ type ControllerCallback = (para }) => T; type ServiceCallback = (params: { strapi: Strapi }) => T; -export function createCoreRouter(uid: string, cfg?: RouterConfig = {}): () => Router; +export function createCoreRouter( + uid: T, + cfg?: RouterConfig> = {} +): () => Router; export function createCoreController< T extends SchemaUID, S extends Partial> ->(uid: T, cfg?: ControllerCallback | S): () => Required>; +>( + uid: T, + cfg?: ControllerCallback | S +): () => Required>>; export function createCoreService>>( uid: T, @@ -81,3 +87,7 @@ type GetBaseSchemaController = type GetBaseSchemaService = Strapi.Schemas[T]['kind'] extends 'collectionType' ? CollectionTypeService & GenericService : SingleTypeService & GenericService; + +type GetBaseConfig = Strapi.Schemas[T]['kind'] extends 'collectionType' + ? CollectionTypeRouterConfig + : SingleTypeRouterConfig; From 204114d44e35c9b8a1dd83a0476e291d5da71209 Mon Sep 17 00:00:00 2001 From: Christian Capeans Date: Mon, 15 May 2023 12:38:32 +0200 Subject: [PATCH 009/172] Fix services typings --- .../strapi/lib/core-api/service/index.d.ts | 4 +-- packages/core/strapi/lib/types/factories.d.ts | 29 ++++++++++++------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/packages/core/strapi/lib/core-api/service/index.d.ts b/packages/core/strapi/lib/core-api/service/index.d.ts index a507857b71..0dcd982ca8 100644 --- a/packages/core/strapi/lib/core-api/service/index.d.ts +++ b/packages/core/strapi/lib/core-api/service/index.d.ts @@ -18,8 +18,6 @@ export interface CollectionTypeService extends BaseService { delete?(entityId: string, params: object): Promise | Entity; } -export type Service = SingleTypeService | CollectionTypeService; - -export type GenericService = Partial & { +export type GenericService = { [method: string | number | symbol]: (...args: any) => any; }; diff --git a/packages/core/strapi/lib/types/factories.d.ts b/packages/core/strapi/lib/types/factories.d.ts index 327fb513d7..46f89dd4eb 100644 --- a/packages/core/strapi/lib/types/factories.d.ts +++ b/packages/core/strapi/lib/types/factories.d.ts @@ -79,15 +79,24 @@ export function createCoreService | S ): () => Required>; -type GetBaseSchemaController = - Strapi.Schemas[T]['kind'] extends 'collectionType' - ? CollectionTypeController & GenericController - : SingleTypeController & GenericController; +type GetBaseSchemaController = IsCollectionType< + T, + CollectionTypeController, + SingleTypeController +> & + GenericController; -type GetBaseSchemaService = Strapi.Schemas[T]['kind'] extends 'collectionType' - ? CollectionTypeService & GenericService - : SingleTypeService & GenericService; +type GetBaseSchemaService = IsCollectionType< + T, + CollectionTypeService, + SingleTypeService +> & + GenericService; -type GetBaseConfig = Strapi.Schemas[T]['kind'] extends 'collectionType' - ? CollectionTypeRouterConfig - : SingleTypeRouterConfig; +type GetBaseConfig = IsCollectionType< + T, + CollectionTypeRouterConfig, + SingleTypeRouterConfig +>; + +type IsCollectionType = Strapi.Schemas[T]['kind'] extends 'collectionType' ? Y : N; From 094aa4043c0785b762b33e891ab192f02a7901df Mon Sep 17 00:00:00 2001 From: Convly Date: Mon, 15 May 2023 14:33:50 +0200 Subject: [PATCH 010/172] Implement the type system from within strapi/strapi --- .../strapi/lib/type-system/core/index.d.ts | 1 - .../core/strapi/lib/type-system/index.d.ts | 3 - .../core/strapi/lib/type-system/playground.ts | 82 ------------------- .../core/strapi/lib/type-system/utils.d.ts | 7 -- .../core/common/controller.d.ts | 0 .../core/common/index.d.ts | 0 .../core/common/namespace.d.ts | 17 +++- .../core/common/registry.d.ts | 10 +-- .../core/common/service.d.ts | 0 .../core/common/uid.d.ts | 14 +++- .../core/strapi/lib/types/core/index.d.ts | 1 + packages/core/strapi/lib/types/index.d.ts | 2 +- .../{type-system => types}/shared/index.d.ts | 0 .../shared/registries.d.ts | 0 packages/core/strapi/lib/types/utils.d.ts | 23 ++++++ 15 files changed, 58 insertions(+), 102 deletions(-) delete mode 100644 packages/core/strapi/lib/type-system/core/index.d.ts delete mode 100644 packages/core/strapi/lib/type-system/index.d.ts delete mode 100644 packages/core/strapi/lib/type-system/playground.ts delete mode 100644 packages/core/strapi/lib/type-system/utils.d.ts rename packages/core/strapi/lib/{type-system => types}/core/common/controller.d.ts (100%) rename packages/core/strapi/lib/{type-system => types}/core/common/index.d.ts (100%) rename packages/core/strapi/lib/{type-system => types}/core/common/namespace.d.ts (83%) rename packages/core/strapi/lib/{type-system => types}/core/common/registry.d.ts (81%) rename packages/core/strapi/lib/{type-system => types}/core/common/service.d.ts (100%) rename packages/core/strapi/lib/{type-system => types}/core/common/uid.d.ts (91%) rename packages/core/strapi/lib/{type-system => types}/shared/index.d.ts (100%) rename packages/core/strapi/lib/{type-system => types}/shared/registries.d.ts (100%) diff --git a/packages/core/strapi/lib/type-system/core/index.d.ts b/packages/core/strapi/lib/type-system/core/index.d.ts deleted file mode 100644 index d0b9323665..0000000000 --- a/packages/core/strapi/lib/type-system/core/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './common'; diff --git a/packages/core/strapi/lib/type-system/index.d.ts b/packages/core/strapi/lib/type-system/index.d.ts deleted file mode 100644 index 9c61c6034d..0000000000 --- a/packages/core/strapi/lib/type-system/index.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * as core from './core'; -export * as shared from './shared'; -export * as utils from './utils'; diff --git a/packages/core/strapi/lib/type-system/playground.ts b/packages/core/strapi/lib/type-system/playground.ts deleted file mode 100644 index 80a452f416..0000000000 --- a/packages/core/strapi/lib/type-system/playground.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { shared } from '.'; -import { AdminNamespace, ApiNamespace, ParseUID, RegistryKeysBy, RegistryQuery } from './core'; - -declare module '@strapi/strapi' { - export module shared { - export interface Services { - 'api::foo.bar': { - foo: () => {}; - }; - 'api::foo.baz': { - baz: () => {}; - }; - 'api::bar.foo': { - fn(): number; - }; - 'api::bar.baz': { - fn2(): number; - }; - 'strapi::bar': { - method(): string; - }; - 'foo::bar': {}; - 'plugin::bar.foo': {}; - 'admin::permissions': {}; - 'admin::user': { - create(): void; - delete(): Promise; - }; - } - } -} - -type AdminServices = RemoveNamespace>; - -type RemoveNamespace = { [uid in RegistryKeysBy as ParseUID['name']]: T[uid] }; - -declare const adminServices: AdminServices; - -type FooServices = RemoveNamespace< - RegistryQuery }> ->; -declare const fooServices: FooServices; - -type ParseAPI = RegistryQuery< - T, - { namespace: ApiNamespace } -> extends infer S - ? { - [uid in RegistryKeysBy as ParseUID['name']]: S[uid]; - } - : never; - -// declare const services: BuildRegistryTree; -// services.bar.foo(); -// services.baz.baz(); - -type MapParse = { [uid in RegistryKeysBy]: ParseUID }; - -// // Pick uid:value pairs based on the given query (following the ParsedUID format) -// type PickByQuery> = { -// [uid in RegistryKeysBy as ParseUID extends Q ? uid : never]: T[uid]; -// }; - -// type GroupByApiName = { -// [name in A]: PickByQuery extends infer G -// ? { [uid in RegistryKeysBy as ParseUID['name']]: G[uid] } -// : never; -// }; - -// interface API { -// services: PickByQuery; -// } - -// type TrimNamespaces = { [uid in RegistryKeysBy as ParseUID['name']]: T[uid] }; - -// type P = { [uid in RegistryKeysBy]: ParseUID }; -// type AdminServices = TrimNamespaces>; -// declare const adminServices: AdminServices; - -// // Extract internal service for the main Services registry (uid -> service) -// type InternalServices = PickByQuery; -// const internalServices = {} as InternalServices; diff --git a/packages/core/strapi/lib/type-system/utils.d.ts b/packages/core/strapi/lib/type-system/utils.d.ts deleted file mode 100644 index 2bf51c314d..0000000000 --- a/packages/core/strapi/lib/type-system/utils.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -export type Literal = string | number | bigint | boolean; - -export type Contains = `${string}${S}${string}`; -export type NonEmpty = T extends '' ? never : T; - -export type AddSuffix = `${T}${S}`; -export type AddPrefix = `${S}${T}`; diff --git a/packages/core/strapi/lib/type-system/core/common/controller.d.ts b/packages/core/strapi/lib/types/core/common/controller.d.ts similarity index 100% rename from packages/core/strapi/lib/type-system/core/common/controller.d.ts rename to packages/core/strapi/lib/types/core/common/controller.d.ts diff --git a/packages/core/strapi/lib/type-system/core/common/index.d.ts b/packages/core/strapi/lib/types/core/common/index.d.ts similarity index 100% rename from packages/core/strapi/lib/type-system/core/common/index.d.ts rename to packages/core/strapi/lib/types/core/common/index.d.ts diff --git a/packages/core/strapi/lib/type-system/core/common/namespace.d.ts b/packages/core/strapi/lib/types/core/common/namespace.d.ts similarity index 83% rename from packages/core/strapi/lib/type-system/core/common/namespace.d.ts rename to packages/core/strapi/lib/types/core/common/namespace.d.ts index 7c2553e430..975275c77a 100644 --- a/packages/core/strapi/lib/type-system/core/common/namespace.d.ts +++ b/packages/core/strapi/lib/types/core/common/namespace.d.ts @@ -77,7 +77,22 @@ export type WithSeparator = AddSuffix = Namespace & + `${O}${ColonsSeparator}${S}`; + +/** + * Extract the scope from the given scoped namespace + */ +export type ExtractNamespaceScope = T extends `${string}${ColonsSeparator}${infer S}` + ? S + : never; + +/** + * Extract the origin from the given scoped namespace + */ +export type ExtractNamespaceOrigin = T extends `${infer S}${ColonsSeparator}${string}` + ? S + : never; /** * Separators used to join the different parts of a namespace (e.g. building a uid) diff --git a/packages/core/strapi/lib/type-system/core/common/registry.d.ts b/packages/core/strapi/lib/types/core/common/registry.d.ts similarity index 81% rename from packages/core/strapi/lib/type-system/core/common/registry.d.ts rename to packages/core/strapi/lib/types/core/common/registry.d.ts index 6bfb1f3628..8b4f10cbcc 100644 --- a/packages/core/strapi/lib/type-system/core/common/registry.d.ts +++ b/packages/core/strapi/lib/types/core/common/registry.d.ts @@ -39,19 +39,19 @@ export type RegistryKeysBy = Extract; * 'plugin::foo.bar': unknown; * } * - * type T = keyof Query; + * type T = keyof RegistryQuery; * // ^ "api::foo.bar" | "api::foo.baz" | "api::bar.foo" * - * type T = keyof Query; + * type T = keyof RegistryQuery; * // ^ "admin::bar" | "api::foo.bar" | "plugin::foo.bar" * - * type T = keyof Query; + * type T = keyof RegistryQuery; * // ^ "api::foo.bar" | "api::foo.baz" | "api::bar.foo" | 'plugin::foo.bar" * - * type T = keyof Query; + * type T = keyof RegistryQuery; * // ^ "plugin::foo.bar" | "admin::foo" | "admin::bar" * - * type T = keyof Query }>; + * type T = keyof RegistryQuery }>; * // ^ "api::foo.bar" | "api::foo.baz" */ export type RegistryQuery, U extends UID = UID> = { diff --git a/packages/core/strapi/lib/type-system/core/common/service.d.ts b/packages/core/strapi/lib/types/core/common/service.d.ts similarity index 100% rename from packages/core/strapi/lib/type-system/core/common/service.d.ts rename to packages/core/strapi/lib/types/core/common/service.d.ts diff --git a/packages/core/strapi/lib/type-system/core/common/uid.d.ts b/packages/core/strapi/lib/types/core/common/uid.d.ts similarity index 91% rename from packages/core/strapi/lib/type-system/core/common/uid.d.ts rename to packages/core/strapi/lib/types/core/common/uid.d.ts index 4c00ccd9f4..b9ad57483c 100644 --- a/packages/core/strapi/lib/type-system/core/common/uid.d.ts +++ b/packages/core/strapi/lib/types/core/common/uid.d.ts @@ -8,8 +8,11 @@ import type { Namespace, Separator, GlobalNamespace, + ScopedNamespace, + ExtractNamespaceScope, + ExtractNamespaceOrigin, } from './namespace'; -import type { AddSuffix, Literal } from '../../utils'; +import type { AddSuffix } from '../../utils'; type AddStringSuffix = AddSuffix; @@ -83,10 +86,12 @@ export type UID = * The separator type is automatically inferred from the given namespace */ export interface ParsedUID { + raw: `${N}${GetNamespaceSeparator}${E}`; namespace: N; + origin: N extends ScopedNamespace ? ExtractNamespaceOrigin : N; + scope: N extends ScopedNamespace ? ExtractNamespaceScope : never; separator: GetNamespaceSeparator; name: E; - raw: `${N}${GetNamespaceSeparator}${E}`; } /** @@ -133,6 +138,11 @@ export type AssertUIDNamespace = U extends A ? N : never; +/** + * Get parsed properties from a given raw UID + */ +export type ExtractFromUID = ParseUID[P]; + /** * Extract the namespace literal from a given UID. * diff --git a/packages/core/strapi/lib/types/core/index.d.ts b/packages/core/strapi/lib/types/core/index.d.ts index e9c0460970..4979b8495a 100644 --- a/packages/core/strapi/lib/types/core/index.d.ts +++ b/packages/core/strapi/lib/types/core/index.d.ts @@ -1,3 +1,4 @@ export * from './attributes'; export * from './schemas'; export * from './strapi'; +export * from './common'; diff --git a/packages/core/strapi/lib/types/index.d.ts b/packages/core/strapi/lib/types/index.d.ts index 322c1f4703..5aaa05be63 100644 --- a/packages/core/strapi/lib/types/index.d.ts +++ b/packages/core/strapi/lib/types/index.d.ts @@ -4,4 +4,4 @@ export * as utils from './utils'; export * as factories from './factories'; export * as registries from './registry'; -export * as shared from '../type-system/shared'; +export * as shared from './shared'; diff --git a/packages/core/strapi/lib/type-system/shared/index.d.ts b/packages/core/strapi/lib/types/shared/index.d.ts similarity index 100% rename from packages/core/strapi/lib/type-system/shared/index.d.ts rename to packages/core/strapi/lib/types/shared/index.d.ts diff --git a/packages/core/strapi/lib/type-system/shared/registries.d.ts b/packages/core/strapi/lib/types/shared/registries.d.ts similarity index 100% rename from packages/core/strapi/lib/type-system/shared/registries.d.ts rename to packages/core/strapi/lib/types/shared/registries.d.ts diff --git a/packages/core/strapi/lib/types/utils.d.ts b/packages/core/strapi/lib/types/utils.d.ts index b1360c377b..c5430474e4 100644 --- a/packages/core/strapi/lib/types/utils.d.ts +++ b/packages/core/strapi/lib/types/utils.d.ts @@ -4,6 +4,29 @@ * * */ +export type Literal = string | number | bigint | boolean; + +export type Contains = `${string}${S}${string}`; +export type NonEmpty = T extends '' ? never : T; + +export type Split = T extends `${infer A}${S}${infer B}` + ? [A, ...Split] + : T extends '' + ? [] + : [T]; + +export type Join = T extends [ + infer F extends Literal, + ...infer R +] + ? R['length'] extends 0 + ? F + : `${F}${S}${Join}` + : never; + +export type AddSuffix = `${T}${S}`; +export type AddPrefix = `${S}${T}`; + /** * * Extract the array values into an union type From a58b981f308e1d0a4b3b573ec3e6830976b83c22 Mon Sep 17 00:00:00 2001 From: Convly Date: Mon, 15 May 2023 15:09:36 +0200 Subject: [PATCH 011/172] Add missing assert test for the global namespace --- packages/core/strapi/lib/types/core/common/uid.d.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/core/strapi/lib/types/core/common/uid.d.ts b/packages/core/strapi/lib/types/core/common/uid.d.ts index b9ad57483c..6b0cbea9ad 100644 --- a/packages/core/strapi/lib/types/core/common/uid.d.ts +++ b/packages/core/strapi/lib/types/core/common/uid.d.ts @@ -160,4 +160,5 @@ export type ResolveUIDNamespace = | AssertUIDNamespace | AssertUIDNamespace | AssertUIDNamespace - | AssertUIDNamespace; + | AssertUIDNamespace + | AssertUIDNamespace; From cbab9313b1ce48bd47a448167cc4c7d98291272c Mon Sep 17 00:00:00 2001 From: Convly Date: Mon, 15 May 2023 15:10:34 +0200 Subject: [PATCH 012/172] Remove invalid import --- packages/core/strapi/lib/types/index.d.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/core/strapi/lib/types/index.d.ts b/packages/core/strapi/lib/types/index.d.ts index 5aaa05be63..540ddd64db 100644 --- a/packages/core/strapi/lib/types/index.d.ts +++ b/packages/core/strapi/lib/types/index.d.ts @@ -3,5 +3,4 @@ export * from './core'; export * as utils from './utils'; export * as factories from './factories'; -export * as registries from './registry'; export * as shared from './shared'; From 44b15c6aa1a08b1dc38c3e2b52aa397be33e6b74 Mon Sep 17 00:00:00 2001 From: Convly Date: Mon, 15 May 2023 15:14:29 +0200 Subject: [PATCH 013/172] Add comments & rename some utilities --- .../lib/types/core/common/namespace.d.ts | 4 +-- .../strapi/lib/types/core/common/uid.d.ts | 16 +++++------ packages/core/strapi/lib/types/utils.d.ts | 27 +++++++++++++++++-- 3 files changed, 35 insertions(+), 12 deletions(-) diff --git a/packages/core/strapi/lib/types/core/common/namespace.d.ts b/packages/core/strapi/lib/types/core/common/namespace.d.ts index 975275c77a..b31d679564 100644 --- a/packages/core/strapi/lib/types/core/common/namespace.d.ts +++ b/packages/core/strapi/lib/types/core/common/namespace.d.ts @@ -1,4 +1,4 @@ -import type { AddSuffix, NonEmpty } from '../../utils'; +import type { Suffix, NonEmpty } from '../../utils'; /** * Namespace for admin resources @@ -72,7 +72,7 @@ export type GetNamespaceSeparator = T extends S * type T = WithSeparator | WithSeparator * // ^ 'admin::' | 'api::{string}.' */ -export type WithSeparator = AddSuffix>; +export type WithSeparator = Suffix>; /** * Represents namespaces composed of an origin and a name, separated by colons diff --git a/packages/core/strapi/lib/types/core/common/uid.d.ts b/packages/core/strapi/lib/types/core/common/uid.d.ts index 6b0cbea9ad..66295e7af0 100644 --- a/packages/core/strapi/lib/types/core/common/uid.d.ts +++ b/packages/core/strapi/lib/types/core/common/uid.d.ts @@ -12,28 +12,28 @@ import type { ExtractNamespaceScope, ExtractNamespaceOrigin, } from './namespace'; -import type { AddSuffix } from '../../utils'; +import type { Suffix } from '../../utils'; -type AddStringSuffix = AddSuffix; +type StringSuffix = Suffix; /** * Template for services' unique identifier */ -export type BaseServiceUID = AddStringSuffix< +export type BaseServiceUID = StringSuffix< WithSeparator | WithSeparator | WithSeparator >; /** * Template for controllers' unique identifier */ -export type BaseControllerUID = AddStringSuffix< +export type BaseControllerUID = StringSuffix< WithSeparator | WithSeparator | WithSeparator >; /** * Template for policies' unique identifier */ -export type BasePolicyUID = AddStringSuffix< +export type BasePolicyUID = StringSuffix< | WithSeparator | WithSeparator | WithSeparator @@ -44,7 +44,7 @@ export type BasePolicyUID = AddStringSuffix< /** * Template for middlewares' unique identifier */ -export type BaseMiddlewareUID = AddStringSuffix< +export type BaseMiddlewareUID = StringSuffix< | WithSeparator | WithSeparator | WithSeparator @@ -55,7 +55,7 @@ export type BaseMiddlewareUID = AddStringSuffix< /** * Template for content-types' unique identifier */ -export type BaseContentTypeUID = AddStringSuffix< +export type BaseContentTypeUID = StringSuffix< | WithSeparator | WithSeparator | WithSeparator @@ -132,7 +132,7 @@ export type ParseUID = ResolveUIDNamespace extends infer B ext * type T = AssertUIDNamespace<'api::foo.bar', PluginNamespace> * // ^ never */ -export type AssertUIDNamespace = U extends AddStringSuffix< +export type AssertUIDNamespace = U extends StringSuffix< WithSeparator > ? N diff --git a/packages/core/strapi/lib/types/utils.d.ts b/packages/core/strapi/lib/types/utils.d.ts index c5430474e4..10f2534bd5 100644 --- a/packages/core/strapi/lib/types/utils.d.ts +++ b/packages/core/strapi/lib/types/utils.d.ts @@ -4,17 +4,33 @@ * * */ +/** + * Alias for any literal type (useful for template string parameters) + */ export type Literal = string | number | bigint | boolean; +/** + * Used to check if a string contains a given literal + */ export type Contains = `${string}${S}${string}`; + +/** + * Used to make sure the given string is not empty + */ export type NonEmpty = T extends '' ? never : T; +/** + * Split the given string into a tuple using the given `S` literal + */ export type Split = T extends `${infer A}${S}${infer B}` ? [A, ...Split] : T extends '' ? [] : [T]; +/** + * Aggregate the given typle into a string, separated by the given `S` literal + */ export type Join = T extends [ infer F extends Literal, ...infer R @@ -24,8 +40,15 @@ export type Join = T extends [ : `${F}${S}${Join}` : never; -export type AddSuffix = `${T}${S}`; -export type AddPrefix = `${S}${T}`; +/** + * Add a literal suffix (`S`) at the end of the given string + */ +export type Suffix = `${T}${S}`; + +/** + * Add a literal prefix (`S`) at the beginning of the given string + */ +export type Prefix = `${S}${T}`; /** * From 9b043be3b40df47f3f238671b7716a8973a91617 Mon Sep 17 00:00:00 2001 From: Convly Date: Mon, 15 May 2023 15:16:12 +0200 Subject: [PATCH 014/172] Fix typo --- packages/core/strapi/lib/types/utils.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/strapi/lib/types/utils.d.ts b/packages/core/strapi/lib/types/utils.d.ts index 10f2534bd5..d09cffd5f7 100644 --- a/packages/core/strapi/lib/types/utils.d.ts +++ b/packages/core/strapi/lib/types/utils.d.ts @@ -29,7 +29,7 @@ export type Split = T extends `${infer A}${ : [T]; /** - * Aggregate the given typle into a string, separated by the given `S` literal + * Aggregate the given tuple into a string, separated by the given `S` literal */ export type Join = T extends [ infer F extends Literal, From 8f1f784cc7d6a29004e242917d7b7d884aed6703 Mon Sep 17 00:00:00 2001 From: Convly Date: Mon, 15 May 2023 15:50:44 +0200 Subject: [PATCH 015/172] Update the controller type to make it more generic --- packages/core/strapi/lib/types/core/common/controller.d.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/strapi/lib/types/core/common/controller.d.ts b/packages/core/strapi/lib/types/core/common/controller.d.ts index 1e045aafc3..971a4c8d15 100644 --- a/packages/core/strapi/lib/types/core/common/controller.d.ts +++ b/packages/core/strapi/lib/types/core/common/controller.d.ts @@ -1,8 +1,8 @@ import type koa from 'koa'; -export type ControllerHandler = ( +export type ControllerHandler = ( context: koa.ExtendableContext, next: koa.Next -) => Promise | void | Promise | unknown; +) => Promise | T; export type Controller = Record; From 92f84af23a9f0c5ffb5a5ce4680e0dc7e2fcb847 Mon Sep 17 00:00:00 2001 From: Christian Capeans Date: Mon, 15 May 2023 17:21:30 +0200 Subject: [PATCH 016/172] Undo not necessary changes --- packages/core/strapi/lib/types/factories.d.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/strapi/lib/types/factories.d.ts b/packages/core/strapi/lib/types/factories.d.ts index 46f89dd4eb..734ae3d2ba 100644 --- a/packages/core/strapi/lib/types/factories.d.ts +++ b/packages/core/strapi/lib/types/factories.d.ts @@ -42,8 +42,8 @@ type CollectionTypeRouterConfig = { type RouterConfig = { prefix?: string; - only?: Array; - except?: Array; + only?: string[]; + except?: string[]; config: T; }; From d7fa412811ed96e00740e1b71bd564f6e495f366 Mon Sep 17 00:00:00 2001 From: Convly Date: Mon, 15 May 2023 17:22:21 +0200 Subject: [PATCH 017/172] Scope types with modules --- .../strapi/lib/types/core/common/index.d.ts | 3 - .../lib/types/core/common/namespace.d.ts | 103 ----------- .../strapi/lib/types/core/common/uid.d.ts | 164 ------------------ .../core/strapi/lib/types/core/index.d.ts | 6 +- .../core/strapi/lib/types/core/namespace.d.ts | 94 ++++++++++ .../lib/types/core/{common => }/registry.d.ts | 28 +-- packages/core/strapi/lib/types/core/uid.d.ts | 154 ++++++++++++++++ packages/core/strapi/lib/types/index.d.ts | 3 +- 8 files changed, 269 insertions(+), 286 deletions(-) delete mode 100644 packages/core/strapi/lib/types/core/common/namespace.d.ts delete mode 100644 packages/core/strapi/lib/types/core/common/uid.d.ts create mode 100644 packages/core/strapi/lib/types/core/namespace.d.ts rename packages/core/strapi/lib/types/core/{common => }/registry.d.ts (51%) create mode 100644 packages/core/strapi/lib/types/core/uid.d.ts diff --git a/packages/core/strapi/lib/types/core/common/index.d.ts b/packages/core/strapi/lib/types/core/common/index.d.ts index 4689628ab9..4c83565edb 100644 --- a/packages/core/strapi/lib/types/core/common/index.d.ts +++ b/packages/core/strapi/lib/types/core/common/index.d.ts @@ -1,5 +1,2 @@ export * from './controller'; export * from './service'; -export * from './namespace'; -export * from './uid'; -export * from './registry'; diff --git a/packages/core/strapi/lib/types/core/common/namespace.d.ts b/packages/core/strapi/lib/types/core/common/namespace.d.ts deleted file mode 100644 index b31d679564..0000000000 --- a/packages/core/strapi/lib/types/core/common/namespace.d.ts +++ /dev/null @@ -1,103 +0,0 @@ -import type { Suffix, NonEmpty } from '../../utils'; - -/** - * Namespace for admin resources - */ -export type AdminNamespace = 'admin'; - -/** - * Namespace for strapi internal resources - */ -export type StrapiNamespace = 'strapi'; - -/** - * Namespace for scoped APIs resources - */ -export type ApiNamespace = `api::${T}`; - -/** - * Namespace for scoped plugins resources - */ -export type PluginNamespace = `plugin::${T}`; - -/** - * Namespace for global resources - */ -export type GlobalNamespace = 'global'; - -/** - * Represents any namespace - */ -export type Namespace = - | ApiNamespace - | PluginNamespace - | AdminNamespace - | StrapiNamespace - | GlobalNamespace; - -/** - * Return a {@link Separator} based on the given {@link Namespace} ({@link DotSeparator} for {@link ScopedNamespace} and {@link ColonsSeparator} for regular ones) - * - * @example - * type S = GetNamespaceSeparator - * // ^ '::' - * - * type S = GetNamespaceSeparator - * // ^ '.' - * - * type S = GetNamespaceSeparator - * // ^ '.' | '::' - */ -export type GetNamespaceSeparator = T extends ScopedNamespace - ? // 'api::foo' | 'plugin::bar' => '.' - DotSeparator - : // 'admin' | 'strapi' | 'global' => '::' - ColonsSeparator; - -/** - * Adds the corresponding separator (using {@link GetNamespaceSeparator}) at the end of a namespace - * - * Warning: Using WithSeparator with a union type might produce undesired results as it'll distribute every matching suffix to every union members - * - * @example - * type T = WithSeparator - * // ^ 'admin::' - * - * type T = WithSeparator - * // ^ 'api::{string}.' - * - * type T = WithSeparator - * // ^ 'admin::' | 'admin.' | 'api::{string}.' | 'api::{string}::' - * - * type T = WithSeparator | WithSeparator - * // ^ 'admin::' | 'api::{string}.' - */ -export type WithSeparator = Suffix>; - -/** - * Represents namespaces composed of an origin and a name, separated by colons - */ -export type ScopedNamespace = Namespace & - `${O}${ColonsSeparator}${S}`; - -/** - * Extract the scope from the given scoped namespace - */ -export type ExtractNamespaceScope = T extends `${string}${ColonsSeparator}${infer S}` - ? S - : never; - -/** - * Extract the origin from the given scoped namespace - */ -export type ExtractNamespaceOrigin = T extends `${infer S}${ColonsSeparator}${string}` - ? S - : never; - -/** - * Separators used to join the different parts of a namespace (e.g. building a uid) - */ -export type Separator = ColonsSeparator | DotSeparator; - -type ColonsSeparator = '::'; -type DotSeparator = '.'; diff --git a/packages/core/strapi/lib/types/core/common/uid.d.ts b/packages/core/strapi/lib/types/core/common/uid.d.ts deleted file mode 100644 index 66295e7af0..0000000000 --- a/packages/core/strapi/lib/types/core/common/uid.d.ts +++ /dev/null @@ -1,164 +0,0 @@ -import type { - AdminNamespace, - ApiNamespace, - WithSeparator, - PluginNamespace, - StrapiNamespace, - GetNamespaceSeparator, - Namespace, - Separator, - GlobalNamespace, - ScopedNamespace, - ExtractNamespaceScope, - ExtractNamespaceOrigin, -} from './namespace'; -import type { Suffix } from '../../utils'; - -type StringSuffix = Suffix; - -/** - * Template for services' unique identifier - */ -export type BaseServiceUID = StringSuffix< - WithSeparator | WithSeparator | WithSeparator ->; - -/** - * Template for controllers' unique identifier - */ -export type BaseControllerUID = StringSuffix< - WithSeparator | WithSeparator | WithSeparator ->; - -/** - * Template for policies' unique identifier - */ -export type BasePolicyUID = StringSuffix< - | WithSeparator - | WithSeparator - | WithSeparator - | WithSeparator - | WithSeparator ->; - -/** - * Template for middlewares' unique identifier - */ -export type BaseMiddlewareUID = StringSuffix< - | WithSeparator - | WithSeparator - | WithSeparator - | WithSeparator - | WithSeparator ->; - -/** - * Template for content-types' unique identifier - */ -export type BaseContentTypeUID = StringSuffix< - | WithSeparator - | WithSeparator - | WithSeparator - | WithSeparator ->; - -/** - * Template for components' unique identifier - * - * Warning: Can cause overlap with other UID formats. - */ -export type BaseComponentUID = `${string}.${string}`; - -/** - * Represents any UID - */ -export type UID = - | BaseServiceUID - | BaseControllerUID - | BasePolicyUID - | BaseMiddlewareUID - | BaseContentTypeUID - | BaseComponentUID; - -/** - * Type representation of every UID component. - * - * The separator type is automatically inferred from the given namespace - */ -export interface ParsedUID { - raw: `${N}${GetNamespaceSeparator}${E}`; - namespace: N; - origin: N extends ScopedNamespace ? ExtractNamespaceOrigin : N; - scope: N extends ScopedNamespace ? ExtractNamespaceScope : never; - separator: GetNamespaceSeparator; - name: E; -} - -/** - * Parse an UID literal and returns a {@link ParsedUID} type. - * - * Warning: Using ParseUID with a union type might produce undesired results as it'll distribute every matching namespace parsing to every union members - * - * @example - * type T = ParseUID<'admin::foo'> - * // ^ { namespace: 'admin'; separator: '::'; name: 'foo'; } - * - * type T = ParseUID<'api::foo.bar'> - * // ^ { namespace: 'api::foo'; separator: '.'; name: 'bar'; } - * - * type T = ParseUID<'admin::foo' | 'api::foo.bar'> - * // ^ { namespace: 'admin' | 'api::foo' ; separator: '.' | '::'; name: 'foo' | 'bar' | 'foo.bar'; } - */ -export type ParseUID = ResolveUIDNamespace extends infer B extends Namespace - ? GetNamespaceSeparator extends infer S extends Separator - ? U extends `${infer N extends B}${S}${infer E extends string}` - ? ParsedUID - : never - : never - : never; - -/** - * Determines if the UID's namespace matches the given one. - * - * It returns N (the {@link Namespace} literal) if there is a match, never otherwise. - * - * @example - * type T = AssertUIDNamespace<'admin::foo', AdminNamespace> - * // ^ AdminNamespace - * @example - * type T = AssertUIDNamespace<'foo.bar', ApiNamespace> - * // ^ never - * @example - * type T = AssertUIDNamespace<'api::foo.bar', PluginNamespace> - * // ^ never - */ -export type AssertUIDNamespace = U extends StringSuffix< - WithSeparator -> - ? N - : never; - -/** - * Get parsed properties from a given raw UID - */ -export type ExtractFromUID = ParseUID[P]; - -/** - * Extract the namespace literal from a given UID. - * - * @example - * type T = ResolveUIDNamespace<'admin::foo'> - * // ^ AdminNamespace - * @example - * type T = ResolveUIDNamespace<'api::foo.bar'> - * // ^ ApiNamespace - * @example - * type T = ResolveUIDNamespace<'admin::foo' | 'api::foo.bar'> - * // ^ AdminNamespace | ApiNamespace - */ -export type ResolveUIDNamespace = - | AssertUIDNamespace - | AssertUIDNamespace - | AssertUIDNamespace - | AssertUIDNamespace - | AssertUIDNamespace; diff --git a/packages/core/strapi/lib/types/core/index.d.ts b/packages/core/strapi/lib/types/core/index.d.ts index 4979b8495a..f6337f06f1 100644 --- a/packages/core/strapi/lib/types/core/index.d.ts +++ b/packages/core/strapi/lib/types/core/index.d.ts @@ -1,4 +1,8 @@ export * from './attributes'; export * from './schemas'; export * from './strapi'; -export * from './common'; + +export * as Common from './common'; +export * as Namespace from './namespace'; +export * as UID from './uid'; +export * as Registry from './registry'; diff --git a/packages/core/strapi/lib/types/core/namespace.d.ts b/packages/core/strapi/lib/types/core/namespace.d.ts new file mode 100644 index 0000000000..5b99513826 --- /dev/null +++ b/packages/core/strapi/lib/types/core/namespace.d.ts @@ -0,0 +1,94 @@ +import type * as Utils from '../utils'; + +/** + * Namespace for admin resources + */ +export type Admin = 'admin'; + +/** + * Namespace for strapi internal resources + */ +export type Strapi = 'strapi'; + +/** + * Namespace for scoped APIs resources + */ +export type API = `api::${T}`; + +/** + * Namespace for scoped plugins resources + */ +export type Plugin = `plugin::${T}`; + +/** + * Namespace for global resources + */ +export type Global = 'global'; + +/** + * Represents any namespace + */ +export type Any = API | Plugin | Admin | Strapi | Global; + +/** + * Return a {@link Separator} based on the given {@link Any} ({@link DotSeparator} for {@link Scoped} and {@link ColonsSeparator} for regular ones) + * + * @example + * type S = GetSeparator + * // ^ '::' + * + * type S = GetSeparator + * // ^ '.' + * + * type S = GetSeparator + * // ^ '.' | '::' + */ +export type GetSeparator = T extends Scoped + ? // 'api::foo' | 'plugin::bar' => '.' + DotSeparator + : // 'admin' | 'strapi' | 'global' => '::' + ColonsSeparator; + +/** + * Adds the corresponding separator (using {@link GetSeparator}) at the end of a namespace + * + * Warning: Using WithSeparator with a union type might produce undesired results as it'll distribute every matching suffix to every union members + * + * @example + * type T = WithSeparator + * // ^ 'admin::' + * + * type T = WithSeparator + * // ^ 'api::{string}.' + * + * type T = WithSeparator + * // ^ 'admin::' | 'admin.' | 'api::{string}.' | 'api::{string}::' + * + * type T = WithSeparator | WithSeparator + * // ^ 'admin::' | 'api::{string}.' + */ +export type WithSeparator = Utils.Suffix>; + +/** + * Represents namespaces composed of an origin and a name, separated by colons + */ +export type Scoped = Any & + `${O}${ColonsSeparator}${S}`; + +/** + * Extract the scope from the given scoped namespace + */ +export type ExtractScope = T extends `${string}${ColonsSeparator}${infer S}` ? S : never; + +/** + * Extract the origin from the given scoped namespace + */ +export type ExtractOrigin = T extends `${infer S}${ColonsSeparator}${string}` ? S : never; + +/** + * Separators used to join the different parts of a namespace (e.g. building a uid) + */ +export type Separator = ColonsSeparator | DotSeparator; + +type ColonsSeparator = '::'; +type DotSeparator = '.'; diff --git a/packages/core/strapi/lib/types/core/common/registry.d.ts b/packages/core/strapi/lib/types/core/registry.d.ts similarity index 51% rename from packages/core/strapi/lib/types/core/common/registry.d.ts rename to packages/core/strapi/lib/types/core/registry.d.ts index 8b4f10cbcc..c204bb2a20 100644 --- a/packages/core/strapi/lib/types/core/common/registry.d.ts +++ b/packages/core/strapi/lib/types/core/registry.d.ts @@ -1,9 +1,9 @@ -import { UID, ParsedUID, ParseUID } from './uid'; +import type * as UID from './uid'; /** * Extract valid keys from a given registry. * - * It looks for {@link UID} by default but the search can be narrowed to any UID subset using the `U` generic. + * It looks for {@link UID.Any} by default but the search can be narrowed to any UID subset using the `U` generic. * * @example * interface Registry { @@ -13,19 +13,19 @@ import { UID, ParsedUID, ParseUID } from './uid'; * 'api::foo.bar': unknown; * } * - * type T = RegistryKeysBy; + * type T = Keys; * // ^ 'default.foo' | 'global::foo' | 'api::foo.bar' - * type T = RegistryKeysBy; + * type T = Keys; * // ^ 'global::foo' | 'api::foo.bar' - * type T = RegistryKeysBy + * type T = Keys * // ^ 'api::foo.bar' */ -export type RegistryKeysBy = Extract; +export type Keys = Extract; /** * Performs a `Q` filtering operation on the given `T` registry. * - * `Q` needs to be a partial representation of a {@link ParsedUID} + * `Q` needs to be a partial representation of a {@link UID.Parsed} * * Note: For additional filtering, the registry keys' type can be passed as the third generic. * @@ -39,21 +39,21 @@ export type RegistryKeysBy = Extract; * 'plugin::foo.bar': unknown; * } * - * type T = keyof RegistryQuery; + * type T = keyof WhereKeys; * // ^ "api::foo.bar" | "api::foo.baz" | "api::bar.foo" * - * type T = keyof RegistryQuery; + * type T = keyof WhereKeys; * // ^ "admin::bar" | "api::foo.bar" | "plugin::foo.bar" * - * type T = keyof RegistryQuery; + * type T = keyof WhereKeys; * // ^ "api::foo.bar" | "api::foo.baz" | "api::bar.foo" | 'plugin::foo.bar" * - * type T = keyof RegistryQuery; + * type T = keyof WhereKeys; * // ^ "plugin::foo.bar" | "admin::foo" | "admin::bar" * - * type T = keyof RegistryQuery }>; + * type T = keyof WhereKeys }>; * // ^ "api::foo.bar" | "api::foo.baz" */ -export type RegistryQuery, U extends UID = UID> = { - [uid in RegistryKeysBy as ParseUID extends Q ? uid : never]: T[uid]; +export type WhereKeys, U extends UID.Any = UID.Any> = { + [uid in Keys as UID.Parse extends Q ? uid : never]: T[uid]; }; diff --git a/packages/core/strapi/lib/types/core/uid.d.ts b/packages/core/strapi/lib/types/core/uid.d.ts new file mode 100644 index 0000000000..9c132eec0e --- /dev/null +++ b/packages/core/strapi/lib/types/core/uid.d.ts @@ -0,0 +1,154 @@ +import type * as Namespace from './namespace'; +import type * as Utils from '../utils'; + +type StringSuffix = Utils.Suffix; + +/** + * Template for services' unique identifier + */ +export type Service = StringSuffix< + | Namespace.WithSeparator + | Namespace.WithSeparator + | Namespace.WithSeparator +>; + +/** + * Template for controllers' unique identifier + */ +export type Controller = StringSuffix< + | Namespace.WithSeparator + | Namespace.WithSeparator + | Namespace.WithSeparator +>; + +/** + * Template for policies' unique identifier + */ +export type Policy = StringSuffix< + | Namespace.WithSeparator + | Namespace.WithSeparator + | Namespace.WithSeparator + | Namespace.WithSeparator + | Namespace.WithSeparator +>; + +/** + * Template for middlewares' unique identifier + */ +export type Middleware = StringSuffix< + | Namespace.WithSeparator + | Namespace.WithSeparator + | Namespace.WithSeparator + | Namespace.WithSeparator + | Namespace.WithSeparator +>; + +/** + * Template for content-types' unique identifier + */ +export type ContentType = StringSuffix< + | Namespace.WithSeparator + | Namespace.WithSeparator + | Namespace.WithSeparator + | Namespace.WithSeparator +>; + +/** + * Template for components' unique identifier + * + * Warning: Can cause overlap with other UID formats. + */ +export type Component = `${string}.${string}`; + +/** + * Represents any UID + */ +export type Any = Service | Controller | Policy | Middleware | ContentType | Component; + +/** + * Type representation of every UID component. + * + * The separator type is automatically inferred from the given namespace + */ +export interface Parsed { + raw: `${N}${Namespace.GetSeparator}${E}`; + namespace: N; + origin: N extends Namespace.Scoped ? Namespace.ExtractOrigin : N; + scope: N extends Namespace.Scoped ? Namespace.ExtractScope : never; + separator: Namespace.GetSeparator; + name: E; +} + +/** + * Parse an UID literal and returns a {@link Parsed} type. + * + * Warning: Using ParseUID with a union type might produce undesired results as it'll distribute every matching namespace parsing to every union members + * + * @example + * type T = Parse<'admin::foo'> + * // ^ { namespace: 'admin'; separator: '::'; name: 'foo'; } + * + * type T = Parse<'api::foo.bar'> + * // ^ { namespace: 'api::foo'; separator: '.'; name: 'bar'; } + * + * type T = Parse<'admin::foo' | 'api::foo.bar'> + * // ^ { namespace: 'admin' | 'api::foo' ; separator: '.' | '::'; name: 'foo' | 'bar' | 'foo.bar'; } + */ +export type Parse = ExtractNamespace extends infer B extends Namespace.Any + ? Namespace.GetSeparator extends infer S extends Namespace.Separator + ? U extends `${infer N extends B}${S}${infer E extends string}` + ? Parsed + : never + : never + : never; + +/** + * Determines if the UID's namespace matches the given one. + * + * It returns N (the {@link Namespace.Any} literal) if there is a match, never otherwise. + * + * @example + * type T = AssertNamespaceIs<'admin::foo', Namespace.Admin> + * // ^ Namespace.Admin + * @example + * type T = AssertNamespaceIs<'foo.bar', Namespace.API> + * // ^ never + * @example + * type T = AssertNamespaceIs<'api::foo.bar', Namespace.Plugin> + * // ^ never + */ +export type AssertNamespaceIs = U extends StringSuffix< + Namespace.WithSeparator +> + ? N + : never; + +/** + * Get parsed properties from a given raw UID + */ +export type Get = Parse[P]; + +/** + * Pick parsed properties from a given raw UID + */ +export type Select> = Pick, P>; + +/** + * Extract the namespace literal from a given UID. + * + * @example + * type T = ResolveUIDNamespace<'admin::foo'> + * // ^ AdminNamespace + * @example + * type T = ResolveUIDNamespace<'api::foo.bar'> + * // ^ ApiNamespace + * @example + * type T = ResolveUIDNamespace<'admin::foo' | 'api::foo.bar'> + * // ^ AdminNamespace | ApiNamespace + */ +export type ExtractNamespace = + | AssertNamespaceIs + | AssertNamespaceIs + | AssertNamespaceIs + | AssertNamespaceIs + | AssertNamespaceIs; diff --git a/packages/core/strapi/lib/types/index.d.ts b/packages/core/strapi/lib/types/index.d.ts index 540ddd64db..502bee2dff 100644 --- a/packages/core/strapi/lib/types/index.d.ts +++ b/packages/core/strapi/lib/types/index.d.ts @@ -1,6 +1,7 @@ +// Exports from core should already be modules export * from './core'; export * as utils from './utils'; export * as factories from './factories'; -export * as shared from './shared'; +export * as Shared from './shared'; From 4e60b8a21fa483aa36fd0d1d745030b9dd3afdef Mon Sep 17 00:00:00 2001 From: Convly Date: Mon, 15 May 2023 17:25:34 +0200 Subject: [PATCH 018/172] Fix typo in jsdoc --- packages/core/strapi/lib/types/core/uid.d.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/core/strapi/lib/types/core/uid.d.ts b/packages/core/strapi/lib/types/core/uid.d.ts index 9c132eec0e..6b82294bbb 100644 --- a/packages/core/strapi/lib/types/core/uid.d.ts +++ b/packages/core/strapi/lib/types/core/uid.d.ts @@ -137,14 +137,14 @@ export type Select> = Pick, P>; * Extract the namespace literal from a given UID. * * @example - * type T = ResolveUIDNamespace<'admin::foo'> - * // ^ AdminNamespace + * type T = AssertNamespaceIs<'admin::foo'> + * // ^ Namespace.Admin * @example - * type T = ResolveUIDNamespace<'api::foo.bar'> - * // ^ ApiNamespace + * type T = AssertNamespaceIs<'api::foo.bar'> + * // ^ Namespace.API * @example - * type T = ResolveUIDNamespace<'admin::foo' | 'api::foo.bar'> - * // ^ AdminNamespace | ApiNamespace + * type T = AssertNamespaceIs<'admin::foo' | 'api::foo.bar'> + * // ^ Namespace.Admin | Namespace.API */ export type ExtractNamespace = | AssertNamespaceIs From e33d36019de4d9576109e8de95f73feaafedcc45 Mon Sep 17 00:00:00 2001 From: Christian Capeans Date: Mon, 15 May 2023 17:37:29 +0200 Subject: [PATCH 019/172] Add todo comment --- packages/core/strapi/lib/types/factories.d.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/core/strapi/lib/types/factories.d.ts b/packages/core/strapi/lib/types/factories.d.ts index 734ae3d2ba..50ea525282 100644 --- a/packages/core/strapi/lib/types/factories.d.ts +++ b/packages/core/strapi/lib/types/factories.d.ts @@ -42,6 +42,7 @@ type CollectionTypeRouterConfig = { type RouterConfig = { prefix?: string; + // TODO Refactor when we have a controller registry only?: string[]; except?: string[]; config: T; From d73bb1838154dcc46279779ff6bc66899bd698cd Mon Sep 17 00:00:00 2001 From: Christian Capeans Date: Mon, 15 May 2023 17:56:39 +0200 Subject: [PATCH 020/172] Improve typings --- .../core/strapi/lib/core-api/controller/index.d.ts | 2 +- packages/core/strapi/lib/types/factories.d.ts | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/core/strapi/lib/core-api/controller/index.d.ts b/packages/core/strapi/lib/core-api/controller/index.d.ts index 3f0eb84aa9..c89b616ed9 100644 --- a/packages/core/strapi/lib/core-api/controller/index.d.ts +++ b/packages/core/strapi/lib/core-api/controller/index.d.ts @@ -23,5 +23,5 @@ export interface CollectionTypeController extends Controller { } export type GenericController = Partial & { - [method: string | number | symbol]: (ctx: Context, next: Next) => unknown; + [method: string | number | symbol]: (ctx: Context, next?: Next) => unknown; }; diff --git a/packages/core/strapi/lib/types/factories.d.ts b/packages/core/strapi/lib/types/factories.d.ts index 50ea525282..1d73e6e5c5 100644 --- a/packages/core/strapi/lib/types/factories.d.ts +++ b/packages/core/strapi/lib/types/factories.d.ts @@ -62,12 +62,12 @@ type ControllerCallback = (para }) => T; type ServiceCallback = (params: { strapi: Strapi }) => T; -export function createCoreRouter( +export declare function createCoreRouter( uid: T, cfg?: RouterConfig> = {} ): () => Router; -export function createCoreController< +export declare function createCoreController< T extends SchemaUID, S extends Partial> >( @@ -75,10 +75,10 @@ export function createCoreController< cfg?: ControllerCallback | S ): () => Required>>; -export function createCoreService>>( - uid: T, - cfg?: ServiceCallback | S -): () => Required>; +export declare function createCoreService< + T extends SchemaUID, + S extends Partial> +>(uid: T, cfg?: ServiceCallback | S): () => Required>; type GetBaseSchemaController = IsCollectionType< T, From 1254018e0be46b64515475798ebe2223b00d5a48 Mon Sep 17 00:00:00 2001 From: Christian Capeans Date: Mon, 15 May 2023 18:11:05 +0200 Subject: [PATCH 021/172] Add default value to RouterConfig --- packages/core/strapi/lib/types/factories.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/strapi/lib/types/factories.d.ts b/packages/core/strapi/lib/types/factories.d.ts index 1d73e6e5c5..2c1aa0120e 100644 --- a/packages/core/strapi/lib/types/factories.d.ts +++ b/packages/core/strapi/lib/types/factories.d.ts @@ -40,7 +40,7 @@ type CollectionTypeRouterConfig = { delete?: HandlerConfig; }; -type RouterConfig = { +type RouterConfig = { prefix?: string; // TODO Refactor when we have a controller registry only?: string[]; From 2d32cb1015990591dc20d5e4c19060ace7f2a284 Mon Sep 17 00:00:00 2001 From: Convly Date: Wed, 17 May 2023 12:23:56 +0200 Subject: [PATCH 022/172] Remove the possibility to select a filename and a directory for the generated types --- .../commands/actions/ts/generate-types/action.js | 16 +++++++--------- .../actions/ts/generate-types/command.js | 7 +------ 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/packages/core/strapi/lib/commands/actions/ts/generate-types/action.js b/packages/core/strapi/lib/commands/actions/ts/generate-types/action.js index d16fa5a71c..cb641b5325 100644 --- a/packages/core/strapi/lib/commands/actions/ts/generate-types/action.js +++ b/packages/core/strapi/lib/commands/actions/ts/generate-types/action.js @@ -4,22 +4,20 @@ const tsUtils = require('@strapi/typescript-utils'); const strapi = require('../../../../index'); -module.exports = async ({ outDir, file, verbose, silent }) => { - if (verbose && silent) { - console.error('You cannot enable verbose and silent flags at the same time, exiting...'); +module.exports = async ({ debug, silent }) => { + if (debug && silent) { + console.error('Flags conflict: both silent and debug mode are enabled, exiting...'); process.exit(1); } const appContext = await strapi.compile(); const app = await strapi(appContext).register(); - await tsUtils.generators.generateSchemasDefinitions({ + await tsUtils.generators.generate({ strapi: app, - outDir: outDir || appContext.appDir, - file, - dirs: appContext, - verbose, - silent, + pwd: appContext.appDir, + logger: { silent, debug }, + artefacts: { contentTypes: true, components: true }, }); app.destroy(); diff --git a/packages/core/strapi/lib/commands/actions/ts/generate-types/command.js b/packages/core/strapi/lib/commands/actions/ts/generate-types/command.js index 3a4c151a64..2527087bcd 100644 --- a/packages/core/strapi/lib/commands/actions/ts/generate-types/command.js +++ b/packages/core/strapi/lib/commands/actions/ts/generate-types/command.js @@ -10,12 +10,7 @@ module.exports = ({ command }) => { command .command('ts:generate-types') .description(`Generate TypeScript typings for your schemas`) - .option( - '-o, --out-dir ', - 'Specify a relative directory in which the schemas definitions will be generated' - ) - .option('-f, --file ', 'Specify a filename to store the schemas definitions') - .option('--verbose', `Display more information about the types generation`, false) + .option('-d, --debug', `Run the generation with debug messages`, false) .option('-s, --silent', `Run the generation silently, without any output`, false) .action(getLocalScript('ts/generate-types')); }; From e0b360344723bf33480f3b2dacb37a403ea8f835 Mon Sep 17 00:00:00 2001 From: Convly Date: Wed, 17 May 2023 12:25:15 +0200 Subject: [PATCH 023/172] Remove global interface type and uids definitions from global.d.ts --- packages/core/strapi/lib/global.d.ts | 44 ---------------------------- 1 file changed, 44 deletions(-) diff --git a/packages/core/strapi/lib/global.d.ts b/packages/core/strapi/lib/global.d.ts index e85956ffa0..6f86cfd985 100644 --- a/packages/core/strapi/lib/global.d.ts +++ b/packages/core/strapi/lib/global.d.ts @@ -1,51 +1,7 @@ import type { Strapi as StrapiInterface } from './types/core'; -import type { - CollectionTypeSchema, - SingleTypeSchema, - ComponentSchema, - ContentTypeSchema, -} from './types/core/schemas'; -import type { KeysBy } from './types/utils'; declare global { namespace Strapi { - /** - * Map of UID / schemas used as a schemas database for other types. - * It must be extended by the user application or plugins. - * - * @example - * ```ts - * declare global { - * namespace Strapi { - * interface Schemas { - * 'xxx::xxx.uid: ContentTypeSchema | ComponentSchema; - * } - * } - * } - * ``` - */ - interface Schemas {} - - /** - * Literal union type of every content type registered in Strapi.Schemas - */ - type ContentTypeUIDs = KeysBy; - - /** - * Literal union type of every collection type registered in Strapi.Schemas - */ - type CollectionTypeUIDs = KeysBy; - - /** - * Literal union type of every single type registered in Strapi.Schemas - */ - type SingleTypeUIDs = KeysBy; - - /** - * Literal union type of every component registered in Strapi.Schemas - */ - type ComponentUIDs = KeysBy; - /** * Global shorthand to access the `StrapiInterface` type */ From c1a3193a8374b0c802913203234fc77321133eb8 Mon Sep 17 00:00:00 2001 From: Convly Date: Wed, 17 May 2023 12:26:02 +0200 Subject: [PATCH 024/172] Remove SchemaUID from the strapi/strapi ts utils --- packages/core/strapi/lib/types/utils.d.ts | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/packages/core/strapi/lib/types/utils.d.ts b/packages/core/strapi/lib/types/utils.d.ts index d09cffd5f7..00975a4008 100644 --- a/packages/core/strapi/lib/types/utils.d.ts +++ b/packages/core/strapi/lib/types/utils.d.ts @@ -107,26 +107,6 @@ export type PickBy = Pick>; */ export type NeverGuard = [T] extends [never] ? U : T; -/** - * Dynamic type based on the keys of `Strapi.Schemas`. - * It represents all the registered schemas' UID as a union type. - * - * @example - * - * declare global { - * namespace Strapi { - * interface Schemas { - * 'api::foo.foo': CollectionTypeSchema; - * 'api::bar.bar': ComponentSchema; - * } - * } - * } - * - * type X = SchemaUID; - * // 'api::foo.foo' | 'api::bar.bar' - */ -export type SchemaUID = keyof Strapi.Schemas; - /** * Get the type of a specific key `U` in `T` * From aa9cb0529ac6183566b2c1f795849f4145828572 Mon Sep 17 00:00:00 2001 From: Convly Date: Wed, 17 May 2023 12:30:32 +0200 Subject: [PATCH 025/172] Fix the base registry types to fix keyof set to never for empty registries --- .../strapi/lib/types/shared/registries.d.ts | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/packages/core/strapi/lib/types/shared/registries.d.ts b/packages/core/strapi/lib/types/shared/registries.d.ts index 0a0301d6b6..0ab778a272 100644 --- a/packages/core/strapi/lib/types/shared/registries.d.ts +++ b/packages/core/strapi/lib/types/shared/registries.d.ts @@ -1,29 +1,45 @@ +import type { Common, Schema, UID } from '@strapi/strapi'; + /** * Shared service registry */ -export interface Services {} +export interface Services { + [uid: UID.Service]: Common.Service; +} /** * Shared controller registry */ -export interface Controllers {} +export interface Controllers { + [uid: UID.Controller]: Common.Controller; +} /** * Shared policy registry */ -export interface Policies {} +export interface Policies { + // TODO: Create generic policy type + [uid: UID.Policy]: unknown; +} /** * Shared middleware registry */ -export interface Middlewares {} +export interface Middlewares { + // TODO: Create generic middleware type + [uid: UID.Middleware]: unknown; +} /** * Shared content-types registry */ -export interface ContentTypes {} +export interface ContentTypes { + [key: UID.ContentType]: Schema.ContentType; +} /** * Shared component registry */ -export interface Components {} +export interface Components { + [key: UID.Component]: Schema.Component; +} From 015dd9ffcce2eee20ec57d8efdec8d8911de4b2e Mon Sep 17 00:00:00 2001 From: Convly Date: Wed, 17 May 2023 12:31:23 +0200 Subject: [PATCH 026/172] Allow UID.Component to be generic for inferrence --- packages/core/strapi/lib/types/core/uid.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/strapi/lib/types/core/uid.d.ts b/packages/core/strapi/lib/types/core/uid.d.ts index 6b82294bbb..3a088e2531 100644 --- a/packages/core/strapi/lib/types/core/uid.d.ts +++ b/packages/core/strapi/lib/types/core/uid.d.ts @@ -58,7 +58,7 @@ export type ContentType = StringSuffix< * * Warning: Can cause overlap with other UID formats. */ -export type Component = `${string}.${string}`; +export type Component = `${T}.${N}`; /** * Represents any UID From 2a149028967f0768ce06d253d400c628e9a728cc Mon Sep 17 00:00:00 2001 From: Convly Date: Wed, 17 May 2023 12:32:14 +0200 Subject: [PATCH 027/172] Export dynamic UIDs union types based on the registry values --- .../strapi/lib/types/core/common/index.d.ts | 2 ++ .../strapi/lib/types/core/common/schema.d.ts | 3 ++ .../strapi/lib/types/core/common/uid.d.ts | 34 +++++++++++++++++++ 3 files changed, 39 insertions(+) create mode 100644 packages/core/strapi/lib/types/core/common/schema.d.ts create mode 100644 packages/core/strapi/lib/types/core/common/uid.d.ts diff --git a/packages/core/strapi/lib/types/core/common/index.d.ts b/packages/core/strapi/lib/types/core/common/index.d.ts index 4c83565edb..a7427bd521 100644 --- a/packages/core/strapi/lib/types/core/common/index.d.ts +++ b/packages/core/strapi/lib/types/core/common/index.d.ts @@ -1,2 +1,4 @@ export * from './controller'; export * from './service'; +export * from './schema'; +export * as UID from './uid'; diff --git a/packages/core/strapi/lib/types/core/common/schema.d.ts b/packages/core/strapi/lib/types/core/common/schema.d.ts new file mode 100644 index 0000000000..03ac86f9ea --- /dev/null +++ b/packages/core/strapi/lib/types/core/common/schema.d.ts @@ -0,0 +1,3 @@ +import type { Shared } from '@strapi/strapi'; + +export type Schemas = Shared.ContentTypes & Shared.Components; diff --git a/packages/core/strapi/lib/types/core/common/uid.d.ts b/packages/core/strapi/lib/types/core/common/uid.d.ts new file mode 100644 index 0000000000..adec2a2cb8 --- /dev/null +++ b/packages/core/strapi/lib/types/core/common/uid.d.ts @@ -0,0 +1,34 @@ +import type { + Shared, + Schema as SchemaNamespace, + Common, + Registry, + UID, + Utils, +} from '@strapi/strapi'; + +export type Service = Registry.Keys; + +export type Controller = Registry.Keys; + +export type Policy = Registry.Keys; + +export type Middleware = Registry.Keys; + +export type ContentType = Registry.Keys; +export type CollectionType = Extract< + Utils.KeysBy, + ContentType +>; +export type SingleType = Extract< + Utils.KeysBy, + ContentType +>; + +export type Component = Registry.Keys; +export type ComponentCategory = Component extends UID.Component ? A : never; + +export type Schema = Registry.Keys< + Common.Schemas, + UID.ContentType | UID.Component +>; From 3ef8a8dc679e593d6e0767bfdf1c60057906e74f Mon Sep 17 00:00:00 2001 From: Convly Date: Wed, 17 May 2023 12:32:50 +0200 Subject: [PATCH 028/172] Move core types to namespaces and use new UIDs --- .../lib/types/core/attributes/base.d.ts | 6 +- .../lib/types/core/attributes/biginteger.d.ts | 23 ++- .../lib/types/core/attributes/boolean.d.ts | 20 +-- .../lib/types/core/attributes/common.d.ts | 27 ++-- .../lib/types/core/attributes/component.d.ts | 32 ++--- .../lib/types/core/attributes/date-time.d.ts | 23 ++- .../lib/types/core/attributes/date.d.ts | 25 ++-- .../lib/types/core/attributes/decimal.d.ts | 23 ++- .../types/core/attributes/dynamic-zone.d.ts | 33 ++--- .../lib/types/core/attributes/email.d.ts | 28 ++-- .../types/core/attributes/enumeration.d.ts | 29 ++-- .../lib/types/core/attributes/float.d.ts | 25 ++-- .../lib/types/core/attributes/integer.d.ts | 23 ++- .../lib/types/core/attributes/json.d.ts | 17 +-- .../lib/types/core/attributes/media.d.ts | 24 ++-- .../lib/types/core/attributes/password.d.ts | 23 ++- .../lib/types/core/attributes/relation.d.ts | 44 +++--- .../lib/types/core/attributes/richtext.d.ts | 23 ++- .../lib/types/core/attributes/string.d.ts | 32 ++--- .../lib/types/core/attributes/text.d.ts | 32 ++--- .../lib/types/core/attributes/time.d.ts | 25 ++-- .../lib/types/core/attributes/timestamp.d.ts | 23 ++- .../strapi/lib/types/core/attributes/uid.d.ts | 51 +++---- .../lib/types/core/attributes/utils.d.ts | 135 +++++++----------- .../core/strapi/lib/types/core/index.d.ts | 4 +- .../strapi/lib/types/core/schemas/index.d.ts | 29 ++-- packages/core/strapi/lib/types/index.d.ts | 4 +- 27 files changed, 301 insertions(+), 482 deletions(-) diff --git a/packages/core/strapi/lib/types/core/attributes/base.d.ts b/packages/core/strapi/lib/types/core/attributes/base.d.ts index 860d12cad7..729c3e87f7 100644 --- a/packages/core/strapi/lib/types/core/attributes/base.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/base.d.ts @@ -1,9 +1,7 @@ -import { GetAttributeValue } from './utils'; - /** * List of all the Strapi attribute types */ -export type AttributeType = +export type Type = | 'string' | 'text' | 'richtext' @@ -29,7 +27,7 @@ export type AttributeType = /** * Most basic shape of a schema attribute */ -export interface Attribute { +export interface Attribute { /** * Type of the attribute */ diff --git a/packages/core/strapi/lib/types/core/attributes/biginteger.d.ts b/packages/core/strapi/lib/types/core/attributes/biginteger.d.ts index 963c45481f..13b4aac77c 100644 --- a/packages/core/strapi/lib/types/core/attributes/biginteger.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/biginteger.d.ts @@ -1,22 +1,15 @@ -import { - Attribute, - ConfigurableOption, - DefaultOption, - MinMaxOption, - PrivateOption, - RequiredOption, -} from './base'; +import type { Attribute } from '@strapi/strapi'; -export type BigIntegerAttribute = Attribute<'biginteger'> & +export type BigInteger = Attribute.Attribute<'biginteger'> & // Options - ConfigurableOption & - DefaultOption & - MinMaxOption & - PrivateOption & - RequiredOption; + Attribute.ConfigurableOption & + Attribute.DefaultOption & + Attribute.MinMaxOption & + Attribute.PrivateOption & + Attribute.RequiredOption; export type BigIntegerValue = string; -export type GetBigIntegerAttributeValue = T extends BigIntegerAttribute +export type GetBigIntegerValue = T extends BigInteger ? BigIntegerValue : never; diff --git a/packages/core/strapi/lib/types/core/attributes/boolean.d.ts b/packages/core/strapi/lib/types/core/attributes/boolean.d.ts index f58bd5cc8b..c96b1e9a0c 100644 --- a/packages/core/strapi/lib/types/core/attributes/boolean.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/boolean.d.ts @@ -1,20 +1,14 @@ -import { - Attribute, - ConfigurableOption, - DefaultOption, - PrivateOption, - RequiredOption, -} from './base'; +import type { Attribute } from '@strapi/strapi'; -export type BooleanAttribute = Attribute<'boolean'> & +export type Boolean = Attribute.Attribute<'boolean'> & // Options - ConfigurableOption & - DefaultOption & - PrivateOption & - RequiredOption; + Attribute.ConfigurableOption & + Attribute.DefaultOption & + Attribute.PrivateOption & + Attribute.RequiredOption; export type BooleanValue = boolean; -export type GetBooleanAttributeValue = T extends BooleanAttribute +export type GetBooleanValue = T extends Boolean ? BooleanValue : never; diff --git a/packages/core/strapi/lib/types/core/attributes/common.d.ts b/packages/core/strapi/lib/types/core/attributes/common.d.ts index b06dc04e75..3c98cf534f 100644 --- a/packages/core/strapi/lib/types/core/attributes/common.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/common.d.ts @@ -2,32 +2,27 @@ * Strapi custom scalar types */ -import { MinMaxLengthOption, MinMaxOption } from './base'; -import { StringAttribute } from './string'; - -export type JSON = T; - -export type Media = any; +import type { Attribute } from '@strapi/strapi'; /** * Setters for the attributes options */ // required -export type RequiredAttribute = { required: true }; -export type NonRequiredAttribute = { required: false }; +export type Required = { required: true }; +export type NonRequired = { required: false }; // private -export type PrivateAttribute = { private: true }; -export type NonPrivateAttribute = { private: false }; +export type Private = { private: true }; +export type NonPrivate = { private: false }; // unique -export type UniqueAttribute = { unique: true }; -export type NonUniqueAttribute = { unique: false }; +export type Unique = { unique: true }; +export type NonUnique = { unique: false }; // configurable -export type ConfigurableAttribute = { configurable: true }; -export type NonConfigurableAttribute = { configurable: false }; +export type Configurable = { configurable: true }; +export type NonConfigurable = { configurable: false }; // custom field export type CustomField = { @@ -36,10 +31,10 @@ export type CustomField = { }; // min/max -export type SetMinMax, U = number> = T; +export type SetMinMax, U = number> = T; // minLength/maxLength -export type SetMinMaxLength = T; +export type SetMinMaxLength = T; // pluginOptions export type SetPluginOptions = { pluginOptions?: T }; diff --git a/packages/core/strapi/lib/types/core/attributes/component.d.ts b/packages/core/strapi/lib/types/core/attributes/component.d.ts index 089b31f267..e443cbf50f 100644 --- a/packages/core/strapi/lib/types/core/attributes/component.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/component.d.ts @@ -1,9 +1,8 @@ -import { Attribute, ConfigurableOption, MinMaxOption, PrivateOption, RequiredOption } from './base'; -import { GetAttributesValues } from './utils'; +import type { Common, Attribute } from '@strapi/strapi'; -export interface ComponentAttributeProperties< +export interface ComponentProperties< // Targeted component - T extends Strapi.ComponentUIDs, + T extends Common.UID.Component, // Repeatable R extends boolean = false > { @@ -11,28 +10,25 @@ export interface ComponentAttributeProperties< repeatable?: R; } -export type ComponentAttribute< +export type Component< // Targeted component - T extends Strapi.ComponentUIDs, + T extends Common.UID.Component, // Repeatable R extends boolean = false -> = Attribute<'component'> & +> = Attribute.Attribute<'component'> & // Component Properties - ComponentAttributeProperties & + ComponentProperties & // Options - ConfigurableOption & - MinMaxOption & - PrivateOption & - RequiredOption; + Attribute.ConfigurableOption & + Attribute.MinMaxOption & + Attribute.PrivateOption & + Attribute.RequiredOption; export type ComponentValue< - T extends Strapi.ComponentUIDs, + T extends Common.UID.Component, R extends boolean -> = GetAttributesValues extends infer V ? (R extends true ? V[] : V) : never; +> = Attribute.GetValues extends infer V ? (R extends true ? V[] : V) : never; -export type GetComponentAttributeValue = T extends ComponentAttribute< - infer U, - infer R -> +export type GetComponentValue = T extends Component ? ComponentValue : never; diff --git a/packages/core/strapi/lib/types/core/attributes/date-time.d.ts b/packages/core/strapi/lib/types/core/attributes/date-time.d.ts index 7a52d59f01..9e077e7a25 100644 --- a/packages/core/strapi/lib/types/core/attributes/date-time.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/date-time.d.ts @@ -1,22 +1,15 @@ -import { - Attribute, - ConfigurableOption, - DefaultOption, - PrivateOption, - RequiredOption, - UniqueOption, -} from './base'; +import type { Attribute } from '@strapi/strapi'; -export type DateTimeAttribute = Attribute<'datetime'> & +export type DateTime = Attribute.Attribute<'datetime'> & // Options - ConfigurableOption & - DefaultOption & - PrivateOption & - RequiredOption & - UniqueOption; + Attribute.ConfigurableOption & + Attribute.DefaultOption & + Attribute.PrivateOption & + Attribute.RequiredOption & + Attribute.UniqueOption; export type DateTimeValue = string; -export type GetDateTimeAttributeValue = T extends DateTimeAttribute +export type GetDateTimeValue = T extends DateTime ? DateTimeValue : never; diff --git a/packages/core/strapi/lib/types/core/attributes/date.d.ts b/packages/core/strapi/lib/types/core/attributes/date.d.ts index b7d8ac2c6c..825609d45f 100644 --- a/packages/core/strapi/lib/types/core/attributes/date.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/date.d.ts @@ -1,22 +1,13 @@ -import { - Attribute, - ConfigurableOption, - DefaultOption, - PrivateOption, - RequiredOption, - UniqueOption, -} from './base'; +import type { Attribute } from '@strapi/strapi'; -export type DateAttribute = Attribute<'date'> & +export type Date = Attribute.Attribute<'date'> & // Options - ConfigurableOption & - DefaultOption & - PrivateOption & - RequiredOption & - UniqueOption; + Attribute.ConfigurableOption & + Attribute.DefaultOption & + Attribute.PrivateOption & + Attribute.RequiredOption & + Attribute.UniqueOption; export type DateValue = Date; -export type GetDateAttributeValue = T extends DateAttribute - ? DateValue - : never; +export type GetDateValue = T extends Date ? DateValue : never; diff --git a/packages/core/strapi/lib/types/core/attributes/decimal.d.ts b/packages/core/strapi/lib/types/core/attributes/decimal.d.ts index 976ba22c82..86bde724df 100644 --- a/packages/core/strapi/lib/types/core/attributes/decimal.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/decimal.d.ts @@ -1,22 +1,15 @@ -import { - Attribute, - ConfigurableOption, - DefaultOption, - MinMaxOption, - PrivateOption, - RequiredOption, -} from './base'; +import type { Attribute } from '@strapi/strapi'; -export type DecimalAttribute = Attribute<'decimal'> & +export type Decimal = Attribute.Attribute<'decimal'> & // Options - ConfigurableOption & - DefaultOption & - MinMaxOption & - PrivateOption & - RequiredOption; + Attribute.ConfigurableOption & + Attribute.DefaultOption & + Attribute.MinMaxOption & + Attribute.PrivateOption & + Attribute.RequiredOption; export type DecimalValue = number; -export type GetDecimalAttributeValue = T extends DecimalAttribute +export type GetDecimalValue = T extends Decimal ? DecimalValue : never; diff --git a/packages/core/strapi/lib/types/core/attributes/dynamic-zone.d.ts b/packages/core/strapi/lib/types/core/attributes/dynamic-zone.d.ts index 582a37539e..ad75c77000 100644 --- a/packages/core/strapi/lib/types/core/attributes/dynamic-zone.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/dynamic-zone.d.ts @@ -1,29 +1,26 @@ -import { SchemaUID, GetArrayValues } from '../../utils'; -import { Attribute, ConfigurableOption, MinMaxOption, RequiredOption } from './base'; -import { GetAttributesValues } from './utils'; +import type { Utils, Attribute, Common } from '@strapi/strapi'; -export interface DynamicZoneAttributeProperties { +export interface DynamicZoneProperties { components: T; } -export type DynamicZoneAttribute = Attribute<'dynamiczone'> & - // Properties - DynamicZoneAttributeProperties & - // Options - ConfigurableOption & - MinMaxOption & - RequiredOption; +export type DynamicZone = + Attribute.Attribute<'dynamiczone'> & + // Properties + DynamicZoneProperties & + // Options + Attribute.ConfigurableOption & + Attribute.MinMaxOption & + Attribute.RequiredOption; -type DynamicZoneValue = Array< - GetArrayValues extends infer P - ? P extends SchemaUID - ? GetAttributesValues

& { __component: P } +type DynamicZoneValue = Array< + Utils.GetArrayValues extends infer P + ? P extends Common.UID.ContentType + ? Attribute.GetValues

& { __component: P } : never : never >; -export type GetDynamicZoneAttributeValue = T extends DynamicZoneAttribute< - infer U -> +export type GetDynamicZoneValue = T extends DynamicZone ? DynamicZoneValue : never; diff --git a/packages/core/strapi/lib/types/core/attributes/email.d.ts b/packages/core/strapi/lib/types/core/attributes/email.d.ts index 2c3881fae6..fdf3ddf409 100644 --- a/packages/core/strapi/lib/types/core/attributes/email.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/email.d.ts @@ -1,24 +1,14 @@ -import { - Attribute, - ConfigurableOption, - DefaultOption, - MinMaxLengthOption, - PrivateOption, - RequiredOption, - UniqueOption, -} from './base'; +import type { Attribute } from '@strapi/strapi'; -export type EmailAttribute = Attribute<'email'> & +export type Email = Attribute.Attribute<'email'> & // Options - ConfigurableOption & - DefaultOption & - MinMaxLengthOption & - PrivateOption & - RequiredOption & - UniqueOption; + Attribute.ConfigurableOption & + Attribute.DefaultOption & + Attribute.MinMaxLengthOption & + Attribute.PrivateOption & + Attribute.RequiredOption & + Attribute.UniqueOption; export type EmailValue = string; -export type GetEmailAttributeValue = T extends EmailAttribute - ? EmailValue - : never; +export type GetEmailValue = T extends Email ? EmailValue : never; diff --git a/packages/core/strapi/lib/types/core/attributes/enumeration.d.ts b/packages/core/strapi/lib/types/core/attributes/enumeration.d.ts index c7ab004f0c..94c55e3500 100644 --- a/packages/core/strapi/lib/types/core/attributes/enumeration.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/enumeration.d.ts @@ -1,28 +1,19 @@ -import { GetArrayValues } from '../../utils'; -import { - Attribute, - ConfigurableOption, - DefaultOption, - PrivateOption, - RequiredOption, -} from './base'; +import type { Attribute, Utils } from '@strapi/strapi'; -export interface EnumerationAttributeProperties { +export interface EnumerationProperties { enum: T; } -export type EnumerationAttribute = Attribute<'enumeration'> & - EnumerationAttributeProperties & +export type Enumeration = Attribute.Attribute<'enumeration'> & + EnumerationProperties & // Options - ConfigurableOption & - DefaultOption & - PrivateOption & - RequiredOption; + Attribute.ConfigurableOption & + Attribute.DefaultOption & + Attribute.PrivateOption & + Attribute.RequiredOption; -export type EnumerationValue = GetArrayValues; +export type EnumerationValue = Utils.GetArrayValues; -export type GetEnumerationAttributeValue = T extends EnumerationAttribute< - infer U -> +export type GetEnumerationValue = T extends Enumeration ? EnumerationValue : never; diff --git a/packages/core/strapi/lib/types/core/attributes/float.d.ts b/packages/core/strapi/lib/types/core/attributes/float.d.ts index 93a20eff7c..45c0585b68 100644 --- a/packages/core/strapi/lib/types/core/attributes/float.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/float.d.ts @@ -1,22 +1,13 @@ -import { - Attribute, - ConfigurableOption, - DefaultOption, - MinMaxOption, - PrivateOption, - RequiredOption, -} from './base'; +import type { Attribute } from '@strapi/strapi'; -export type FloatAttribute = Attribute<'float'> & +export type Float = Attribute.Attribute<'float'> & // Options - ConfigurableOption & - DefaultOption & - MinMaxOption & - PrivateOption & - RequiredOption; + Attribute.ConfigurableOption & + Attribute.DefaultOption & + Attribute.MinMaxOption & + Attribute.PrivateOption & + Attribute.RequiredOption; export type FloatValue = number; -export type GetFloatAttributeValue = T extends FloatAttribute - ? FloatValue - : never; +export type GetFloatValue = T extends Float ? FloatValue : never; diff --git a/packages/core/strapi/lib/types/core/attributes/integer.d.ts b/packages/core/strapi/lib/types/core/attributes/integer.d.ts index 860b34464f..de40b9d1d7 100644 --- a/packages/core/strapi/lib/types/core/attributes/integer.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/integer.d.ts @@ -1,22 +1,15 @@ -import { - Attribute, - ConfigurableOption, - DefaultOption, - MinMaxOption, - PrivateOption, - RequiredOption, -} from './base'; +import type { Attribute } from '@strapi/strapi'; -export type IntegerAttribute = Attribute<'integer'> & +export type Integer = Attribute.Attribute<'integer'> & // Options - ConfigurableOption & - DefaultOption & - MinMaxOption & - PrivateOption & - RequiredOption; + Attribute.ConfigurableOption & + Attribute.DefaultOption & + Attribute.MinMaxOption & + Attribute.PrivateOption & + Attribute.RequiredOption; export type IntegerValue = number; -export type GetIntegerAttributeValue = T extends IntegerAttribute +export type GetIntegerValue = T extends Integer ? IntegerValue : never; diff --git a/packages/core/strapi/lib/types/core/attributes/json.d.ts b/packages/core/strapi/lib/types/core/attributes/json.d.ts index 36bbae56b4..2d5e9e6ec7 100644 --- a/packages/core/strapi/lib/types/core/attributes/json.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/json.d.ts @@ -1,14 +1,11 @@ -import { Attribute, ConfigurableOption, PrivateOption, RequiredOption } from './base'; -import { JSON } from './common'; +import type { Attribute } from '@strapi/strapi'; -export type JSONAttribute = Attribute<'json'> & +export type JSON = Attribute.Attribute<'json'> & //Options - ConfigurableOption & - RequiredOption & - PrivateOption; + Attribute.ConfigurableOption & + Attribute.RequiredOption & + Attribute.PrivateOption; -export type JsonValue = JSON; +export type JsonValue = T; -export type GetJsonAttributeValue = T extends JSONAttribute - ? JsonValue - : never; +export type GetJsonValue = T extends JSON ? JsonValue : never; diff --git a/packages/core/strapi/lib/types/core/attributes/media.d.ts b/packages/core/strapi/lib/types/core/attributes/media.d.ts index 5ea6e3bb36..7f527f6868 100644 --- a/packages/core/strapi/lib/types/core/attributes/media.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/media.d.ts @@ -1,9 +1,8 @@ -import { Attribute, ConfigurableOption, PrivateOption, RequiredOption } from './base'; -import { Media } from './common'; +import type { Attribute } from '@strapi/strapi'; export type AllowedMediaTypes = 'images' | 'videos' | 'files' | 'audios'; -export interface MediaAttributeProperties< +export interface MediaProperties< // Media Type T extends AllowedMediaTypes = undefined, // Multiple @@ -13,24 +12,21 @@ export interface MediaAttributeProperties< multiple?: U; } -export type MediaAttribute< +export type Media< // Media Type T extends AllowedMediaTypes = undefined, // Multiple U extends boolean = false -> = Attribute<'media'> & +> = Attribute.Attribute<'media'> & // Properties - MediaAttributeProperties & + MediaProperties & // Options - ConfigurableOption & - RequiredOption & - PrivateOption; + Attribute.ConfigurableOption & + Attribute.RequiredOption & + Attribute.PrivateOption; -export type MediaValue = T extends true ? Media[] : Media; +export type MediaValue = T extends true ? any[] : any; -export type GetMediaAttributeValue = T extends MediaAttribute< - infer _U, - infer S -> +export type GetMediaValue = T extends Media ? MediaValue : never; diff --git a/packages/core/strapi/lib/types/core/attributes/password.d.ts b/packages/core/strapi/lib/types/core/attributes/password.d.ts index c87d96bb6d..083996e3db 100644 --- a/packages/core/strapi/lib/types/core/attributes/password.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/password.d.ts @@ -1,22 +1,15 @@ -import { - Attribute, - ConfigurableOption, - DefaultOption, - MinMaxLengthOption, - PrivateOption, - RequiredOption, -} from './base'; +import type { Attribute } from '@strapi/strapi'; -export type PasswordAttribute = Attribute<'password'> & +export type Password = Attribute.Attribute<'password'> & // Options - ConfigurableOption & - DefaultOption & - MinMaxLengthOption & - PrivateOption & - RequiredOption; + Attribute.ConfigurableOption & + Attribute.DefaultOption & + Attribute.MinMaxLengthOption & + Attribute.PrivateOption & + Attribute.RequiredOption; export type PasswordValue = string; -export type GetPasswordAttributeValue = T extends PasswordAttribute +export type GetPasswordValue = T extends Password ? PasswordValue : never; diff --git a/packages/core/strapi/lib/types/core/attributes/relation.d.ts b/packages/core/strapi/lib/types/core/attributes/relation.d.ts index 7b29901227..f7f2c5f6ca 100644 --- a/packages/core/strapi/lib/types/core/attributes/relation.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/relation.d.ts @@ -1,15 +1,13 @@ -import { SchemaUID } from '../../utils'; -import { Attribute, ConfigurableOption, PrivateOption } from './base'; -import { GetAttributesByType, GetAttributesValues } from './utils'; +import type { Attribute, Common } from '@strapi/strapi'; export type BasicRelationsType = 'oneToOne' | 'oneToMany' | 'manyToOne' | 'manyToMany'; export type PolymorphicRelationsType = 'morphToOne' | 'morphToMany' | 'morphOne' | 'morphMany'; export type RelationsType = BasicRelationsType | PolymorphicRelationsType; -export interface BasicRelationAttributeProperties< - S extends SchemaUID, +export interface BasicRelationProperties< + S extends Common.UID.Schema, R extends RelationsType, - T extends SchemaUID + T extends Common.UID.Schema > { relation: R; target: T; @@ -17,32 +15,32 @@ export interface BasicRelationAttributeProperties< mappedBy?: RelationsKeysFromTo; } -export interface PolymorphicRelationAttributeProperties { +export interface PolymorphicRelationProperties { relation: R; } -export type RelationAttribute< - S extends SchemaUID, +export type Relation< + S extends Common.UID.Schema, R extends RelationsType, - T extends R extends PolymorphicRelationsType ? never : SchemaUID = never -> = Attribute<'relation'> & + T extends R extends PolymorphicRelationsType ? never : Common.UID.Schema = never +> = Attribute.Attribute<'relation'> & // Properties (R extends BasicRelationsType - ? BasicRelationAttributeProperties - : PolymorphicRelationAttributeProperties) & + ? BasicRelationProperties + : PolymorphicRelationProperties) & // Options - ConfigurableOption & - PrivateOption; + Attribute.ConfigurableOption & + Attribute.PrivateOption; export type RelationsKeysFromTo< - TTarget extends SchemaUID, - TSource extends SchemaUID + TTarget extends Common.UID.Schema, + TSource extends Common.UID.Schema > = keyof PickRelationsFromTo; export type PickRelationsFromTo< - TTarget extends SchemaUID, - TSource extends SchemaUID -> = GetAttributesByType; + TTarget extends Common.UID.Schema, + TSource extends Common.UID.Schema +> = Attribute.GetByType; export type RelationPluralityModifier< TRelation extends RelationsType, @@ -51,10 +49,10 @@ export type RelationPluralityModifier< export type RelationValue< TRelation extends RelationsType, - TTarget extends SchemaUID -> = RelationPluralityModifier>; + TTarget extends Common.UID.Schema +> = RelationPluralityModifier>; -export type GetRelationAttributeValue = T extends RelationAttribute< +export type GetRelationValue = T extends Relation< infer _TSource, infer TRelation, infer TTarget diff --git a/packages/core/strapi/lib/types/core/attributes/richtext.d.ts b/packages/core/strapi/lib/types/core/attributes/richtext.d.ts index 89a6251413..dca3ecf821 100644 --- a/packages/core/strapi/lib/types/core/attributes/richtext.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/richtext.d.ts @@ -1,22 +1,15 @@ -import { - Attribute, - ConfigurableOption, - DefaultOption, - MinMaxLengthOption, - PrivateOption, - RequiredOption, -} from './base'; +import type { Attribute } from '@strapi/strapi'; -export type RichTextAttribute = Attribute<'richtext'> & +export type RichText = Attribute.Attribute<'richtext'> & // Options - ConfigurableOption & - DefaultOption & - MinMaxLengthOption & - PrivateOption & - RequiredOption; + Attribute.ConfigurableOption & + Attribute.DefaultOption & + Attribute.MinMaxLengthOption & + Attribute.PrivateOption & + Attribute.RequiredOption; export type RichTextValue = string; -export type GetRichTextAttributeValue = T extends RichTextAttribute +export type GetRichTextValue = T extends RichText ? RichTextValue : never; diff --git a/packages/core/strapi/lib/types/core/attributes/string.d.ts b/packages/core/strapi/lib/types/core/attributes/string.d.ts index 4bfd9684f3..5fc00852b8 100644 --- a/packages/core/strapi/lib/types/core/attributes/string.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/string.d.ts @@ -1,30 +1,20 @@ -import { - Attribute, - ConfigurableOption, - DefaultOption, - MinMaxLengthOption, - PrivateOption, - RequiredOption, - UniqueOption, -} from './base'; +import type { Attribute } from '@strapi/strapi'; -export interface StringAttributeProperties { +export interface StringProperties { regex?: RegExp; } -export type StringAttribute = Attribute<'string'> & +export type String = Attribute.Attribute<'string'> & // Properties - StringAttributeProperties & + StringProperties & // Options - ConfigurableOption & - DefaultOption & - MinMaxLengthOption & - PrivateOption & - UniqueOption & - RequiredOption; + Attribute.ConfigurableOption & + Attribute.DefaultOption & + Attribute.MinMaxLengthOption & + Attribute.PrivateOption & + Attribute.UniqueOption & + Attribute.RequiredOption; export type StringValue = string; -export type GetStringAttributeValue = T extends StringAttribute - ? StringValue - : never; +export type GetStringValue = T extends String ? StringValue : never; diff --git a/packages/core/strapi/lib/types/core/attributes/text.d.ts b/packages/core/strapi/lib/types/core/attributes/text.d.ts index 579fb1431d..7fff003e75 100644 --- a/packages/core/strapi/lib/types/core/attributes/text.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/text.d.ts @@ -1,30 +1,20 @@ -import { - Attribute, - ConfigurableOption, - DefaultOption, - MinMaxLengthOption, - PrivateOption, - RequiredOption, - UniqueOption, -} from './base'; +import type { Attribute } from '@strapi/strapi'; -export interface TextAttributeProperties { +export interface TextProperties { regex?: RegExp; } -export type TextAttribute = Attribute<'text'> & +export type Text = Attribute.Attribute<'text'> & // Properties - TextAttributeProperties & + TextProperties & // Options - ConfigurableOption & - DefaultOption & - MinMaxLengthOption & - PrivateOption & - UniqueOption & - RequiredOption; + Attribute.ConfigurableOption & + Attribute.DefaultOption & + Attribute.MinMaxLengthOption & + Attribute.PrivateOption & + Attribute.UniqueOption & + Attribute.RequiredOption; export type TextValue = string; -export type GetTextAttributeValue = T extends TextAttribute - ? TextValue - : never; +export type GetTextValue = T extends Text ? TextValue : never; diff --git a/packages/core/strapi/lib/types/core/attributes/time.d.ts b/packages/core/strapi/lib/types/core/attributes/time.d.ts index 26dc0046a6..307d75d171 100644 --- a/packages/core/strapi/lib/types/core/attributes/time.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/time.d.ts @@ -1,22 +1,13 @@ -import { - Attribute, - ConfigurableOption, - DefaultOption, - PrivateOption, - RequiredOption, - UniqueOption, -} from './base'; +import type { Attribute } from '@strapi/strapi'; -export type TimeAttribute = Attribute<'time'> & +export type Time = Attribute.Attribute<'time'> & // Options - ConfigurableOption & - DefaultOption & - PrivateOption & - RequiredOption & - UniqueOption; + Attribute.ConfigurableOption & + Attribute.DefaultOption & + Attribute.PrivateOption & + Attribute.RequiredOption & + Attribute.UniqueOption; export type TimeValue = string; -export type GetTimeAttributeValue = T extends TimeAttribute - ? TimeValue - : never; +export type GetTimeValue = T extends Time ? TimeValue : never; diff --git a/packages/core/strapi/lib/types/core/attributes/timestamp.d.ts b/packages/core/strapi/lib/types/core/attributes/timestamp.d.ts index c632d11a0b..e1058f1937 100644 --- a/packages/core/strapi/lib/types/core/attributes/timestamp.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/timestamp.d.ts @@ -1,22 +1,15 @@ -import { - Attribute, - ConfigurableOption, - DefaultOption, - PrivateOption, - RequiredOption, - UniqueOption, -} from './base'; +import type { Attribute } from '@strapi/strapi'; -export type TimestampAttribute = Attribute<'timestamp'> & +export type Timestamp = Attribute.Attribute<'timestamp'> & // Options - ConfigurableOption & - DefaultOption & - PrivateOption & - RequiredOption & - UniqueOption; + Attribute.ConfigurableOption & + Attribute.DefaultOption & + Attribute.PrivateOption & + Attribute.RequiredOption & + Attribute.UniqueOption; export type TimestampValue = string; -export type GetTimestampAttributeValue = T extends TimestampAttribute +export type GetTimestampValue = T extends Timestamp ? TimestampValue : never; diff --git a/packages/core/strapi/lib/types/core/attributes/uid.d.ts b/packages/core/strapi/lib/types/core/attributes/uid.d.ts index f620940290..26b0ba031b 100644 --- a/packages/core/strapi/lib/types/core/attributes/uid.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/uid.d.ts @@ -1,15 +1,6 @@ -import { - Attribute, - ConfigurableOption, - DefaultOption, - MinMaxLengthOption, - PrivateOption, - RequiredOption, -} from './base'; -import { SchemaUID } from '../../utils'; -import { GetAttributesKeysByType } from './utils'; +import type { Attribute, Common } from '@strapi/strapi'; -export interface UIDAttributeOptions { +export interface UIDOptions { separator?: string; lowercase?: boolean; decamelize?: boolean; @@ -17,41 +8,41 @@ export interface UIDAttributeOptions { preserveLeadingUnderscore?: boolean; } -export interface UIDAttributeProperties< +export interface UIDProperties< // Own Schema Reference - T extends SchemaUID | undefined = undefined, + T extends Common.UID.Schema | undefined = undefined, // Target attribute - U extends T extends SchemaUID - ? GetAttributesKeysByType + U extends T extends Common.UID.Schema + ? Attribute.GetKeysByType : undefined = undefined, // UID options - S extends UIDAttributeOptions = UIDAttributeOptions + S extends UIDOptions = UIDOptions > { targetField?: U; - options?: UIDAttributeOptions & S; + options?: UIDOptions & S; } -export type UIDAttribute< +export type UID< // Own Schema Reference - T extends SchemaUID | undefined = undefined, + T extends Common.UID.Schema | undefined = undefined, // Target attribute - U extends T extends SchemaUID - ? GetAttributesKeysByType + U extends T extends Common.UID.Schema + ? Attribute.GetKeysByType : undefined = undefined, // UID options - S extends UIDAttributeOptions = UIDAttributeOptions -> = Attribute<'uid'> & + S extends UIDOptions = UIDOptions +> = Attribute.Attribute<'uid'> & // Properties - UIDAttributeProperties & + UIDProperties & // Options - ConfigurableOption & - DefaultOption & - MinMaxLengthOption & - PrivateOption & - RequiredOption; + Attribute.ConfigurableOption & + Attribute.DefaultOption & + Attribute.MinMaxLengthOption & + Attribute.PrivateOption & + Attribute.RequiredOption; export type UIDValue = string; -export type GetUIDAttributeValue = T extends UIDAttribute +export type GetUIDValue = T extends UID ? UIDValue : never; diff --git a/packages/core/strapi/lib/types/core/attributes/utils.d.ts b/packages/core/strapi/lib/types/core/attributes/utils.d.ts index 9c76a28f15..774fc388cc 100644 --- a/packages/core/strapi/lib/types/core/attributes/utils.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/utils.d.ts @@ -1,98 +1,71 @@ -import { Get, KeysBy, NeverGuard, PickBy, SchemaUID } from '../../utils'; -import { - Attribute, - AttributeType, - GetBigIntegerAttributeValue, - GetBooleanAttributeValue, - GetDecimalAttributeValue, - GetDynamicZoneAttributeValue, - GetEnumerationAttributeValue, - GetFloatAttributeValue, - GetIntegerAttributeValue, - GetJsonAttributeValue, - GetMediaAttributeValue, - GetPasswordAttributeValue, - GetRelationAttributeValue, - GetRichTextAttributeValue, - GetStringAttributeValue, - GetTextAttributeValue, - GetUIDAttributeValue, - GetComponentAttributeValue, - GetEmailAttributeValue, -} from '.'; -import { GetDateAttributeValue } from './date'; -import { GetDateTimeAttributeValue } from './date-time'; -import { GetTimeAttributeValue } from './time'; -import { GetTimestampAttributeValue } from './timestamp'; +import { Attribute, Common, Utils } from '@strapi/strapi'; -export type PickTypes = T; +export type PickTypes = T; -export type GetAttributesKeysByType< - T extends SchemaUID, - U extends AttributeType, +export type GetKeysByType< + T extends Common.UID.Schema, + U extends Attribute.Type, P = never -> = KeysBy, Attribute & NeverGuard>; +> = Utils.KeysBy, Attribute.Attribute & Utils.NeverGuard>; -export type GetAttributesByType = PickBy< - GetAttributes, - Attribute & NeverGuard ->; +export type GetByType< + T extends Common.UID.Schema, + U extends Attribute.Type, + P = never +> = Utils.PickBy, Attribute.Attribute & Utils.NeverGuard>; -export type GetAttribute> = Get< - GetAttributes, +export type Get> = Utils.Get, U>; + +export type GetAll = Utils.Get; + +export type GetKeys = keyof GetAll; + +export type GetValue = + | Attribute.GetBigIntegerValue + | Attribute.GetBooleanValue + | Attribute.GetComponentValue + | Attribute.GetDecimalValue + | Attribute.GetDynamicZoneValue + | Attribute.GetEnumerationValue + | Attribute.GetEmailValue + | Attribute.GetFloatValue + | Attribute.GetIntegerValue + | Attribute.GetJsonValue + | Attribute.GetMediaValue + | Attribute.GetPasswordValue + | Attribute.GetRelationValue + | Attribute.GetRichTextValue + | Attribute.GetStringValue + | Attribute.GetTextValue + | Attribute.GetUIDValue + | Attribute.GetDateValue + | Attribute.GetDateTimeValue + | Attribute.GetTimeValue + | Attribute.GetTimestampValue; + +export type GetValueByKey> = Get< + T, U ->; - -export type GetAttributes = Get; - -export type GetAttributesKey = keyof GetAttributes; - -export type GetAttributeValue = - | GetBigIntegerAttributeValue - | GetBooleanAttributeValue - | GetComponentAttributeValue - | GetDecimalAttributeValue - | GetDynamicZoneAttributeValue - | GetEnumerationAttributeValue - | GetEmailAttributeValue - | GetFloatAttributeValue - | GetIntegerAttributeValue - | GetJsonAttributeValue - | GetMediaAttributeValue - | GetPasswordAttributeValue - | GetRelationAttributeValue - | GetRichTextAttributeValue - | GetStringAttributeValue - | GetTextAttributeValue - | GetUIDAttributeValue - | GetMediaAttributeValue - | GetDateAttributeValue - | GetDateTimeAttributeValue - | GetTimeAttributeValue - | GetTimestampAttributeValue; - -export type GetAttributeValueByKey< - T extends SchemaUID, - U extends GetAttributesKey -> = GetAttribute extends infer P - ? P extends Attribute - ? GetAttributeValue

+> extends infer P + ? P extends Attribute.Attribute + ? GetValue

: never : never; -export type GetAttributesValues = { +export type GetValues = GetKeys> = { // Handle required attributes - [key in GetAttributesRequiredKeys]-?: GetAttributeValueByKey; + [key in GetRequiredKeys as key extends U ? key : never]-?: GetValueByKey; } & { // Handle optional attributes - [key in GetAttributesOptionalKeys]?: GetAttributeValueByKey; + [key in GetOptionalKeys as key extends U ? key : never]?: GetValueByKey; }; -export type GetAttributesRequiredKeys = KeysBy< - GetAttributes, +export type GetRequiredKeys = Utils.KeysBy< + GetAll, { required: true } >; -export type GetAttributesOptionalKeys = keyof Omit< - GetAttributes, - GetAttributesRequiredKeys + +export type GetOptionalKeys = keyof Omit< + GetAll, + GetRequiredKeys >; diff --git a/packages/core/strapi/lib/types/core/index.d.ts b/packages/core/strapi/lib/types/core/index.d.ts index f6337f06f1..9b5322ad44 100644 --- a/packages/core/strapi/lib/types/core/index.d.ts +++ b/packages/core/strapi/lib/types/core/index.d.ts @@ -1,5 +1,5 @@ -export * from './attributes'; -export * from './schemas'; +export * as Attribute from './attributes'; +export * as Schema from './schemas'; export * from './strapi'; export * as Common from './common'; diff --git a/packages/core/strapi/lib/types/core/schemas/index.d.ts b/packages/core/strapi/lib/types/core/schemas/index.d.ts index 6fadf21e4a..d96739932d 100644 --- a/packages/core/strapi/lib/types/core/schemas/index.d.ts +++ b/packages/core/strapi/lib/types/core/schemas/index.d.ts @@ -1,5 +1,4 @@ -import { Attribute, ComponentAttribute } from '../attributes'; -import { KeysBy, SchemaUID, StringRecord } from '../../utils'; +import type { Attribute, Utils, Common } from '@strapi/strapi'; /** * Literal union type representing the possible natures of a content type @@ -9,7 +8,7 @@ export type ContentTypeKind = 'singleType' | 'collectionType'; /** * Literal union type representing the possible types of a model */ -export type SchemaModelType = 'contentType' | 'component'; +export type ModelType = 'contentType' | 'component'; /** * Data structure that can either represent a content type or a component @@ -18,17 +17,17 @@ export interface Schema { /** * The type of the model. Useful to discriminate content-types from component */ - modelType: SchemaModelType; + modelType: ModelType; /** * Informations about schema naming and display */ - info: SchemaInfo; + info: Info; /** * Map of all the attributes with their name and definition */ - attributes: SchemaAttributes; + attributes: Attributes; /** * Options declared and read by the plugins @@ -38,7 +37,7 @@ export interface Schema { /** * Options object dedicated to Strapi core features */ - options?: SchemaOptions; + options?: Options; /** * Custom table name for the schema @@ -49,7 +48,7 @@ export interface Schema { /** * Data structure containing naming and display information for a Schema */ -export interface SchemaInfo { +export interface Info { /** * Default name to use in the admin panel */ @@ -79,12 +78,12 @@ export interface SchemaInfo { /** * Low level data structure referencing every schema attribute and its name */ -export interface SchemaAttributes extends StringRecord {} +export interface Attributes extends Utils.StringRecord {} /** * Structure containing every core schema options and their associated value */ -export interface SchemaOptions { +export interface Options { draftAndPublish?: boolean; populateCreatorFields?: boolean; comment?: string; @@ -95,13 +94,13 @@ export interface PluginOptions {} /** * Schema for a content type */ -export interface ContentTypeSchema extends Schema { +export interface ContentType extends Schema { modelType: 'contentType'; /** * Unique identifier of the schema */ - uid: SchemaUID; + uid: Common.UID.ContentType; /** * Determine the type of the content type (single-type or collection-type) @@ -112,20 +111,20 @@ export interface ContentTypeSchema extends Schema { /** * Schema for a collection type */ -export interface CollectionTypeSchema extends ContentTypeSchema { +export interface CollectionType extends ContentType { kind: 'collectionType'; } /** * Schema for a single type */ -export interface SingleTypeSchema extends ContentTypeSchema { +export interface SingleType extends ContentType { kind: 'singleType'; } /** * Schema for a component */ -export interface ComponentSchema extends Schema { +export interface Component extends Schema { modelType: 'component'; } diff --git a/packages/core/strapi/lib/types/index.d.ts b/packages/core/strapi/lib/types/index.d.ts index 502bee2dff..a3bcde46f7 100644 --- a/packages/core/strapi/lib/types/index.d.ts +++ b/packages/core/strapi/lib/types/index.d.ts @@ -1,7 +1,7 @@ // Exports from core should already be modules export * from './core'; -export * as utils from './utils'; -export * as factories from './factories'; +export * as Utils from './utils'; +export * as Factories from './factories'; export * as Shared from './shared'; From 7761efdf6dfae4e79a2fb8cec475825713521928 Mon Sep 17 00:00:00 2001 From: Convly Date: Wed, 17 May 2023 14:00:36 +0200 Subject: [PATCH 029/172] Update the ts generators to fit the new type system --- .../generators/{schemas => common}/imports.js | 14 +- .../typescript/lib/generators/common/index.js | 9 + .../{schemas => common/models}/attributes.js | 67 +++--- .../lib/generators/common/models/index.js | 15 ++ .../{schemas => common/models}/mappers.js | 48 ++-- .../{schemas => common/models}/schema.js | 13 +- .../{schemas => common/models}/utils.js | 33 ++- .../lib/generators/components/index.js | 64 +++++ .../typescript/lib/generators/constants.js | 7 + .../lib/generators/content-types/index.js | 64 +++++ .../utils/typescript/lib/generators/index.js | 123 +++++++++- .../lib/generators/schemas/global.js | 67 ------ .../lib/generators/schemas/index.js | 185 --------------- .../utils/typescript/lib/generators/utils.js | 222 ++++++++++++++++++ 14 files changed, 599 insertions(+), 332 deletions(-) rename packages/utils/typescript/lib/generators/{schemas => common}/imports.js (63%) create mode 100644 packages/utils/typescript/lib/generators/common/index.js rename packages/utils/typescript/lib/generators/{schemas => common/models}/attributes.js (69%) create mode 100644 packages/utils/typescript/lib/generators/common/models/index.js rename packages/utils/typescript/lib/generators/{schemas => common/models}/mappers.js (65%) rename packages/utils/typescript/lib/generators/{schemas => common/models}/schema.js (91%) rename packages/utils/typescript/lib/generators/{schemas => common/models}/utils.js (85%) create mode 100644 packages/utils/typescript/lib/generators/components/index.js create mode 100644 packages/utils/typescript/lib/generators/constants.js create mode 100644 packages/utils/typescript/lib/generators/content-types/index.js delete mode 100644 packages/utils/typescript/lib/generators/schemas/global.js delete mode 100644 packages/utils/typescript/lib/generators/schemas/index.js create mode 100644 packages/utils/typescript/lib/generators/utils.js diff --git a/packages/utils/typescript/lib/generators/schemas/imports.js b/packages/utils/typescript/lib/generators/common/imports.js similarity index 63% rename from packages/utils/typescript/lib/generators/schemas/imports.js rename to packages/utils/typescript/lib/generators/common/imports.js index b5b31fcc33..9d1311ecf4 100644 --- a/packages/utils/typescript/lib/generators/schemas/imports.js +++ b/packages/utils/typescript/lib/generators/common/imports.js @@ -22,11 +22,13 @@ module.exports = { factory.createImportSpecifier(false, undefined, factory.createIdentifier(key)) ); - return factory.createImportDeclaration( - undefined, - factory.createImportClause(false, undefined, factory.createNamedImports(formattedImports)), - factory.createStringLiteral('@strapi/strapi'), - undefined - ); + return [ + factory.createImportDeclaration( + undefined, + factory.createImportClause(true, undefined, factory.createNamedImports(formattedImports)), + factory.createStringLiteral('@strapi/strapi'), + undefined + ), + ]; }, }; diff --git a/packages/utils/typescript/lib/generators/common/index.js b/packages/utils/typescript/lib/generators/common/index.js new file mode 100644 index 0000000000..80acf5673d --- /dev/null +++ b/packages/utils/typescript/lib/generators/common/index.js @@ -0,0 +1,9 @@ +'use strict'; + +const models = require('./models'); +const imports = require('./imports'); + +module.exports = { + models, + imports, +}; diff --git a/packages/utils/typescript/lib/generators/schemas/attributes.js b/packages/utils/typescript/lib/generators/common/models/attributes.js similarity index 69% rename from packages/utils/typescript/lib/generators/schemas/attributes.js rename to packages/utils/typescript/lib/generators/common/models/attributes.js index 30c5c756b3..1efdc45d1e 100644 --- a/packages/utils/typescript/lib/generators/schemas/attributes.js +++ b/packages/utils/typescript/lib/generators/common/models/attributes.js @@ -3,8 +3,8 @@ const { factory } = require('typescript'); const _ = require('lodash/fp'); -const { addImport } = require('./imports'); -const { getTypeNode, toTypeLiteral } = require('./utils'); +const { addImport } = require('../imports'); +const { getTypeNode, toTypeLiteral, withAttributeNamespace, NAMESPACES } = require('./utils'); const mappers = require('./mappers'); /** @@ -26,7 +26,8 @@ const getAttributeType = (attributeName, attribute, uid) => { const [attributeType, typeParams] = mappers[attribute.type]({ uid, attribute, attributeName }); - addImport(attributeType); + // Make sure the attribute namespace is imported + addImport(NAMESPACES.attribute); return getTypeNode(attributeType, typeParams); }; @@ -42,38 +43,36 @@ const getAttributeModifiers = (attribute) => { // Required if (attribute.required) { - addImport('RequiredAttribute'); - - modifiers.push(factory.createTypeReferenceNode(factory.createIdentifier('RequiredAttribute'))); + modifiers.push( + factory.createTypeReferenceNode(factory.createIdentifier(withAttributeNamespace('Required'))) + ); } // Private if (attribute.private) { - addImport('PrivateAttribute'); - - modifiers.push(factory.createTypeReferenceNode(factory.createIdentifier('PrivateAttribute'))); + modifiers.push( + factory.createTypeReferenceNode(factory.createIdentifier(withAttributeNamespace('Private'))) + ); } // Unique if (attribute.unique) { - addImport('UniqueAttribute'); - - modifiers.push(factory.createTypeReferenceNode(factory.createIdentifier('UniqueAttribute'))); + modifiers.push( + factory.createTypeReferenceNode(factory.createIdentifier(withAttributeNamespace('Unique'))) + ); } // Configurable if (attribute.configurable) { - addImport('ConfigurableAttribute'); - modifiers.push( - factory.createTypeReferenceNode(factory.createIdentifier('ConfigurableAttribute')) + factory.createTypeReferenceNode( + factory.createIdentifier(withAttributeNamespace('Configurable')) + ) ); } // Custom field if (attribute.customField) { - addImport('CustomField'); - const customFieldUid = factory.createStringLiteral(attribute.customField); const typeArguments = [customFieldUid]; @@ -82,17 +81,18 @@ const getAttributeModifiers = (attribute) => { } modifiers.push( - factory.createTypeReferenceNode(factory.createIdentifier('CustomField'), typeArguments) + factory.createTypeReferenceNode( + factory.createIdentifier(withAttributeNamespace('CustomField')), + typeArguments + ) ); } // Plugin Options if (!_.isEmpty(attribute.pluginOptions)) { - addImport('SetPluginOptions'); - modifiers.push( factory.createTypeReferenceNode( - factory.createIdentifier('SetPluginOptions'), + factory.createIdentifier(withAttributeNamespace('SetPluginOptions')), // Transform the pluginOptions object into an object literal expression [toTypeLiteral(attribute.pluginOptions)] ) @@ -102,38 +102,37 @@ const getAttributeModifiers = (attribute) => { // Min / Max // TODO: Always provide a second type argument for min/max (ie: resolve the attribute scalar type with a `GetAttributeType<${mappers[attribute][0]}>` (useful for biginter (string values))) if (!_.isNil(attribute.min) || !_.isNil(attribute.max)) { - addImport('SetMinMax'); - const minMaxProperties = _.pick(['min', 'max'], attribute); modifiers.push( - factory.createTypeReferenceNode(factory.createIdentifier('SetMinMax'), [ - toTypeLiteral(minMaxProperties), - ]) + factory.createTypeReferenceNode( + factory.createIdentifier(withAttributeNamespace('SetMinMax')), + [toTypeLiteral(minMaxProperties)] + ) ); } // Min length / Max length if (!_.isNil(attribute.minLength) || !_.isNil(attribute.maxLength)) { - addImport('SetMinMaxLength'); - const minMaxProperties = _.pick(['minLength', 'maxLength'], attribute); modifiers.push( - factory.createTypeReferenceNode(factory.createIdentifier('SetMinMaxLength'), [ - toTypeLiteral(minMaxProperties), - ]) + factory.createTypeReferenceNode( + factory.createIdentifier(withAttributeNamespace('SetMinMaxLength')), + [toTypeLiteral(minMaxProperties)] + ) ); } // Default if (!_.isNil(attribute.default)) { - addImport('DefaultTo'); - const defaultLiteral = toTypeLiteral(attribute.default); modifiers.push( - factory.createTypeReferenceNode(factory.createIdentifier('DefaultTo'), [defaultLiteral]) + factory.createTypeReferenceNode( + factory.createIdentifier(withAttributeNamespace('DefaultTo')), + [defaultLiteral] + ) ); } diff --git a/packages/utils/typescript/lib/generators/common/models/index.js b/packages/utils/typescript/lib/generators/common/models/index.js new file mode 100644 index 0000000000..32c632306b --- /dev/null +++ b/packages/utils/typescript/lib/generators/common/models/index.js @@ -0,0 +1,15 @@ +'use strict'; + +const schema = require('./schema'); +const attributes = require('./attributes'); +const mappers = require('./mappers'); +const utils = require('./utils'); +const imports = require('../imports'); + +module.exports = { + schema, + attributes, + mappers, + utils, + imports, +}; diff --git a/packages/utils/typescript/lib/generators/schemas/mappers.js b/packages/utils/typescript/lib/generators/common/models/mappers.js similarity index 65% rename from packages/utils/typescript/lib/generators/schemas/mappers.js rename to packages/utils/typescript/lib/generators/common/models/mappers.js index c991855189..68e988d94e 100644 --- a/packages/utils/typescript/lib/generators/schemas/mappers.js +++ b/packages/utils/typescript/lib/generators/common/models/mappers.js @@ -3,56 +3,56 @@ const ts = require('typescript'); const _ = require('lodash/fp'); -const { toTypeLiteral } = require('./utils'); +const { toTypeLiteral, withAttributeNamespace } = require('./utils'); const { factory } = ts; module.exports = { string() { - return ['StringAttribute']; + return [withAttributeNamespace('String')]; }, text() { - return ['TextAttribute']; + return [withAttributeNamespace('Text')]; }, richtext() { - return ['RichTextAttribute']; + return [withAttributeNamespace('RichText')]; }, password() { - return ['PasswordAttribute']; + return [withAttributeNamespace('Password')]; }, email() { - return ['EmailAttribute']; + return [withAttributeNamespace('Email')]; }, date() { - return ['DateAttribute']; + return [withAttributeNamespace('Date')]; }, time() { - return ['TimeAttribute']; + return [withAttributeNamespace('Time')]; }, datetime() { - return ['DateTimeAttribute']; + return [withAttributeNamespace('DateTime')]; }, timestamp() { - return ['TimestampAttribute']; + return [withAttributeNamespace('Timestamp')]; }, integer() { - return ['IntegerAttribute']; + return [withAttributeNamespace('Integer')]; }, biginteger() { - return ['BigIntegerAttribute']; + return [withAttributeNamespace('BigInteger')]; }, float() { - return ['FloatAttribute']; + return [withAttributeNamespace('Float')]; }, decimal() { - return ['DecimalAttribute']; + return [withAttributeNamespace('Decimal')]; }, uid({ attribute, uid }) { const { targetField, options } = attribute; // If there are no params to compute, then return the attribute type alone if (targetField === undefined && options === undefined) { - return ['UIDAttribute']; + return [withAttributeNamespace('UID')]; } const params = []; @@ -74,21 +74,21 @@ module.exports = { params.push(toTypeLiteral(options)); } - return ['UIDAttribute', params]; + return [withAttributeNamespace('UID'), params]; }, enumeration({ attribute }) { const { enum: enumValues } = attribute; - return ['EnumerationAttribute', [toTypeLiteral(enumValues)]]; + return [withAttributeNamespace('Enumeration'), [toTypeLiteral(enumValues)]]; }, boolean() { - return ['BooleanAttribute']; + return [withAttributeNamespace('Boolean')]; }, json() { - return ['JSONAttribute']; + return [withAttributeNamespace('JSON')]; }, media() { - return ['MediaAttribute']; + return [withAttributeNamespace('Media')]; }, relation({ uid, attribute }) { const { relation, target } = attribute; @@ -97,13 +97,13 @@ module.exports = { if (isMorphRelation) { return [ - 'RelationAttribute', + withAttributeNamespace('Relation'), [factory.createStringLiteral(uid, true), factory.createStringLiteral(relation, true)], ]; } return [ - 'RelationAttribute', + withAttributeNamespace('Relation'), [ factory.createStringLiteral(uid, true), factory.createStringLiteral(relation, true), @@ -119,13 +119,13 @@ module.exports = { params.push(factory.createTrue()); } - return ['ComponentAttribute', params]; + return [withAttributeNamespace('Component'), params]; }, dynamiczone({ attribute }) { const componentsParam = factory.createTupleTypeNode( attribute.components.map((component) => factory.createStringLiteral(component)) ); - return ['DynamicZoneAttribute', [componentsParam]]; + return [withAttributeNamespace('DynamicZone'), [componentsParam]]; }, }; diff --git a/packages/utils/typescript/lib/generators/schemas/schema.js b/packages/utils/typescript/lib/generators/common/models/schema.js similarity index 91% rename from packages/utils/typescript/lib/generators/schemas/schema.js rename to packages/utils/typescript/lib/generators/common/models/schema.js index e0962a40c1..d4eef1b815 100644 --- a/packages/utils/typescript/lib/generators/schemas/schema.js +++ b/packages/utils/typescript/lib/generators/common/models/schema.js @@ -4,9 +4,14 @@ const ts = require('typescript'); const { factory } = require('typescript'); const { isEmpty } = require('lodash/fp'); -const { getSchemaExtendsTypeName, getSchemaInterfaceName, toTypeLiteral } = require('./utils'); +const { + getSchemaExtendsTypeName, + getSchemaInterfaceName, + toTypeLiteral, + NAMESPACES, +} = require('./utils'); const attributeToPropertySignature = require('./attributes'); -const { addImport } = require('./imports'); +const { addImport } = require('../imports'); /** * Generate a property signature for the schema's `attributes` field @@ -51,8 +56,8 @@ const generateSchemaDefinition = (schema) => { const interfaceName = getSchemaInterfaceName(uid); const parentType = getSchemaExtendsTypeName(schema); - // Make sure the extended interface are imported - addImport(parentType); + // Make sure the Schema namespace is imported + addImport(NAMESPACES.schema); // Properties whose values can be mapped to a literal type expression const literalPropertiesDefinitions = ['collectionName', 'info', 'options', 'pluginOptions'] diff --git a/packages/utils/typescript/lib/generators/schemas/utils.js b/packages/utils/typescript/lib/generators/common/models/utils.js similarity index 85% rename from packages/utils/typescript/lib/generators/schemas/utils.js rename to packages/utils/typescript/lib/generators/common/models/utils.js index df84117597..efdbe9292f 100644 --- a/packages/utils/typescript/lib/generators/schemas/utils.js +++ b/packages/utils/typescript/lib/generators/common/models/utils.js @@ -17,13 +17,10 @@ const { propEq, } = require('lodash/fp'); -/** - * Get all components and content-types in a Strapi application - * - * @param {Strapi} strapi - * @returns {object} - */ -const getAllStrapiSchemas = (strapi) => ({ ...strapi.contentTypes, ...strapi.components }); +const NAMESPACES = { + schema: 'Schema', + attribute: 'Attribute', +}; /** * Extract a valid interface name from a schema uid @@ -58,7 +55,7 @@ const getSchemaModelType = (schema) => { const getSchemaExtendsTypeName = (schema) => { const base = getSchemaModelType(schema); - return `${upperFirst(base)}Schema`; + return `${NAMESPACES.schema}.${upperFirst(base)}`; }; /** @@ -143,8 +140,26 @@ const getDefinitionAttributesCount = (definition) => { return attributesNode.type.members.length; }; +/** + * Add the attribute namespace before the typename + * + * @param {string} typeName + * @returns {string} + */ +const withAttributeNamespace = (typeName) => `${NAMESPACES.attribute}.${typeName}`; + +/** + * Add the schema namespace before the typename + * + * @param {string} typeName + * @returns {string} + */ +const withSchemaNamespace = (typeName) => `${NAMESPACES.schema}.${typeName}`; + module.exports = { - getAllStrapiSchemas, + NAMESPACES, + withAttributeNamespace, + withSchemaNamespace, getSchemaInterfaceName, getSchemaExtendsTypeName, getSchemaModelType, diff --git a/packages/utils/typescript/lib/generators/components/index.js b/packages/utils/typescript/lib/generators/components/index.js new file mode 100644 index 0000000000..b6941f84f4 --- /dev/null +++ b/packages/utils/typescript/lib/generators/components/index.js @@ -0,0 +1,64 @@ +'use strict'; + +const { factory } = require('typescript'); + +const { models } = require('../common'); +const { + emitDefinitions, + format, + generateSharedExtensionDefinition, + generateLocalDirectoryImportDefinition, +} = require('../utils'); + +/** + * Generate type definitions for Strapi Components + * + * @param {object} [options] + * @param {object} options.strapi + * @param {object} options.logger + * @param {string} options.pwd + */ +const generateComponentsDefinitions = async (options = {}) => { + const { strapi } = options; + + const { components } = strapi; + + const componentsDefinitions = Object.values(components).map((contentType) => ({ + uid: contentType.uid, + definition: models.schema.generateSchemaDefinition(contentType), + })); + + const formattedSchemasDefinitions = componentsDefinitions.reduce((acc, def) => { + acc.push( + // Definition + def.definition, + + // Add a newline between each interface declaration + factory.createIdentifier('\n') + ); + + return acc; + }, []); + + const allDefinitions = [ + // Imports + ...models.imports.generateImportDefinition(), + generateLocalDirectoryImportDefinition(), + + // Add a newline after the import statement + factory.createIdentifier('\n'), + + // Schemas + ...formattedSchemasDefinitions, + + // Global + generateSharedExtensionDefinition('Components', componentsDefinitions), + ]; + + const output = emitDefinitions(allDefinitions); + const formattedOutput = await format(output); + + return { output: formattedOutput, stats: {} }; +}; + +module.exports = generateComponentsDefinitions; diff --git a/packages/utils/typescript/lib/generators/constants.js b/packages/utils/typescript/lib/generators/constants.js new file mode 100644 index 0000000000..beaebf8776 --- /dev/null +++ b/packages/utils/typescript/lib/generators/constants.js @@ -0,0 +1,7 @@ +'use strict'; + +const path = require('path'); + +const REGISTRIES_OUT_DIR = path.join('types', 'shared', 'registries'); + +module.exports = { REGISTRIES_OUT_DIR }; diff --git a/packages/utils/typescript/lib/generators/content-types/index.js b/packages/utils/typescript/lib/generators/content-types/index.js new file mode 100644 index 0000000000..f6f7e836e6 --- /dev/null +++ b/packages/utils/typescript/lib/generators/content-types/index.js @@ -0,0 +1,64 @@ +'use strict'; + +const { factory } = require('typescript'); + +const { models } = require('../common'); +const { + emitDefinitions, + format, + generateSharedExtensionDefinition, + generateLocalDirectoryImportDefinition, +} = require('../utils'); + +/** + * Generate type definitions for Strapi Content-Types + * + * @param {object} [options] + * @param {object} options.strapi + * @param {object} options.logger + * @param {string} options.pwd + */ +const generateContentTypesDefinitions = async (options = {}) => { + const { strapi } = options; + + const { contentTypes } = strapi; + + const contentTypesDefinitions = Object.values(contentTypes).map((contentType) => ({ + uid: contentType.uid, + definition: models.schema.generateSchemaDefinition(contentType), + })); + + const formattedSchemasDefinitions = contentTypesDefinitions.reduce((acc, def) => { + acc.push( + // Definition + def.definition, + + // Add a newline between each interface declaration + factory.createIdentifier('\n') + ); + + return acc; + }, []); + + const allDefinitions = [ + // Imports + ...models.imports.generateImportDefinition(), + generateLocalDirectoryImportDefinition(), + + // Add a newline after the import statement + factory.createIdentifier('\n'), + + // Schemas + ...formattedSchemasDefinitions, + + // Global + generateSharedExtensionDefinition('ContentTypes', contentTypesDefinitions), + ]; + + const output = emitDefinitions(allDefinitions); + const formattedOutput = await format(output); + + return { output: formattedOutput, stats: {} }; +}; + +module.exports = generateContentTypesDefinitions; diff --git a/packages/utils/typescript/lib/generators/index.js b/packages/utils/typescript/lib/generators/index.js index f7fb9e53a7..a52062251a 100644 --- a/packages/utils/typescript/lib/generators/index.js +++ b/packages/utils/typescript/lib/generators/index.js @@ -1,7 +1,124 @@ 'use strict'; -const generateSchemasDefinitions = require('./schemas'); +const path = require('path'); +const chalk = require('chalk'); -module.exports = { - generateSchemasDefinitions, +const { REGISTRIES_OUT_DIR } = require('./constants'); +const { saveDefinitionToFileSystem, createLogger, timer } = require('./utils'); +const generateContentTypesDefinitions = require('./content-types'); +const generateComponentsDefinitions = require('./components'); + +const GENERATORS = { + contentTypes: generateContentTypesDefinitions, + components: generateComponentsDefinitions, }; + +/** + * @typedef GenerateConfig + * + * @property {object} strapi + * @property {boolean} pwd + * @property {object} [artefacts] + * @property {boolean} [artefacts.contentTypes] + * @property {boolean} [artefacts.components] + * @property {boolean} [artefacts.services] + * @property {boolean} [artefacts.controllers] + * @property {boolean} [artefacts.policies] + * @property {boolean} [artefacts.middlewares] + * @property {object} [logger] + * @property {boolean} [logger.silent] + * @property {boolean} [logger.debug] + * @property {boolean} [logger.verbose] + */ + +/** + * Generate types definitions based on the given configuration + * + * @param {GenerateConfig} [config] + */ +const generate = async (config = {}) => { + const { pwd, strapi, artefacts = {}, logger: loggerConfig } = config; + const reports = {}; + const logger = createLogger(loggerConfig); + const psTimer = timer().start(); + + const registryPwd = path.join(pwd, REGISTRIES_OUT_DIR); + const generatorConfig = { strapi, pwd: registryPwd, logger }; + + const returnWithMessage = () => { + const nbWarnings = chalk.yellow(maybePlural('warning', logger.warnings)); + const nbErrors = chalk.red(maybePlural('error', logger.errors)); + + const status = logger.errors > 0 ? chalk.red('errored') : chalk.green('completed successfully'); + + psTimer.end(); + + logger.info(`The task ${status} with ${nbWarnings} and ${nbErrors} in ${psTimer.duration}s.`); + + return reports; + }; + + const enabledArtefacts = Object.keys(artefacts).filter((p) => artefacts[p] === true); + + logger.info('Starting the type generation process'); + logger.debug(`Enabled artefacts: ${enabledArtefacts.join(', ')}`); + + for (const artefact of enabledArtefacts) { + const boldArtefact = chalk.bold(artefact); // used for log messages + + logger.info(`Generating types for ${boldArtefact}`); + + if (artefact in GENERATORS) { + const generator = GENERATORS[artefact]; + + try { + const artefactGenTimer = timer().start(); + + reports[artefact] = await generator(generatorConfig); + + artefactGenTimer.end(); + + logger.debug(`Generated ${boldArtefact} in ${artefactGenTimer.duration}s`); + } catch (e) { + logger.error( + `Failed to generate types for ${boldArtefact}: ${e.message ?? e.toString()}. Exiting` + ); + return returnWithMessage(); + } + } else { + logger.warn(`The types generator for ${boldArtefact} is not implemented, skipping`); + } + } + + for (const artefact of Object.keys(reports)) { + const boldArtefact = chalk.bold(artefact); // used for log messages + + const artefactFsTimer = timer().start(); + + const report = reports[artefact]; + const filename = `${artefact}.d.ts`; + + try { + const outPath = await saveDefinitionToFileSystem(registryPwd, filename, report.output); + const relativeOutPath = path.relative(__dirname, outPath); + + artefactFsTimer.end(); + + logger.info(`Saved ${boldArtefact} types in ${chalk.bold(relativeOutPath)}`); + logger.debug(`Saved ${boldArtefact} in ${artefactFsTimer.duration}s`); + } catch (e) { + logger.error( + `An error occurred while saving ${boldArtefact} types to the filesystem: ${ + e.message ?? e.toString() + }. Exiting` + ); + return returnWithMessage(); + } + } + + return returnWithMessage(); +}; + +const maybePlural = (word, n) => `${n} ${word}${n > 1 ? 's' : ''}`; + +module.exports = { generate }; diff --git a/packages/utils/typescript/lib/generators/schemas/global.js b/packages/utils/typescript/lib/generators/schemas/global.js deleted file mode 100644 index 64fd4d06f5..0000000000 --- a/packages/utils/typescript/lib/generators/schemas/global.js +++ /dev/null @@ -1,67 +0,0 @@ -'use strict'; - -/* eslint-disable no-bitwise */ - -const ts = require('typescript'); -const { factory } = require('typescript'); - -const { getSchemaInterfaceName } = require('./utils'); - -/** - * - * @param {object} schemaDefinition - * @param {ts.InterfaceDeclaration} schemaDefinition.definition - * @param {object} schemaDefinition.schema - */ -const schemaDefinitionToPropertySignature = ({ schema }) => { - const { uid } = schema; - - const interfaceTypeName = getSchemaInterfaceName(uid); - - return factory.createPropertySignature( - undefined, - factory.createStringLiteral(uid, true), - undefined, - factory.createTypeReferenceNode(factory.createIdentifier(interfaceTypeName)) - ); -}; - -/** - * Generate the global module augmentation block - * - * @param {Array<{ schema: object; definition: ts.TypeNode }>} schemasDefinitions - * @returns {ts.ModuleDeclaration} - */ -const generateGlobalDefinition = (schemasDefinitions = []) => { - const properties = schemasDefinitions.map(schemaDefinitionToPropertySignature); - - return factory.createModuleDeclaration( - [factory.createModifier(ts.SyntaxKind.DeclareKeyword)], - factory.createIdentifier('global'), - factory.createModuleBlock([ - factory.createModuleDeclaration( - undefined, - factory.createIdentifier('Strapi'), - factory.createModuleBlock([ - factory.createInterfaceDeclaration( - undefined, - factory.createIdentifier('Schemas'), - undefined, - undefined, - properties - ), - ]), - ts.NodeFlags.Namespace | - ts.NodeFlags.ExportContext | - ts.NodeFlags.Ambient | - ts.NodeFlags.ContextFlags - ), - ]), - ts.NodeFlags.ExportContext | - ts.NodeFlags.GlobalAugmentation | - ts.NodeFlags.Ambient | - ts.NodeFlags.ContextFlags - ); -}; - -module.exports = { generateGlobalDefinition }; diff --git a/packages/utils/typescript/lib/generators/schemas/index.js b/packages/utils/typescript/lib/generators/schemas/index.js deleted file mode 100644 index 31086881e2..0000000000 --- a/packages/utils/typescript/lib/generators/schemas/index.js +++ /dev/null @@ -1,185 +0,0 @@ -'use strict'; - -const path = require('path'); - -const ts = require('typescript'); -const { factory } = require('typescript'); - -const fp = require('lodash/fp'); -const fse = require('fs-extra'); -const prettier = require('prettier'); -const chalk = require('chalk'); -const CLITable = require('cli-table3'); - -const { generateImportDefinition } = require('./imports'); -const { generateSchemaDefinition } = require('./schema'); -const { generateGlobalDefinition } = require('./global'); -const { - getAllStrapiSchemas, - getSchemaInterfaceName, - getSchemaModelType, - getDefinitionAttributesCount, -} = require('./utils'); - -const DEFAULT_OUT_FILENAME = 'schemas.d.ts'; - -const emitDefinitions = (definitions) => { - const nodeArray = factory.createNodeArray(definitions); - - const sourceFile = ts.createSourceFile( - 'placeholder.ts', - '', - ts.ScriptTarget.ESNext, - true, - ts.ScriptKind.TS - ); - - const printer = ts.createPrinter({ omitTrailingSemicolon: true }); - - return printer.printList(ts.ListFormat.MultiLine, nodeArray, sourceFile); -}; - -const saveDefinitionToFileSystem = async (dir, file, content) => { - const filepath = path.join(dir, file); - - await fse.writeFile(filepath, content); - - return filepath; -}; - -/** - * Format the given definitions. - * Uses the existing config if one is defined in the project. - * - * @param {string} content - * @returns {Promise} - */ -const format = async (content) => { - const configFile = await prettier.resolveConfigFile(); - const config = configFile - ? await prettier.resolveConfig(configFile) - : // Default config - { - singleQuote: true, - useTabs: false, - tabWidth: 2, - }; - - Object.assign(config, { parser: 'typescript' }); - - return prettier.format(content, config); -}; - -const logDebugInformation = (definitions, options = {}) => { - const { filepath, verbose, silent } = options; - - if (verbose) { - const table = new CLITable({ - head: [ - chalk.bold(chalk.green('Model Type')), - chalk.bold(chalk.blue('UID')), - chalk.bold(chalk.blue('Type')), - chalk.bold(chalk.gray('Attributes Count')), - ], - colAligns: ['center', 'left', 'left', 'center'], - }); - - const sortedDefinitions = definitions.map((def) => ({ - ...def, - attributesCount: getDefinitionAttributesCount(def.definition), - })); - - for (const { schema, attributesCount } of sortedDefinitions) { - const modelType = fp.upperFirst(getSchemaModelType(schema)); - const interfaceType = getSchemaInterfaceName(schema.uid); - - table.push([ - chalk.greenBright(modelType), - chalk.blue(schema.uid), - chalk.blue(interfaceType), - chalk.grey(fp.isNil(attributesCount) ? 'N/A' : attributesCount), - ]); - } - - // Table - console.log(table.toString()); - } - - if (!silent) { - // Metrics - console.log( - chalk.greenBright( - `Generated ${definitions.length} type definition for your Strapi application's schemas.` - ) - ); - - // Filepath - const relativePath = path.relative(process.cwd(), filepath); - - console.log( - chalk.grey(`The definitions file has been generated here: ${chalk.bold(relativePath)}`) - ); - } -}; - -/** - * Generate type definitions for Strapi schemas - * - * @param {object} options - * @param {Strapi} options.strapi - * @param {{ distDir: string; appDir: string; }} options.dirs - * @param {string} [options.outDir] - * @param {string} [options.file] - * @param {boolean} [options.verbose] - */ -const generateSchemasDefinitions = async (options = {}) => { - const { - strapi, - outDir = process.cwd(), - file = DEFAULT_OUT_FILENAME, - verbose = false, - silent = false, - } = options; - - const schemas = getAllStrapiSchemas(strapi); - - const schemasDefinitions = Object.values(schemas).map((schema) => ({ - schema, - definition: generateSchemaDefinition(schema), - })); - - const formattedSchemasDefinitions = schemasDefinitions.reduce((acc, def) => { - acc.push( - // Definition - def.definition, - - // Add a newline between each interface declaration - factory.createIdentifier('\n') - ); - - return acc; - }, []); - - const allDefinitions = [ - // Imports - generateImportDefinition(), - - // Add a newline after the import statement - factory.createIdentifier('\n'), - - // Schemas - ...formattedSchemasDefinitions, - - // Global - generateGlobalDefinition(schemasDefinitions), - ]; - - const output = emitDefinitions(allDefinitions); - const formattedOutput = await format(output); - - const definitionFilepath = await saveDefinitionToFileSystem(outDir, file, formattedOutput); - - logDebugInformation(schemasDefinitions, { filepath: definitionFilepath, verbose, silent }); -}; - -module.exports = generateSchemasDefinitions; diff --git a/packages/utils/typescript/lib/generators/utils.js b/packages/utils/typescript/lib/generators/utils.js new file mode 100644 index 0000000000..f4fc637578 --- /dev/null +++ b/packages/utils/typescript/lib/generators/utils.js @@ -0,0 +1,222 @@ +'use strict'; + +const ts = require('typescript'); +const prettier = require('prettier'); +const fse = require('fs-extra'); +const path = require('path'); +const chalk = require('chalk'); +const assert = require('assert'); + +const { factory } = ts; + +/** + * Aggregate the given TypeScript nodes into a single string + * + * @param {ts.Node[]} definitions + * @return {string} + */ +const emitDefinitions = (definitions) => { + const nodeArray = factory.createNodeArray(definitions); + + const sourceFile = ts.createSourceFile( + 'placeholder.ts', + '', + ts.ScriptTarget.ESNext, + true, + ts.ScriptKind.TS + ); + + const printer = ts.createPrinter({ omitTrailingSemicolon: true }); + + return printer.printList(ts.ListFormat.MultiLine, nodeArray, sourceFile); +}; + +/** + * Save the given string representation of TS nodes in a file + * If the given directory doesn't exist, it'll be created automatically + * + * @param {string} dir + * @param {string} file + * @param {string} content + * + * @return {Promise} The path of the created file + */ +const saveDefinitionToFileSystem = async (dir, file, content) => { + const filepath = path.join(dir, file); + + fse.ensureDirSync(dir); + await fse.writeFile(filepath, content); + + return filepath; +}; + +/** + * Format the given definitions. + * Uses the existing config if one is defined in the project. + * + * @param {string} content + * @returns {Promise} + */ +const format = async (content) => { + const configFile = await prettier.resolveConfigFile(); + const config = configFile + ? await prettier.resolveConfig(configFile) + : // Default config + { + singleQuote: true, + useTabs: false, + tabWidth: 2, + }; + + Object.assign(config, { parser: 'typescript' }); + + return prettier.format(content, config); +}; + +/** + * Generate the import declaration for local directory + * + * @returns {ts.ImportDeclaration} + */ +const generateLocalDirectoryImportDefinition = () => { + return factory.createImportDeclaration( + undefined, + undefined, + factory.createStringLiteral('.'), + undefined + ); +}; + +/** + * Generate the extension block for a shared component from strapi/strapi + * + * @param {string} registry The registry to extend + * @param {Array<{ uid: string; definition: ts.TypeNode }>} definitions + * @returns {ts.ModuleDeclaration} + */ +const generateSharedExtensionDefinition = (registry, definitions) => { + const properties = definitions.map(({ uid, definition }) => + factory.createPropertySignature( + undefined, + factory.createStringLiteral(uid, true), + undefined, + factory.createTypeReferenceNode(factory.createIdentifier(definition.name.escapedText)) + ) + ); + + return factory.createModuleDeclaration( + [factory.createModifier(ts.SyntaxKind.DeclareKeyword)], + factory.createStringLiteral('@strapi/strapi', true), + factory.createModuleBlock([ + factory.createModuleDeclaration( + [factory.createModifier(ts.SyntaxKind.ExportKeyword)], + factory.createIdentifier('Shared'), + factory.createModuleBlock([ + factory.createInterfaceDeclaration( + [factory.createModifier(ts.SyntaxKind.ExportKeyword)], + factory.createIdentifier(registry), + undefined, + undefined, + properties + ), + ]) + ), + ]), + ts.NodeFlags.ExportContext + ); +}; + +const createLogger = (options = {}) => { + const { silent = false, debug = false } = options; + + const state = { errors: 0, warning: 0 }; + + return { + get warnings() { + return state.warning; + }, + + get errors() { + return state.errors; + }, + + debug(...args) { + if (silent || !debug) { + return; + } + + console.log(chalk.cyan(`[DEBUG]\t[${new Date().toISOString()}] (Typegen)`), ...args); + }, + + info(...args) { + if (silent) { + return; + } + + console.info(chalk.blue(`[INFO]\t[${new Date().toISOString()}] (Typegen)`), ...args); + }, + + warn(...args) { + state.warning += 1; + + if (silent) { + return; + } + + console.warn(chalk.yellow(`[WARN]\t[${new Date().toISOString()}] (Typegen)`), ...args); + }, + + error(...args) { + state.errors += 1; + + if (silent) { + return; + } + + console.error(chalk.red(`[ERROR]\t[${new Date().toISOString()}] (Typegen)`), ...args); + }, + }; +}; + +const timer = () => { + const state = { + start: null, + end: null, + }; + + return { + start() { + assert(state.start === null, 'The timer has already been started'); + assert(state.end === null, 'The timer has already been ended'); + + state.start = Date.now(); + + return this; + }, + + end() { + assert(state.start !== null, 'The timer needs to be started before ending it'); + assert(state.end === null, 'The timer has already been ended'); + + state.end = Date.now(); + + return this; + }, + + get duration() { + assert(state.start !== null, 'The timer has not been started'); + + return ((state.end ?? Date.now) - state.start) / 1000; + }, + }; +}; + +module.exports = { + emitDefinitions, + saveDefinitionToFileSystem, + format, + generateSharedExtensionDefinition, + generateLocalDirectoryImportDefinition, + createLogger, + timer, +}; From 32e685680a4f0c052ba43792a46613e486c56fca Mon Sep 17 00:00:00 2001 From: Convly Date: Wed, 17 May 2023 14:01:04 +0200 Subject: [PATCH 030/172] Fix utils/typescript unit tests --- .../generators/schemas/attributes.test.js | 102 ++++++++--------- .../generators/schemas/global.test.js | 108 ------------------ .../generators/schemas/imports.test.js | 34 +++--- .../generators/schemas/utils.test.js | 62 +--------- .../lib/generators/common/models/utils.js | 4 + 5 files changed, 78 insertions(+), 232 deletions(-) delete mode 100644 packages/utils/typescript/lib/__tests__/generators/schemas/global.test.js diff --git a/packages/utils/typescript/lib/__tests__/generators/schemas/attributes.test.js b/packages/utils/typescript/lib/__tests__/generators/schemas/attributes.test.js index 3d9f372f07..9163457b11 100644 --- a/packages/utils/typescript/lib/__tests__/generators/schemas/attributes.test.js +++ b/packages/utils/typescript/lib/__tests__/generators/schemas/attributes.test.js @@ -1,17 +1,17 @@ 'use strict'; -jest.mock('../../../generators/schemas/imports', () => ({ addImport: jest.fn() })); +jest.mock('../../../generators/common/imports', () => ({ addImport: jest.fn() })); const consoleWarnMock = jest.spyOn(console, 'warn').mockImplementation(); const ts = require('typescript'); -const attributeToPropertySignature = require('../../../generators/schemas/attributes'); +const attributeToPropertySignature = require('../../../generators/common/models/attributes'); const { getAttributeType, getAttributeModifiers, -} = require('../../../generators/schemas/attributes'); -const { addImport } = require('../../../generators/schemas/imports'); +} = require('../../../generators/common/models/attributes'); +const { addImport } = require('../../../generators/common/imports'); // TODO: emit definition (to a string) & also check snapshots based on that. It would allow checking both the structure & the output. describe('Attributes', () => { @@ -48,7 +48,7 @@ describe('Attributes', () => { expect(prop.type.types).toHaveLength(1); expect(prop.type.types[0].kind).toBe(ts.SyntaxKind.TypeReference); - expect(prop.type.types[0].typeName.escapedText).toBe('StringAttribute'); + expect(prop.type.types[0].typeName.escapedText).toBe('Attribute.String'); expect(prop.type.types[0].typeArguments).toBeUndefined(); }); @@ -60,7 +60,7 @@ describe('Attributes', () => { expect(prop.type.types).toHaveLength(1); expect(prop.type.types[0].kind).toBe(ts.SyntaxKind.TypeReference); - expect(prop.type.types[0].typeName.escapedText).toBe('ComponentAttribute'); + expect(prop.type.types[0].typeName.escapedText).toBe('Attribute.Component'); expect(prop.type.types[0].typeArguments).toHaveLength(1); expect(prop.type.types[0].typeArguments[0].kind).toBe(ts.SyntaxKind.StringLiteral); expect(prop.type.types[0].typeArguments[0].text).toBe('default.comp'); @@ -82,14 +82,14 @@ describe('Attributes', () => { const [attributeType, requiredOptionType] = prop.type.types; expect(attributeType.kind).toBe(ts.SyntaxKind.TypeReference); - expect(attributeType.typeName.escapedText).toBe('EnumerationAttribute'); + expect(attributeType.typeName.escapedText).toBe('Attribute.Enumeration'); expect(attributeType.typeArguments).toHaveLength(1); expect(attributeType.typeArguments[0].kind).toBe(ts.SyntaxKind.TupleType); expect(attributeType.typeArguments[0].elements[0].text).toBe('a'); expect(attributeType.typeArguments[0].elements[1].text).toBe('b'); expect(requiredOptionType.kind).toBe(ts.SyntaxKind.TypeReference); - expect(requiredOptionType.typeName.escapedText).toBe('DefaultTo'); + expect(requiredOptionType.typeName.escapedText).toBe('Attribute.DefaultTo'); expect(requiredOptionType.typeArguments).toHaveLength(1); expect(requiredOptionType.typeArguments[0].kind).toBe(ts.SyntaxKind.StringLiteral); expect(requiredOptionType.typeArguments[0].text).toBe('b'); @@ -108,22 +108,22 @@ describe('Attributes', () => { }); test.each([ - ['string', 'StringAttribute'], - ['text', 'TextAttribute'], - ['richtext', 'RichTextAttribute'], - ['password', 'PasswordAttribute'], - ['email', 'EmailAttribute'], - ['date', 'DateAttribute'], - ['time', 'TimeAttribute'], - ['datetime', 'DateTimeAttribute'], - ['timestamp', 'TimestampAttribute'], - ['integer', 'IntegerAttribute'], - ['biginteger', 'BigIntegerAttribute'], - ['float', 'FloatAttribute'], - ['decimal', 'DecimalAttribute'], - ['boolean', 'BooleanAttribute'], - ['json', 'JSONAttribute'], - ['media', 'MediaAttribute'], + ['string', 'Attribute.String'], + ['text', 'Attribute.Text'], + ['richtext', 'Attribute.RichText'], + ['password', 'Attribute.Password'], + ['email', 'Attribute.Email'], + ['date', 'Attribute.Date'], + ['time', 'Attribute.Time'], + ['datetime', 'Attribute.DateTime'], + ['timestamp', 'Attribute.Timestamp'], + ['integer', 'Attribute.Integer'], + ['biginteger', 'Attribute.BigInteger'], + ['float', 'Attribute.Float'], + ['decimal', 'Attribute.Decimal'], + ['boolean', 'Attribute.Boolean'], + ['json', 'Attribute.JSON'], + ['media', 'Attribute.Media'], ])('Basic %p attribute should map to a %p type', (type, expectedType) => { const typeNode = getAttributeType('foo', { type }); @@ -134,7 +134,7 @@ describe('Attributes', () => { expect(typeNode.typeArguments).toBeUndefined(); expect(consoleWarnMock).not.toHaveBeenCalled(); - expect(addImport).toHaveBeenCalledWith(expectedType); + expect(addImport).toHaveBeenCalledWith('Attribute'); }); describe('Complex types (with generic type parameters)', () => { @@ -145,7 +145,7 @@ describe('Attributes', () => { expect(typeNode.typeName.escapedText).toBe(typeName); expect(consoleWarnMock).not.toHaveBeenCalled(); - expect(addImport).toHaveBeenCalledWith(typeName); + expect(addImport).toHaveBeenCalledWith('Attribute'); }; describe('Enumeration', () => { @@ -153,7 +153,7 @@ describe('Attributes', () => { const attribute = { type: 'enumeration', enum: ['a', 'b', 'c'] }; const typeNode = getAttributeType('foo', attribute); - defaultAssertions(typeNode, 'EnumerationAttribute'); + defaultAssertions(typeNode, 'Attribute.Enumeration'); expect(typeNode.typeArguments).toHaveLength(1); expect(typeNode.typeArguments[0].kind).toBe(ts.SyntaxKind.TupleType); @@ -174,7 +174,7 @@ describe('Attributes', () => { const attribute = { type: 'uid' }; const typeNode = getAttributeType('foo', attribute); - defaultAssertions(typeNode, 'UIDAttribute'); + defaultAssertions(typeNode, 'Attribute.UID'); expect(typeNode.typeArguments).toBeUndefined(); }); @@ -183,7 +183,7 @@ describe('Attributes', () => { const attribute = { type: 'uid', targetField: 'bar' }; const typeNode = getAttributeType('foo', attribute, 'api::bar.bar'); - defaultAssertions(typeNode, 'UIDAttribute'); + defaultAssertions(typeNode, 'Attribute.UID'); expect(typeNode.typeArguments).not.toBeUndefined(); expect(typeNode.typeArguments).toHaveLength(2); @@ -199,7 +199,7 @@ describe('Attributes', () => { const attribute = { type: 'uid', options: { separator: '_' } }; const typeNode = getAttributeType('foo', attribute); - defaultAssertions(typeNode, 'UIDAttribute'); + defaultAssertions(typeNode, 'Attribute.UID'); expect(typeNode.typeArguments).toHaveLength(3); @@ -224,7 +224,7 @@ describe('Attributes', () => { const attribute = { type: 'uid', options: { separator: '_' }, targetField: 'bar' }; const typeNode = getAttributeType('foo', attribute, 'api::bar.bar'); - defaultAssertions(typeNode, 'UIDAttribute'); + defaultAssertions(typeNode, 'Attribute.UID'); expect(typeNode.typeArguments).toHaveLength(3); @@ -254,7 +254,7 @@ describe('Attributes', () => { const attribute = { type: 'relation', relation: 'oneToOne', target: 'api::bar.bar' }; const typeNode = getAttributeType('foo', attribute, 'api::foo.foo'); - defaultAssertions(typeNode, 'RelationAttribute'); + defaultAssertions(typeNode, 'Attribute.Relation'); expect(typeNode.typeArguments).toHaveLength(3); @@ -272,7 +272,7 @@ describe('Attributes', () => { const attribute = { type: 'relation', relation: 'morphMany' }; const typeNode = getAttributeType('foo', attribute, 'api::foo.foo'); - defaultAssertions(typeNode, 'RelationAttribute'); + defaultAssertions(typeNode, 'Attribute.Relation'); expect(typeNode.typeArguments).toHaveLength(2); @@ -289,7 +289,7 @@ describe('Attributes', () => { const attribute = { type: 'component', component: 'default.comp', repeatable: true }; const typeNode = getAttributeType('foo', attribute); - defaultAssertions(typeNode, 'ComponentAttribute'); + defaultAssertions(typeNode, 'Attribute.Component'); expect(typeNode.typeArguments).toHaveLength(2); @@ -303,7 +303,7 @@ describe('Attributes', () => { const attribute = { type: 'component', component: 'default.comp' }; const typeNode = getAttributeType('foo', attribute); - defaultAssertions(typeNode, 'ComponentAttribute'); + defaultAssertions(typeNode, 'Attribute.Component'); expect(typeNode.typeArguments).toHaveLength(1); @@ -317,7 +317,7 @@ describe('Attributes', () => { const attribute = { type: 'dynamiczone', components: ['default.comp1', 'default.comp2'] }; const typeNode = getAttributeType('foo', attribute); - defaultAssertions(typeNode, 'DynamicZoneAttribute'); + defaultAssertions(typeNode, 'Attribute.DynamicZone'); expect(typeNode.typeArguments).toHaveLength(1); @@ -359,7 +359,7 @@ describe('Attributes', () => { expect(modifiers).toHaveLength(1); expect(modifiers[0].kind).toBe(ts.SyntaxKind.TypeReference); - expect(modifiers[0].typeName.escapedText).toBe('RequiredAttribute'); + expect(modifiers[0].typeName.escapedText).toBe('Attribute.Required'); }); }); @@ -384,7 +384,7 @@ describe('Attributes', () => { expect(modifiers).toHaveLength(1); expect(modifiers[0].kind).toBe(ts.SyntaxKind.TypeReference); - expect(modifiers[0].typeName.escapedText).toBe('PrivateAttribute'); + expect(modifiers[0].typeName.escapedText).toBe('Attribute.Private'); }); }); @@ -409,7 +409,7 @@ describe('Attributes', () => { expect(modifiers).toHaveLength(1); expect(modifiers[0].kind).toBe(ts.SyntaxKind.TypeReference); - expect(modifiers[0].typeName.escapedText).toBe('UniqueAttribute'); + expect(modifiers[0].typeName.escapedText).toBe('Attribute.Unique'); }); }); @@ -434,7 +434,7 @@ describe('Attributes', () => { expect(modifiers).toHaveLength(1); expect(modifiers[0].kind).toBe(ts.SyntaxKind.TypeReference); - expect(modifiers[0].typeName.escapedText).toBe('ConfigurableAttribute'); + expect(modifiers[0].typeName.escapedText).toBe('Attribute.Configurable'); }); }); @@ -455,7 +455,7 @@ describe('Attributes', () => { expect(modifiers).toHaveLength(1); expect(modifiers[0].kind).toBe(ts.SyntaxKind.TypeReference); - expect(modifiers[0].typeName.escapedText).toBe('CustomField'); + expect(modifiers[0].typeName.escapedText).toBe('Attribute.CustomField'); expect(modifiers[0].typeArguments).toHaveLength(1); expect(modifiers[0].typeArguments[0].kind).toBe(ts.SyntaxKind.StringLiteral); expect(modifiers[0].typeArguments[0].text).toBe('plugin::color-picker.color'); @@ -473,7 +473,7 @@ describe('Attributes', () => { expect(modifiers).toHaveLength(1); expect(modifiers[0].kind).toBe(ts.SyntaxKind.TypeReference); - expect(modifiers[0].typeName.escapedText).toBe('CustomField'); + expect(modifiers[0].typeName.escapedText).toBe('Attribute.CustomField'); expect(modifiers[0].typeArguments).toHaveLength(2); expect(modifiers[0].typeArguments[0].kind).toBe(ts.SyntaxKind.StringLiteral); expect(modifiers[0].typeArguments[0].text).toBe('plugin::color-picker.color'); @@ -507,7 +507,7 @@ describe('Attributes', () => { expect(modifiers).toHaveLength(1); expect(modifiers[0].kind).toBe(ts.SyntaxKind.TypeReference); - expect(modifiers[0].typeName.escapedText).toBe('SetPluginOptions'); + expect(modifiers[0].typeName.escapedText).toBe('Attribute.SetPluginOptions'); expect(modifiers[0].typeArguments).toHaveLength(1); expect(modifiers[0].typeArguments[0].kind).toBe(ts.SyntaxKind.TypeLiteral); expect(modifiers[0].typeArguments[0].members).toHaveLength(1); @@ -546,7 +546,7 @@ describe('Attributes', () => { expect(modifiers).toHaveLength(1); expect(modifiers[0].kind).toBe(ts.SyntaxKind.TypeReference); - expect(modifiers[0].typeName.escapedText).toBe('SetMinMax'); + expect(modifiers[0].typeName.escapedText).toBe('Attribute.SetMinMax'); expect(modifiers[0].typeArguments).toHaveLength(1); expect(modifiers[0].typeArguments[0].kind).toBe(ts.SyntaxKind.TypeLiteral); @@ -570,7 +570,7 @@ describe('Attributes', () => { expect(modifiers).toHaveLength(1); expect(modifiers[0].kind).toBe(ts.SyntaxKind.TypeReference); - expect(modifiers[0].typeName.escapedText).toBe('SetMinMax'); + expect(modifiers[0].typeName.escapedText).toBe('Attribute.SetMinMax'); expect(modifiers[0].typeArguments).toHaveLength(1); expect(modifiers[0].typeArguments[0].kind).toBe(ts.SyntaxKind.TypeLiteral); @@ -594,7 +594,7 @@ describe('Attributes', () => { expect(modifiers).toHaveLength(1); expect(modifiers[0].kind).toBe(ts.SyntaxKind.TypeReference); - expect(modifiers[0].typeName.escapedText).toBe('SetMinMax'); + expect(modifiers[0].typeName.escapedText).toBe('Attribute.SetMinMax'); expect(modifiers[0].typeArguments).toHaveLength(1); expect(modifiers[0].typeArguments[0].kind).toBe(ts.SyntaxKind.TypeLiteral); @@ -636,7 +636,7 @@ describe('Attributes', () => { expect(modifiers).toHaveLength(1); expect(modifiers[0].kind).toBe(ts.SyntaxKind.TypeReference); - expect(modifiers[0].typeName.escapedText).toBe('SetMinMaxLength'); + expect(modifiers[0].typeName.escapedText).toBe('Attribute.SetMinMaxLength'); expect(modifiers[0].typeArguments).toHaveLength(1); expect(modifiers[0].typeArguments[0].kind).toBe(ts.SyntaxKind.TypeLiteral); @@ -660,7 +660,7 @@ describe('Attributes', () => { expect(modifiers).toHaveLength(1); expect(modifiers[0].kind).toBe(ts.SyntaxKind.TypeReference); - expect(modifiers[0].typeName.escapedText).toBe('SetMinMaxLength'); + expect(modifiers[0].typeName.escapedText).toBe('Attribute.SetMinMaxLength'); expect(modifiers[0].typeArguments).toHaveLength(1); expect(modifiers[0].typeArguments[0].kind).toBe(ts.SyntaxKind.TypeLiteral); @@ -684,7 +684,7 @@ describe('Attributes', () => { expect(modifiers).toHaveLength(1); expect(modifiers[0].kind).toBe(ts.SyntaxKind.TypeReference); - expect(modifiers[0].typeName.escapedText).toBe('SetMinMaxLength'); + expect(modifiers[0].typeName.escapedText).toBe('Attribute.SetMinMaxLength'); expect(modifiers[0].typeArguments).toHaveLength(1); expect(modifiers[0].typeArguments[0].kind).toBe(ts.SyntaxKind.TypeLiteral); @@ -726,7 +726,7 @@ describe('Attributes', () => { expect(modifiers).toHaveLength(1); expect(modifiers[0].kind).toBe(ts.SyntaxKind.TypeReference); - expect(modifiers[0].typeName.escapedText).toBe('DefaultTo'); + expect(modifiers[0].typeName.escapedText).toBe('Attribute.DefaultTo'); expect(modifiers[0].typeArguments).toHaveLength(1); expect(modifiers[0].typeArguments[0].kind).toBe(ts.SyntaxKind.TrueKeyword); @@ -739,7 +739,7 @@ describe('Attributes', () => { expect(modifiers).toHaveLength(1); expect(modifiers[0].kind).toBe(ts.SyntaxKind.TypeReference); - expect(modifiers[0].typeName.escapedText).toBe('DefaultTo'); + expect(modifiers[0].typeName.escapedText).toBe('Attribute.DefaultTo'); expect(modifiers[0].typeArguments).toHaveLength(1); expect(modifiers[0].typeArguments[0].kind).toBe(ts.SyntaxKind.TypeLiteral); diff --git a/packages/utils/typescript/lib/__tests__/generators/schemas/global.test.js b/packages/utils/typescript/lib/__tests__/generators/schemas/global.test.js deleted file mode 100644 index e3b1dcc85a..0000000000 --- a/packages/utils/typescript/lib/__tests__/generators/schemas/global.test.js +++ /dev/null @@ -1,108 +0,0 @@ -'use strict'; - -jest.mock('../../../generators/schemas/utils', () => ({ - getSchemaInterfaceName: jest.fn(), -})); - -const ts = require('typescript'); -const { get } = require('lodash/fp'); - -const { generateGlobalDefinition } = require('../../../generators/schemas/global'); -const { getSchemaInterfaceName } = require('../../../generators/schemas/utils'); - -const getSchemasInterfaceNode = get('body.statements[0].body.statements[0]'); - -describe('Global', () => { - afterAll(() => { - jest.resetAllMocks(); - }); - - const assertGlobalNodeStructure = (node) => { - // "declare global" - expect(node.kind).toBe(ts.SyntaxKind.ModuleDeclaration); - expect(node.modifiers).toHaveLength(1); - expect(node.modifiers[0].kind).toBe(ts.SyntaxKind.DeclareKeyword); - expect(node.name.originalKeywordKind).toBe(ts.SyntaxKind.GlobalKeyword); - expect(node.name.escapedText).toBe('global'); - - // "namespace Strapi" - const [strapiNamespace] = node.body.statements; - - expect(strapiNamespace.kind).toBe(ts.SyntaxKind.ModuleDeclaration); - expect(strapiNamespace.name.kind).toBe(ts.SyntaxKind.Identifier); - expect(strapiNamespace.name.escapedText).toBe('Strapi'); - - // "interface Schemas" - const [schemasInterface] = strapiNamespace.body.statements; - - expect(schemasInterface.kind).toBe(ts.SyntaxKind.InterfaceDeclaration); - expect(schemasInterface.name.escapedText).toBe('Schemas'); - }; - - describe('Generate Global Definition', () => { - beforeEach(() => { - jest.resetAllMocks(); - }); - - test('With empty definition', () => { - const definitions = []; - - const globalNode = generateGlobalDefinition(definitions); - - assertGlobalNodeStructure(globalNode); - - expect(getSchemaInterfaceName).not.toHaveBeenCalled(); - - const schemasNode = getSchemasInterfaceNode(globalNode); - - expect(schemasNode.members).toHaveLength(0); - }); - - test('With no definition', () => { - const globalNode = generateGlobalDefinition(); - - assertGlobalNodeStructure(globalNode); - - expect(getSchemaInterfaceName).not.toHaveBeenCalled(); - - const schemasNode = getSchemasInterfaceNode(globalNode); - - expect(schemasNode.members).toHaveLength(0); - }); - - test('With multiple definitions', () => { - const definitions = [ - { schema: { uid: 'api::foo.foo' } }, - { schema: { uid: 'api::bar.bar' } }, - { schema: { uid: 'api::foobar.foobar' } }, - { schema: { uid: 'default.barfoo' } }, - ]; - - getSchemaInterfaceName.mockReturnValue('Placeholder'); - - const globalNode = generateGlobalDefinition(definitions); - - assertGlobalNodeStructure(globalNode); - - const schemasNode = getSchemasInterfaceNode(globalNode); - - expect(schemasNode.members).toHaveLength(definitions.length); - - definitions.forEach(({ schema }, index) => { - const { uid } = schema; - const node = schemasNode.members[index]; - - expect(node.kind).toBe(ts.SyntaxKind.PropertySignature); - - expect(getSchemaInterfaceName).toHaveBeenCalledWith(uid); - - expect(node.name.kind).toBe(ts.SyntaxKind.StringLiteral); - expect(node.name.text).toBe(uid); - expect(node.name.singleQuote).toBeTruthy(); - - expect(node.type.kind).toBe(ts.SyntaxKind.TypeReference); - expect(node.type.typeName.escapedText).toBe('Placeholder'); - }); - }); - }); -}); diff --git a/packages/utils/typescript/lib/__tests__/generators/schemas/imports.test.js b/packages/utils/typescript/lib/__tests__/generators/schemas/imports.test.js index 70d80fc6a9..e017bc04f8 100644 --- a/packages/utils/typescript/lib/__tests__/generators/schemas/imports.test.js +++ b/packages/utils/typescript/lib/__tests__/generators/schemas/imports.test.js @@ -6,7 +6,7 @@ const { addImport, generateImportDefinition, getImports, -} = require('../../../generators/schemas/imports'); +} = require('../../../generators/common/imports'); describe('Imports', () => { test('When first loaded, the list of imports should be empty', () => { @@ -27,28 +27,30 @@ describe('Imports', () => { }); test('Generate an import type definition containing the registered import', () => { - const def = generateImportDefinition(); + const defs = generateImportDefinition(); - expect(def.kind).toBe(ts.SyntaxKind.ImportDeclaration); + defs.forEach((def) => { + expect(def.kind).toBe(ts.SyntaxKind.ImportDeclaration); - // Module specifier - expect(def.moduleSpecifier.kind).toBe(ts.SyntaxKind.StringLiteral); - expect(def.moduleSpecifier.text).toBe('@strapi/strapi'); + // Module specifier + expect(def.moduleSpecifier.kind).toBe(ts.SyntaxKind.StringLiteral); + expect(def.moduleSpecifier.text).toBe('@strapi/strapi'); - // Import clause (should be named imports) - expect(def.importClause.kind).toBe(ts.SyntaxKind.ImportClause); + // Import clause (should be named imports) + expect(def.importClause.kind).toBe(ts.SyntaxKind.ImportClause); - const { elements } = def.importClause.namedBindings; + const { elements } = def.importClause.namedBindings; - expect(elements).toHaveLength(2); + expect(elements).toHaveLength(2); - // Import clauses - getImports().forEach((namedImport, index) => { - const element = elements[index]; + // Import clauses + getImports().forEach((namedImport, index) => { + const element = elements[index]; - expect(element.kind).toBe(ts.SyntaxKind.ImportSpecifier); - expect(element.name.kind).toBe(ts.SyntaxKind.Identifier); - expect(element.name.escapedText).toBe(namedImport); + expect(element.kind).toBe(ts.SyntaxKind.ImportSpecifier); + expect(element.name.kind).toBe(ts.SyntaxKind.Identifier); + expect(element.name.escapedText).toBe(namedImport); + }); }); }); }); diff --git a/packages/utils/typescript/lib/__tests__/generators/schemas/utils.test.js b/packages/utils/typescript/lib/__tests__/generators/schemas/utils.test.js index 5a448bc81a..a0b9444a7d 100644 --- a/packages/utils/typescript/lib/__tests__/generators/schemas/utils.test.js +++ b/packages/utils/typescript/lib/__tests__/generators/schemas/utils.test.js @@ -4,67 +4,15 @@ const ts = require('typescript'); const { factory } = require('typescript'); const { - getAllStrapiSchemas, getDefinitionAttributesCount, getSchemaExtendsTypeName, getSchemaInterfaceName, getSchemaModelType, getTypeNode, toTypeLiteral, -} = require('../../../generators/schemas/utils'); +} = require('../../../generators/common/models/utils'); describe('Utils', () => { - describe('Get All Strapi Schemas', () => { - test('Get both components and content types', () => { - const strapi = { - contentTypes: { - ctA: {}, - ctB: {}, - }, - components: { - comp1: {}, - comp2: {}, - comp3: {}, - }, - }; - - const schemas = getAllStrapiSchemas(strapi); - - expect(schemas).toMatchObject({ ctA: {}, ctB: {}, comp1: {}, comp2: {}, comp3: {} }); - }); - - test('Get only components if there is no content type', () => { - const strapi = { - contentTypes: {}, - - components: { - comp1: {}, - comp2: {}, - comp3: {}, - }, - }; - - const schemas = getAllStrapiSchemas(strapi); - - expect(schemas).toMatchObject({ comp1: {}, comp2: {}, comp3: {} }); - }); - - test('Get only content types if there is no component', () => { - const strapi = { - contentTypes: { - ctA: {}, - ctB: {}, - }, - - components: {}, - }; - - const schemas = getAllStrapiSchemas(strapi); - - expect(schemas).toMatchObject({ ctA: {}, ctB: {} }); - }); - }); - describe('Get Definition Attributes Count', () => { const createMainNode = (members = []) => { return factory.createInterfaceDeclaration( @@ -172,10 +120,10 @@ describe('Utils', () => { describe('Get Schema Extends Type Name', () => { test.each([ - [{ modelType: 'component', kind: null }, 'ComponentSchema'], - [{ modelType: 'contentType', kind: 'singleType' }, 'SingleTypeSchema'], - [{ modelType: 'contentType', kind: 'collectionType' }, 'CollectionTypeSchema'], - [{ modelType: 'invalidType', kind: 'foo' }, 'Schema'], + [{ modelType: 'component', kind: null }, 'Schema.Component'], + [{ modelType: 'contentType', kind: 'singleType' }, 'Schema.SingleType'], + [{ modelType: 'contentType', kind: 'collectionType' }, 'Schema.CollectionType'], + [{ modelType: 'invalidType', kind: 'foo' }, null], ])("Expect %p to generate %p as the base type for a schema's interface", (schema, expected) => { expect(getSchemaExtendsTypeName(schema)).toBe(expected); }); diff --git a/packages/utils/typescript/lib/generators/common/models/utils.js b/packages/utils/typescript/lib/generators/common/models/utils.js index efdbe9292f..354ea5240f 100644 --- a/packages/utils/typescript/lib/generators/common/models/utils.js +++ b/packages/utils/typescript/lib/generators/common/models/utils.js @@ -55,6 +55,10 @@ const getSchemaModelType = (schema) => { const getSchemaExtendsTypeName = (schema) => { const base = getSchemaModelType(schema); + if (base === null) { + return null; + } + return `${NAMESPACES.schema}.${upperFirst(base)}`; }; From 4f8161c6657167b46c5fceee08d80bbd01404394 Mon Sep 17 00:00:00 2001 From: Convly Date: Wed, 17 May 2023 16:26:19 +0200 Subject: [PATCH 031/172] Introduce Attribute.Any --- .../lib/types/core/attributes/common.d.ts | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/packages/core/strapi/lib/types/core/attributes/common.d.ts b/packages/core/strapi/lib/types/core/attributes/common.d.ts index 3c98cf534f..dcebd1f10b 100644 --- a/packages/core/strapi/lib/types/core/attributes/common.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/common.d.ts @@ -41,3 +41,26 @@ export type SetPluginOptions = { pluginOptions?: T }; // default export type DefaultTo = { default: T }; + +// Any Attribute +export type Any = + | Attribute.BigInteger + | Attribute.Boolean + | Attribute.Component + | Attribute.DateTime + | Attribute.Date + | Attribute.Decimal + | Attribute.DynamicZone + | Attribute.Email + | Attribute.Enumeration + | Attribute.Float + | Attribute.JSON + | Attribute.Media + | Attribute.Password + | Attribute.Relation + | Attribute.RichText + | Attribute.String + | Attribute.Text + | Attribute.Time + | Attribute.Timestamp + | Attribute.UID; From e63e3bee81f5724c3ca9c5cd3274eb79a95c0220 Mon Sep 17 00:00:00 2001 From: Convly Date: Wed, 17 May 2023 16:26:53 +0200 Subject: [PATCH 032/172] Add default type values for component and dynamic zone --- packages/core/strapi/lib/types/core/attributes/component.d.ts | 2 +- .../core/strapi/lib/types/core/attributes/dynamic-zone.d.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/strapi/lib/types/core/attributes/component.d.ts b/packages/core/strapi/lib/types/core/attributes/component.d.ts index e443cbf50f..c0f60e51a0 100644 --- a/packages/core/strapi/lib/types/core/attributes/component.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/component.d.ts @@ -12,7 +12,7 @@ export interface ComponentProperties< export type Component< // Targeted component - T extends Common.UID.Component, + T extends Common.UID.Component = Common.UID.Component, // Repeatable R extends boolean = false > = Attribute.Attribute<'component'> & diff --git a/packages/core/strapi/lib/types/core/attributes/dynamic-zone.d.ts b/packages/core/strapi/lib/types/core/attributes/dynamic-zone.d.ts index ad75c77000..3822ceb38a 100644 --- a/packages/core/strapi/lib/types/core/attributes/dynamic-zone.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/dynamic-zone.d.ts @@ -4,7 +4,7 @@ export interface DynamicZoneProperties { components: T; } -export type DynamicZone = +export type DynamicZone = Attribute.Attribute<'dynamiczone'> & // Properties DynamicZoneProperties & From f3cc11e825a2b75d0d63a2782e5b1ad2f46d5c05 Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Wed, 24 May 2023 18:03:01 +0200 Subject: [PATCH 033/172] feat: get populate query --- .../server/services/utils/populate.js | 58 ++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/packages/core/content-manager/server/services/utils/populate.js b/packages/core/content-manager/server/services/utils/populate.js index 38289cbf8d..c65365698c 100644 --- a/packages/core/content-manager/server/services/utils/populate.js +++ b/packages/core/content-manager/server/services/utils/populate.js @@ -1,12 +1,18 @@ 'use strict'; -const { merge, isEmpty } = require('lodash/fp'); +const { merge, isEmpty, get, set, propEq } = require('lodash/fp'); const strapiUtils = require('@strapi/utils'); const { hasDraftAndPublish, isVisibleAttribute } = strapiUtils.contentTypes; const { isAnyToMany } = strapiUtils.relations; const { PUBLISHED_AT_ATTRIBUTE } = strapiUtils.contentTypes.constants; +const isMorphRelation = (attribute) => isRelation(attribute) && attribute.relation.includes('morph'); +const isMedia = propEq('type', 'media'); +const isRelation = propEq('type', 'relation'); +const isComponent = propEq('type', 'component'); +const isDynamicZone = propEq('type', 'dynamiczone'); + /** * Populate the model for relation * @param {Object} attribute - Attribute containing a relation @@ -191,7 +197,57 @@ const getDeepPopulateDraftCount = (uid) => { return { populate, hasRelations }; }; + + +// TODO: Explain this function and the populate format +const getQueryPopulate = async (uid, query) => { + + const pathToPopulate = (path) => path.replaceAll('.', '.populate.'); + let populateQuery = {}; + + await strapiUtils.traverse.traverseQueryFilters( + /** + * + * @param {*} param0 + * @param {*} param0.key - Attribute name + * @param {*} param0.attribute - Attribute definition + * @param {*} param0.path - Content Type path to the attribute + * @returns + */ + ({ key, attribute, path }) => { + + // Ignore dynamic zones and morph relations + if (!attribute || isDynamicZone(attribute) || isMorphRelation(attribute)) { + return; + } + + // Populate all relations, components and media + if (isRelation(attribute) || isMedia(attribute) || isComponent(attribute)) { + const populatePath = pathToPopulate(path.attribute); + populateQuery = set(populatePath, { fields: [] }, populateQuery); + return; + } + + // Top level attributes are not populated + if (key === path.attribute) { + return; + } + + // Can only get here if attribute is a field from a relation / compo + const pathWithoutKey = path.attribute.slice(0, path.attribute.lastIndexOf('.')); + const populatePath = pathToPopulate(pathWithoutKey); + get(populatePath, populateQuery).fields.push(key); + + }, + { schema: strapi.contentType(uid) }, + query + ); + + return populateQuery; +} + module.exports = { getDeepPopulate, getDeepPopulateDraftCount, + getQueryPopulate, }; From e3e3cfe08ae33318f2730255b01cdcc4b41dc1f2 Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Wed, 24 May 2023 18:03:16 +0200 Subject: [PATCH 034/172] test: query populate --- .../utils/__tests__/query-populate.test.js | 139 ++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 packages/core/content-manager/server/services/utils/__tests__/query-populate.test.js diff --git a/packages/core/content-manager/server/services/utils/__tests__/query-populate.test.js b/packages/core/content-manager/server/services/utils/__tests__/query-populate.test.js new file mode 100644 index 0000000000..6a5952485e --- /dev/null +++ b/packages/core/content-manager/server/services/utils/__tests__/query-populate.test.js @@ -0,0 +1,139 @@ +'use strict'; + +const { getQueryPopulate } = require('../populate'); + +const getFilterQuery = (conditions) => ({ + filters: { + $or: [{ + $and: [{ + $or: conditions + }] + }] + } +}) + +const uid = 'model'; + +describe('Populate', () => { + const fakeModels = { + empty: { + uid: 'empty', + attributes: {}, + }, + model: { + uid: 'model', + attributes: { + field: { + type: 'string', + }, + relation: { + type: 'relation', + relation: 'oneToMany', + target: 'model', + }, + component: { + type: 'component', + component: 'component', + }, + repeatableComponent: { + type: 'component', + repeatable: true, + component: 'component', + }, + media: { + type: 'media', + } + }, + }, + component: { + uid: 'component', + attributes: { + field: { + type: 'string', + }, + compoRelation: { + type: 'relation', + relation: 'oneToMany', + target: 'model', + } + }, + }, + }; + + describe('getQueryPopulate', () => { + beforeEach(() => { + global.strapi = { + contentType: jest.fn((uid) => fakeModels[uid]), + getModel: jest.fn((uid) => fakeModels[uid]), + db: { + metadata: { + get: jest.fn((uid) => ({ ...fakeModels[uid], columnToAttribute: {} })), + } + } + }; + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + test('top level field should not be populated', async () => { + + const query = getFilterQuery([{ field: { $exists: true } }]); + const result = await getQueryPopulate(uid, query); + + expect(result).toEqual({}); + }); + + test('one relational field should be populated', async () => { + + const query = getFilterQuery([{ relation: { field: "value" } }]); + const result = await getQueryPopulate(uid, query); + + expect(result).toEqual({ + relation: { fields: ['field'] } + }); + + }); + + test('relation in component should be populated', async () => { + + const query = getFilterQuery([{ component: { compoRelation: { field: "value" } } }]); + const result = await getQueryPopulate(uid, query); + + expect(result).toEqual({ + component: { populate: { compoRelation: { fields: ['field'] } }, fields: [] } + }); + + }); + + test('relation in repeatable component should be populated', async () => { + + const query = getFilterQuery([{ repeatableComponent: { compoRelation: { field: "value" } } }]); + const result = await getQueryPopulate(uid, query); + + expect(result).toEqual({ + repeatableComponent: { populate: { compoRelation: { fields: ['field'] } }, fields: [] } + }); + + }); + + test('populate multiple fields at once', async () => { + + const query = getFilterQuery([ + { relation: { component: { field: { $eq: "value" } } } }, + { relation: { field: "value" } }, + { repeatableComponent: { $elemMatch: { compoRelation: { field: "value" } } } } + ]); + + const result = await getQueryPopulate(uid, query); + + expect(result).toEqual({ + relation: { fields: ['field'], populate: { component: { fields: ['field'] } } }, + repeatableComponent: { populate: { compoRelation: { fields: ['field'] } }, fields: [] } + }); + }); + + }); + +}); From 4a97be49b57488aeb0eef4fac2640663efddf4f2 Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Wed, 24 May 2023 18:04:50 +0200 Subject: [PATCH 035/172] chore: cleanup get query populate --- .../server/controllers/collection-types.js | 60 ++----------------- .../server/services/permission-checker.js | 7 +++ .../server/services/utils/populate.js | 16 ++--- 3 files changed, 17 insertions(+), 66 deletions(-) diff --git a/packages/core/content-manager/server/controllers/collection-types.js b/packages/core/content-manager/server/controllers/collection-types.js index be61a3ec4f..b5acaeca07 100644 --- a/packages/core/content-manager/server/controllers/collection-types.js +++ b/packages/core/content-manager/server/controllers/collection-types.js @@ -1,12 +1,9 @@ 'use strict'; -const { set, get } = require('lodash/fp'); - -const { setCreatorFields, pipeAsync, traverse } = require('@strapi/utils'); +const { setCreatorFields, pipeAsync } = require('@strapi/utils'); const { getService, pickWritableAttributes } = require('../utils'); const { validateBulkDeleteInput } = require('./validation'); -const traverseQueryFilters = require('@strapi/utils/lib/traverse/query-filters'); module.exports = { async find(ctx) { @@ -48,58 +45,7 @@ module.exports = { if (permissionChecker.cannot.read()) { return ctx.forbidden(); } - const permissionQuery = await permissionChecker.sanitizedQuery.read(ctx.query); - // { $and: { addresses: { elemMatch: { postal_code: { gt: 60 } } } } - // populate: ['addresses'] - // populate: { addresses: { fields: ['postal_code'] } } - // const populate = { - // addresses: { - // fields: ['postal_code'], - // populate: { - // createdBy: { - // fields: [], - // }, - // }, - // }, - // }; - const populateQuery = {}; - await traverse.traverseQueryFilters( - ({ key, value, attribute, path }) => { - if (!attribute) { - return; - } - - console.log('---visitor---'); - console.log(key, value); - console.log(path, attribute?.type); - - const { type } = attribute; - - if ( - type === 'dynamiczone' || - (type === 'relation' && attribute.relation.toLowerCase().includes('morphTo')) - ) { - return; - } - - if (['relation', 'media', 'component'].includes(type)) { - const attributePath = path.attribute.replaceAll('.', '.populate.'); - console.log('Got a relation', key, attributePath); - Object.assign(populateQuery, set(attributePath, { fields: [] }, populateQuery)); - } else { - const attributePath = path.attribute - .slice(0, path.attribute.lastIndexOf('.')) - .replaceAll('.', '.populate.'); - - if (key !== path.attribute) { - get(attributePath, populateQuery).fields.push(key); - } - } - }, - { schema: strapi.contentType(model) }, - permissionQuery - ); - console.log(JSON.stringify(populateQuery, null, 2)); + const populateQuery = await permissionChecker.queryPopulate(ctx.query); const entity = await entityManager.findOneWithCreatorRolesAndCount(id, model, { populate: populateQuery, @@ -114,6 +60,8 @@ module.exports = { return ctx.forbidden(); } + // TODO: Move the transform relations to count here. + ctx.body = await permissionChecker.sanitizeOutput(entity); }, diff --git a/packages/core/content-manager/server/services/permission-checker.js b/packages/core/content-manager/server/services/permission-checker.js index 10305ec19a..e31df71a31 100644 --- a/packages/core/content-manager/server/services/permission-checker.js +++ b/packages/core/content-manager/server/services/permission-checker.js @@ -1,6 +1,7 @@ 'use strict'; const { pipeAsync } = require('@strapi/utils'); +const { getQueryPopulate } = require('./utils/populate'); const ACTIONS = { read: 'plugin::content-manager.explorer.read', @@ -62,6 +63,11 @@ const createPermissionChecker = )(query); }; + const populateQuery = (query) => { + const permissionQuery = this.sanitizedQuery.read(query); + return getQueryPopulate(model, permissionQuery); + }; + // Sanitized queries shortcuts Object.keys(ACTIONS).forEach((action) => { sanitizedQuery[action] = (query) => sanitizedQuery(query, ACTIONS[action]); @@ -84,6 +90,7 @@ const createPermissionChecker = sanitizeUpdateInput, // Queries Builder sanitizedQuery, + populateQuery, }; }; diff --git a/packages/core/content-manager/server/services/utils/populate.js b/packages/core/content-manager/server/services/utils/populate.js index c65365698c..9a3148e0e5 100644 --- a/packages/core/content-manager/server/services/utils/populate.js +++ b/packages/core/content-manager/server/services/utils/populate.js @@ -7,7 +7,8 @@ const { hasDraftAndPublish, isVisibleAttribute } = strapiUtils.contentTypes; const { isAnyToMany } = strapiUtils.relations; const { PUBLISHED_AT_ATTRIBUTE } = strapiUtils.contentTypes.constants; -const isMorphRelation = (attribute) => isRelation(attribute) && attribute.relation.includes('morph'); +const isMorphRelation = (attribute) => + isRelation(attribute) && attribute.relation.includes('morph'); const isMedia = propEq('type', 'media'); const isRelation = propEq('type', 'relation'); const isComponent = propEq('type', 'component'); @@ -197,25 +198,21 @@ const getDeepPopulateDraftCount = (uid) => { return { populate, hasRelations }; }; - - // TODO: Explain this function and the populate format const getQueryPopulate = async (uid, query) => { - const pathToPopulate = (path) => path.replaceAll('.', '.populate.'); let populateQuery = {}; await strapiUtils.traverse.traverseQueryFilters( /** - * - * @param {*} param0 + * + * @param {*} param0 * @param {*} param0.key - Attribute name * @param {*} param0.attribute - Attribute definition * @param {*} param0.path - Content Type path to the attribute - * @returns + * @returns */ ({ key, attribute, path }) => { - // Ignore dynamic zones and morph relations if (!attribute || isDynamicZone(attribute) || isMorphRelation(attribute)) { return; @@ -237,14 +234,13 @@ const getQueryPopulate = async (uid, query) => { const pathWithoutKey = path.attribute.slice(0, path.attribute.lastIndexOf('.')); const populatePath = pathToPopulate(pathWithoutKey); get(populatePath, populateQuery).fields.push(key); - }, { schema: strapi.contentType(uid) }, query ); return populateQuery; -} +}; module.exports = { getDeepPopulate, From cdb17d5c16dc7805572f17cad0f86f660b5ff430 Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Wed, 24 May 2023 18:20:06 +0200 Subject: [PATCH 036/172] chore: rename populate query --- .../content-manager/server/controllers/collection-types.js | 2 +- .../content-manager/server/services/permission-checker.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/core/content-manager/server/controllers/collection-types.js b/packages/core/content-manager/server/controllers/collection-types.js index b5acaeca07..09b9facecf 100644 --- a/packages/core/content-manager/server/controllers/collection-types.js +++ b/packages/core/content-manager/server/controllers/collection-types.js @@ -45,7 +45,7 @@ module.exports = { if (permissionChecker.cannot.read()) { return ctx.forbidden(); } - const populateQuery = await permissionChecker.queryPopulate(ctx.query); + const populateQuery = await permissionChecker.populateQuery(ctx.query); const entity = await entityManager.findOneWithCreatorRolesAndCount(id, model, { populate: populateQuery, diff --git a/packages/core/content-manager/server/services/permission-checker.js b/packages/core/content-manager/server/services/permission-checker.js index e31df71a31..e2b05fcdc1 100644 --- a/packages/core/content-manager/server/services/permission-checker.js +++ b/packages/core/content-manager/server/services/permission-checker.js @@ -63,8 +63,8 @@ const createPermissionChecker = )(query); }; - const populateQuery = (query) => { - const permissionQuery = this.sanitizedQuery.read(query); + const populateQuery = async (query) => { + const permissionQuery = await sanitizedQuery.read(query); return getQueryPopulate(model, permissionQuery); }; From b37f6b1c1ed7a7205bab3cea39776d87dc9f383c Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Thu, 25 May 2023 14:36:50 +0200 Subject: [PATCH 037/172] feat: cleanup entity manager --- .../server/services/entity-manager.js | 126 +++--------------- 1 file changed, 17 insertions(+), 109 deletions(-) diff --git a/packages/core/content-manager/server/services/entity-manager.js b/packages/core/content-manager/server/services/entity-manager.js index 6b3706475b..1d75bbe125 100644 --- a/packages/core/content-manager/server/services/entity-manager.js +++ b/packages/core/content-manager/server/services/entity-manager.js @@ -1,6 +1,6 @@ 'use strict'; -const { assoc, has, prop, omit } = require('lodash/fp'); +const { omit } = require('lodash/fp'); const strapiUtils = require('@strapi/utils'); const { mapAsync } = require('@strapi/utils'); const { ApplicationError } = require('@strapi/utils').errors; @@ -9,7 +9,7 @@ const { getDeepRelationsCount } = require('./utils/count'); const { sumDraftCounts } = require('./utils/draft'); const { hasDraftAndPublish } = strapiUtils.contentTypes; -const { PUBLISHED_AT_ATTRIBUTE, CREATED_BY_ATTRIBUTE } = strapiUtils.contentTypes.constants; +const { PUBLISHED_AT_ATTRIBUTE } = strapiUtils.contentTypes.constants; const { ENTRY_PUBLISH, ENTRY_UNPUBLISH } = strapiUtils.webhook.webhookEvents; const omitPublishedAtField = omit(PUBLISHED_AT_ATTRIBUTE); @@ -27,26 +27,6 @@ const emitEvent = async (event, entity, modelUid) => { }); }; -const findCreatorRoles = (entity) => { - const createdByPath = `${CREATED_BY_ATTRIBUTE}.id`; - - if (has(createdByPath, entity)) { - const creatorId = prop(createdByPath, entity); - return strapi.query('admin::role').findMany({ where: { users: { id: creatorId } } }); - } - - return []; -}; - -const addCreatedByRolesPopulate = (populate) => { - return { - ...populate, - createdBy: { - populate: ['roles'], - }, - }; -}; - /** * When webhooks.populateRelations is set to true, populated relations * will be passed to any webhook event. The entity-manager @@ -64,15 +44,6 @@ const isRelationsPopulateEnabled = () => { * @type {import('./entity-manager').default} */ module.exports = ({ strapi }) => ({ - async assocCreatorRoles(entity) { - if (!entity) { - return entity; - } - - const roles = await findCreatorRoles(entity); - return assoc(`${CREATED_BY_ATTRIBUTE}.roles`, roles, entity); - }, - /** * Extend this function from other plugins to add custom mapping of entity * responses @@ -102,120 +73,65 @@ module.exports = ({ strapi }) => ({ async find(opts, uid) { const params = { ...opts, populate: getDeepPopulate(uid) }; - const entities = await strapi.entityService.findMany(uid, params); - return this.mapEntitiesResponse(entities, uid); }, async findPage(opts, uid) { - const params = { ...opts, populate: getDeepPopulate(uid, { maxLevel: 1 }) }; - - const entities = await strapi.entityService.findPage(uid, params); - + const entities = await strapi.entityService.findPage(uid, opts); return this.mapEntitiesResponse(entities, uid); }, - async findWithRelationCountsPage(opts, uid) { - const counterPopulate = getDeepPopulate(uid, { countMany: true, maxLevel: 1 }); - const params = { ...opts, populate: addCreatedByRolesPopulate(counterPopulate) }; - - const entities = await strapi.entityService.findWithRelationCountsPage(uid, params); - - return this.mapEntitiesResponse(entities, uid); - }, - - async findOneWithCreatorRolesAndCount(id, uid, opts = {}) { - const counterPopulate = getDeepPopulate(uid, { countMany: true, countOne: true }); - const params = { populate: addCreatedByRolesPopulate(opts.populate ?? counterPopulate) }; - + async findOne(id, uid, opts = {}) { return strapi.entityService - .findOne(uid, id, params) + .findOne(uid, id, opts) .then((entity) => this.mapEntity(entity, uid)); }, - async findOne(id, uid) { - const params = { populate: getDeepPopulate(uid) }; - - return strapi.entityService - .findOne(uid, id, params) - .then((entity) => this.mapEntity(entity, uid)); - }, - - async findOneWithCreatorRoles(id, uid) { - const entity = await this.findOne(id, uid).then((entity) => this.mapEntity(entity, uid)); - - if (!entity) { - return entity; - } - - return this.assocCreatorRoles(entity); - }, - - async create(body, uid) { + async create(body, uid, opts = {}) { const modelDef = strapi.getModel(uid); const publishData = { ...body }; - const populateRelations = isRelationsPopulateEnabled(uid); if (hasDraftAndPublish(modelDef)) { publishData[PUBLISHED_AT_ATTRIBUTE] = null; } - const params = { - data: publishData, - populate: populateRelations - ? getDeepPopulate(uid, {}) - : getDeepPopulate(uid, { countMany: true, countOne: true }), - }; + const params = { data: publishData, ...opts }; const entity = await strapi.entityService .create(uid, params) .then((entity) => this.mapEntity(entity, uid)); // If relations were populated, relations count will be returned instead of the array of relations. - if (populateRelations) { + if (isRelationsPopulateEnabled(uid)) { return getDeepRelationsCount(entity, uid); } return entity; }, - async update(entity, body, uid) { + async update(entity, body, uid, opts = {}) { const publishData = omitPublishedAtField(body); - const populateRelations = isRelationsPopulateEnabled(uid); - const params = { - data: publishData, - populate: populateRelations - ? getDeepPopulate(uid, {}) - : getDeepPopulate(uid, { countMany: true, countOne: true }), - }; + const params = { data: publishData, ...opts }; const updatedEntity = await strapi.entityService .update(uid, entity.id, params) .then((entity) => this.mapEntity(entity, uid)); // If relations were populated, relations count will be returned instead of the array of relations. - if (populateRelations) { + if (isRelationsPopulateEnabled(uid)) { return getDeepRelationsCount(updatedEntity, uid); } return updatedEntity; }, - async delete(entity, uid) { - const populateRelations = isRelationsPopulateEnabled(uid); - - const params = { - populate: populateRelations - ? getDeepPopulate(uid, {}) - : getDeepPopulate(uid, { countMany: true, countOne: true }), - }; - - const deletedEntity = await strapi.entityService.delete(uid, entity.id, params); + async delete(entity, uid, opts = {}) { + const deletedEntity = await strapi.entityService.delete(uid, entity.id, opts); // If relations were populated, relations count will be returned instead of the array of relations. - if (populateRelations) { + if (isRelationsPopulateEnabled(uid)) { return getDeepRelationsCount(deletedEntity, uid); } @@ -224,12 +140,10 @@ module.exports = ({ strapi }) => ({ // FIXME: handle relations deleteMany(opts, uid) { - const params = { ...opts }; - - return strapi.entityService.deleteMany(uid, params); + return strapi.entityService.deleteMany(uid, opts); }, - async publish(entity, body = {}, uid) { + async publish(entity, body = {}, uid, opts = {}) { if (entity[PUBLISHED_AT_ATTRIBUTE]) { throw new ApplicationError('already.published'); } @@ -243,14 +157,8 @@ module.exports = ({ strapi }) => ({ ); const data = { ...body, [PUBLISHED_AT_ATTRIBUTE]: new Date() }; - const populateRelations = isRelationsPopulateEnabled(uid); - const params = { - data, - populate: populateRelations - ? getDeepPopulate(uid, {}) - : getDeepPopulate(uid, { countMany: true, countOne: true }), - }; + const params = { data, ...opts }; const updatedEntity = await strapi.entityService.update(uid, entity.id, params); From 398414854e562d5cc228d3f674d78cea745fcbc2 Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Thu, 25 May 2023 14:39:07 +0200 Subject: [PATCH 038/172] feat: populate builder --- .../services/utils/populateUtils/builder.js | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 packages/core/content-manager/server/services/utils/populateUtils/builder.js diff --git a/packages/core/content-manager/server/services/utils/populateUtils/builder.js b/packages/core/content-manager/server/services/utils/populateUtils/builder.js new file mode 100644 index 0000000000..6a07f08c7b --- /dev/null +++ b/packages/core/content-manager/server/services/utils/populateUtils/builder.js @@ -0,0 +1,45 @@ +'use strict'; + +const { getDeepPopulate, getQueryPopulate } = require('../populate'); + +function populateBuilder(uid) { + const deepPopulateOptions = { + countMany: false, + countOne: false, + maxLevel: -1, + }; + let getPopulatePermission; + + const builder = { + populateRequiredPermissions(permissionChecker, query) { + getPopulatePermission = async () => { + const permissionQuery = await permissionChecker.sanitizedQuery.read(query); + return getQueryPopulate(permissionQuery); + }; + return builder; + }, + countRelations({ toMany = false, toOne = false } = {}) { + deepPopulateOptions.countMany = toMany; + deepPopulateOptions.countOne = toOne; + return builder; + }, + populateDeep(level = Infinity) { + deepPopulateOptions.maxLevel = level; + return builder; + }, + async build() { + const basePopulate = getPopulatePermission ? await getPopulatePermission() : {}; + + if (deepPopulateOptions.maxLevel === -1) { + return basePopulate; + } + return getDeepPopulate(uid, { ...deepPopulateOptions, basePopulate }); + }, + }; + + return builder; +} + +module.exports = { + populateBuilder, +}; From 3425d44d42bb2d97610193c795207e3c2f9e4e3e Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Thu, 25 May 2023 14:41:19 +0200 Subject: [PATCH 039/172] chore: remove populate query from permissionChecker --- .../content-manager/server/services/permission-checker.js | 7 ------- 1 file changed, 7 deletions(-) diff --git a/packages/core/content-manager/server/services/permission-checker.js b/packages/core/content-manager/server/services/permission-checker.js index e2b05fcdc1..10305ec19a 100644 --- a/packages/core/content-manager/server/services/permission-checker.js +++ b/packages/core/content-manager/server/services/permission-checker.js @@ -1,7 +1,6 @@ 'use strict'; const { pipeAsync } = require('@strapi/utils'); -const { getQueryPopulate } = require('./utils/populate'); const ACTIONS = { read: 'plugin::content-manager.explorer.read', @@ -63,11 +62,6 @@ const createPermissionChecker = )(query); }; - const populateQuery = async (query) => { - const permissionQuery = await sanitizedQuery.read(query); - return getQueryPopulate(model, permissionQuery); - }; - // Sanitized queries shortcuts Object.keys(ACTIONS).forEach((action) => { sanitizedQuery[action] = (query) => sanitizedQuery(query, ACTIONS[action]); @@ -90,7 +84,6 @@ const createPermissionChecker = sanitizeUpdateInput, // Queries Builder sanitizedQuery, - populateQuery, }; }; From b799705bd49393c098b3e82dfff24c7ee53396cc Mon Sep 17 00:00:00 2001 From: Christian Capeans Date: Thu, 25 May 2023 15:59:40 +0200 Subject: [PATCH 040/172] Set the base for the new typings for controllers --- .../strapi/lib/core-api/controller/index.d.ts | 21 +++--- .../strapi/lib/core-api/service/index.d.ts | 4 +- .../strapi/lib/types/core/strapi/index.d.ts | 6 +- packages/core/strapi/lib/types/factories.d.ts | 67 ++++++++++++++----- 4 files changed, 64 insertions(+), 34 deletions(-) diff --git a/packages/core/strapi/lib/core-api/controller/index.d.ts b/packages/core/strapi/lib/core-api/controller/index.d.ts index 62ece69d2d..4bfc4cfe6b 100644 --- a/packages/core/strapi/lib/core-api/controller/index.d.ts +++ b/packages/core/strapi/lib/core-api/controller/index.d.ts @@ -1,6 +1,5 @@ import { Context, Next } from 'koa'; - -type ControllerResponse = T | Promise | undefined; +import { ControllerHandler } from '../../types/core/common'; interface Controller { transformResponse(data: object, meta: object): object; @@ -9,19 +8,19 @@ interface Controller { } export interface SingleTypeController extends Controller { - find?(ctx: Context, next: Next): ControllerResponse; - update?(ctx: Context, next: Next): ControllerResponse; - delete?(ctx: Context, next: Next): ControllerResponse; + find?: ControllerHandler; + update?: ControllerHandler; + delete?: ControllerHandler; } export interface CollectionTypeController extends Controller { - find?(ctx: Context, next: Next): ControllerResponse; - findOne?(ctx: Context, next: Next): ControllerResponse; - create?(ctx: Context, next: Next): ControllerResponse; - update?(ctx: Context, next: Next): ControllerResponse; - delete?(ctx: Context, next: Next): ControllerResponse; + find?: ControllerHandler; + findOne?: ControllerHandler; + create?: ControllerHandler; + update?: ControllerHandler; + delete?: ControllerHandler; } export type GenericController = Partial & { - [method: string | number | symbol]: (ctx: Context) => unknown; + [method: string | number | symbol]: ControllerHandler; }; diff --git a/packages/core/strapi/lib/core-api/service/index.d.ts b/packages/core/strapi/lib/core-api/service/index.d.ts index a507857b71..0dcd982ca8 100644 --- a/packages/core/strapi/lib/core-api/service/index.d.ts +++ b/packages/core/strapi/lib/core-api/service/index.d.ts @@ -18,8 +18,6 @@ export interface CollectionTypeService extends BaseService { delete?(entityId: string, params: object): Promise | Entity; } -export type Service = SingleTypeService | CollectionTypeService; - -export type GenericService = Partial & { +export type GenericService = { [method: string | number | symbol]: (...args: any) => any; }; diff --git a/packages/core/strapi/lib/types/core/strapi/index.d.ts b/packages/core/strapi/lib/types/core/strapi/index.d.ts index 2fc6e04aa8..41db777ed2 100644 --- a/packages/core/strapi/lib/types/core/strapi/index.d.ts +++ b/packages/core/strapi/lib/types/core/strapi/index.d.ts @@ -21,7 +21,7 @@ interface CustomFieldServerOptions { * The existing Strapi data type the custom field uses */ type: string; - + /** * Settings for the input size in the Admin UI */ @@ -81,12 +81,12 @@ export interface Strapi { * * It returns all the registered controllers */ - readonly controllers: StringMap; + readonly controllers: StringMap; // TODO type this better (?) /** * Find a controller using its unique identifier */ - controller(uid: string): GenericController | undefined; + controller(uid: string): GenericController | undefined; // TODO type this better (?) /** * Getter for the Strapi content types container diff --git a/packages/core/strapi/lib/types/factories.d.ts b/packages/core/strapi/lib/types/factories.d.ts index 64156bbb36..56652876c8 100644 --- a/packages/core/strapi/lib/types/factories.d.ts +++ b/packages/core/strapi/lib/types/factories.d.ts @@ -1,12 +1,15 @@ -import { Service, GenericService } from '../core-api/service'; -import { Controller, GenericController } from '../core-api/controller'; +import { GenericService, CollectionTypeService, SingleTypeService } from '../core-api/service'; +import { + CollectionTypeController, + SingleTypeController, + Controller, + GenericController, +} from '../core-api/controller'; import { Middleware } from '../middlewares'; import { Policy } from '../core/registries/policies'; import { Strapi } from './core/strapi'; - -type ControllerConfig = T; - -type ServiceConfig = Service; +import { SchemaUID } from './utils'; +import { UID } from './core'; type HandlerConfig = { auth?: false | { scope: string[] }; @@ -28,11 +31,12 @@ type CollectionTypeRouterConfig = { delete?: HandlerConfig; }; -type RouterConfig = { +type RouterConfig = { prefix?: string; + // TODO Refactor when we have a controller registry only?: string[]; except?: string[]; - config: SingleTypeRouterConfig | CollectionTypeRouterConfig; + config: T; }; interface Route { @@ -49,12 +53,41 @@ type ControllerCallback = (para }) => T; type ServiceCallback = (params: { strapi: Strapi }) => T; -export function createCoreRouter(uid: string, cfg?: RouterConfig = {}): () => Router; -export function createCoreController( - uid: string, - cfg?: ControllerCallback | T = {} -): () => T & Controller; -export function createCoreService( - uid: string, - cfg?: ServiceCallback | T = {} -): () => T; +export declare function createCoreRouter( + uid: T, + cfg?: RouterConfig = {} +): () => Router; + +export declare function createCoreController< + T extends UID.ContentType, + S extends Partial> +>(uid: T, cfg?: ControllerCallback | S): () => Required>; + +export declare function createCoreService< + T extends UID.ContentType, + S extends Partial> +>(uid: T, cfg?: ServiceCallback | S): () => Required>; + +type GetBaseSchemaController = IsCollectionType< + T, + CollectionTypeController, + SingleTypeController +> & + GenericController; + +type GetBaseSchemaService = IsCollectionType< + T, + CollectionTypeService, + SingleTypeService +> & + GenericService; + +type GetBaseConfig = IsCollectionType< + T, + CollectionTypeRouterConfig, + SingleTypeRouterConfig +>; + +type IsCollectionType = T extends Strapi.CollectionTypeUIDs + ? Y + : N; From d2be844147fb0b7700d75f13e17aaf75779431be Mon Sep 17 00:00:00 2001 From: Convly Date: Thu, 25 May 2023 16:27:55 +0200 Subject: [PATCH 041/172] Fix Attribute.Any definition --- .../lib/types/core/attributes/common.d.ts | 11 +++--- .../lib/types/core/attributes/media.d.ts | 4 +- .../lib/types/core/attributes/relation.d.ts | 38 +++++++++++++------ .../strapi/lib/types/core/attributes/uid.d.ts | 18 ++++----- .../lib/types/core/attributes/utils.d.ts | 2 +- .../strapi/lib/types/core/schemas/index.d.ts | 2 +- 6 files changed, 45 insertions(+), 30 deletions(-) diff --git a/packages/core/strapi/lib/types/core/attributes/common.d.ts b/packages/core/strapi/lib/types/core/attributes/common.d.ts index dcebd1f10b..6f495e066f 100644 --- a/packages/core/strapi/lib/types/core/attributes/common.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/common.d.ts @@ -2,7 +2,7 @@ * Strapi custom scalar types */ -import type { Attribute } from '@strapi/strapi'; +import type { Attribute, Common } from '@strapi/strapi'; /** * Setters for the attributes options @@ -46,16 +46,17 @@ export type DefaultTo = { default: T }; export type Any = | Attribute.BigInteger | Attribute.Boolean - | Attribute.Component + | Attribute.Component | Attribute.DateTime | Attribute.Date | Attribute.Decimal | Attribute.DynamicZone | Attribute.Email - | Attribute.Enumeration + | Attribute.Enumeration | Attribute.Float + | Attribute.Integer | Attribute.JSON - | Attribute.Media + | (Attribute.Media | Attribute.Media) | Attribute.Password | Attribute.Relation | Attribute.RichText @@ -63,4 +64,4 @@ export type Any = | Attribute.Text | Attribute.Time | Attribute.Timestamp - | Attribute.UID; + | (Attribute.UID | Attribute.UID); diff --git a/packages/core/strapi/lib/types/core/attributes/media.d.ts b/packages/core/strapi/lib/types/core/attributes/media.d.ts index 7f527f6868..8d1d639d16 100644 --- a/packages/core/strapi/lib/types/core/attributes/media.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/media.d.ts @@ -4,7 +4,7 @@ export type AllowedMediaTypes = 'images' | 'videos' | 'files' | 'audios'; export interface MediaProperties< // Media Type - T extends AllowedMediaTypes = undefined, + T extends AllowedMediaTypes | undefined = undefined, // Multiple U extends boolean = false > { @@ -14,7 +14,7 @@ export interface MediaProperties< export type Media< // Media Type - T extends AllowedMediaTypes = undefined, + T extends AllowedMediaTypes | undefined = undefined, // Multiple U extends boolean = false > = Attribute.Attribute<'media'> & diff --git a/packages/core/strapi/lib/types/core/attributes/relation.d.ts b/packages/core/strapi/lib/types/core/attributes/relation.d.ts index f7f2c5f6ca..48a8ba4a9a 100644 --- a/packages/core/strapi/lib/types/core/attributes/relation.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/relation.d.ts @@ -1,27 +1,41 @@ -import type { Attribute, Common } from '@strapi/strapi'; +import type { Attribute, Common, Utils } from '@strapi/strapi'; -export type BasicRelationsType = 'oneToOne' | 'oneToMany' | 'manyToOne' | 'manyToMany'; -export type PolymorphicRelationsType = 'morphToOne' | 'morphToMany' | 'morphOne' | 'morphMany'; +export type BasicRelationsType = + | 'oneToOne' + | 'oneToMany' + | 'manyToOne' + | 'manyToMany' + | 'morphOne' + | 'morphMany'; +export type PolymorphicRelationsType = 'morphToOne' | 'morphToMany'; export type RelationsType = BasicRelationsType | PolymorphicRelationsType; -export interface BasicRelationProperties< +export type BasicRelationProperties< S extends Common.UID.Schema, - R extends RelationsType, + R extends BasicRelationsType, T extends Common.UID.Schema -> { +> = { relation: R; target: T; - inversedBy?: RelationsKeysFromTo; - mappedBy?: RelationsKeysFromTo; -} +} & R extends `morph${string}` + ? { + morphBy?: Utils.KeysBy< + Common.Schemas[T]['attributes'], + Attribute.Relation + >; + } + : { + inversedBy?: RelationsKeysFromTo; + mappedBy?: RelationsKeysFromTo; + }; -export interface PolymorphicRelationProperties { +export interface PolymorphicRelationProperties { relation: R; } export type Relation< - S extends Common.UID.Schema, - R extends RelationsType, + S extends Common.UID.Schema = Common.UID.Schema, + R extends RelationsType = RelationsType, T extends R extends PolymorphicRelationsType ? never : Common.UID.Schema = never > = Attribute.Attribute<'relation'> & // Properties diff --git a/packages/core/strapi/lib/types/core/attributes/uid.d.ts b/packages/core/strapi/lib/types/core/attributes/uid.d.ts index 26b0ba031b..85ab92335b 100644 --- a/packages/core/strapi/lib/types/core/attributes/uid.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/uid.d.ts @@ -10,25 +10,21 @@ export interface UIDOptions { export interface UIDProperties< // Own Schema Reference - T extends Common.UID.Schema | undefined = undefined, + T extends Common.UID.Schema | undefined, // Target attribute - U extends T extends Common.UID.Schema - ? Attribute.GetKeysByType - : undefined = undefined, + U extends T extends Common.UID.Schema ? Attribute.GetKeysByType : undefined, // UID options S extends UIDOptions = UIDOptions > { - targetField?: U; - options?: UIDOptions & S; + targetField: U; + options: UIDOptions & S; } export type UID< // Own Schema Reference T extends Common.UID.Schema | undefined = undefined, // Target attribute - U extends T extends Common.UID.Schema - ? Attribute.GetKeysByType - : undefined = undefined, + U extends TargetAttributeByUID = TargetAttributeByUID, // UID options S extends UIDOptions = UIDOptions > = Attribute.Attribute<'uid'> & @@ -41,6 +37,10 @@ export type UID< Attribute.PrivateOption & Attribute.RequiredOption; +type TargetAttributeByUID = T extends Common.UID.Schema + ? Attribute.GetKeysByType + : undefined; + export type UIDValue = string; export type GetUIDValue = T extends UID diff --git a/packages/core/strapi/lib/types/core/attributes/utils.d.ts b/packages/core/strapi/lib/types/core/attributes/utils.d.ts index 774fc388cc..9184381ddf 100644 --- a/packages/core/strapi/lib/types/core/attributes/utils.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/utils.d.ts @@ -1,4 +1,4 @@ -import { Attribute, Common, Utils } from '@strapi/strapi'; +import type { Attribute, Common, Utils } from '@strapi/strapi'; export type PickTypes = T; diff --git a/packages/core/strapi/lib/types/core/schemas/index.d.ts b/packages/core/strapi/lib/types/core/schemas/index.d.ts index d96739932d..c23e4cebf4 100644 --- a/packages/core/strapi/lib/types/core/schemas/index.d.ts +++ b/packages/core/strapi/lib/types/core/schemas/index.d.ts @@ -78,7 +78,7 @@ export interface Info { /** * Low level data structure referencing every schema attribute and its name */ -export interface Attributes extends Utils.StringRecord {} +export interface Attributes extends Utils.StringRecord {} /** * Structure containing every core schema options and their associated value From 35357dbccfa1d96843936342c188ccf4e3f61e0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-S=C3=A9bastien=20Herbaux?= Date: Thu, 25 May 2023 16:30:08 +0200 Subject: [PATCH 042/172] Update packages/core/strapi/lib/types/core/namespace.d.ts Co-authored-by: Ben Irvin --- packages/core/strapi/lib/types/core/namespace.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/strapi/lib/types/core/namespace.d.ts b/packages/core/strapi/lib/types/core/namespace.d.ts index 5b99513826..595be540d6 100644 --- a/packages/core/strapi/lib/types/core/namespace.d.ts +++ b/packages/core/strapi/lib/types/core/namespace.d.ts @@ -52,7 +52,7 @@ export type GetSeparator = T extends Scoped /** * Adds the corresponding separator (using {@link GetSeparator}) at the end of a namespace * - * Warning: Using WithSeparator with a union type might produce undesired results as it'll distribute every matching suffix to every union members + * Warning: Using WithSeparator with a union type might produce undesired results as it'll distribute every matching suffix to every union member * * @example * type T = WithSeparator From f1593c2ddee7a79e8310e31c24d4490a0fbb4996 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-S=C3=A9bastien=20Herbaux?= Date: Thu, 25 May 2023 16:30:15 +0200 Subject: [PATCH 043/172] Update packages/core/strapi/lib/types/core/uid.d.ts Co-authored-by: Ben Irvin --- packages/core/strapi/lib/types/core/uid.d.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/strapi/lib/types/core/uid.d.ts b/packages/core/strapi/lib/types/core/uid.d.ts index 6b82294bbb..4a46b75431 100644 --- a/packages/core/strapi/lib/types/core/uid.d.ts +++ b/packages/core/strapi/lib/types/core/uid.d.ts @@ -80,9 +80,9 @@ export interface Parsed From bed3540c9a4084c9ed4656446115e2fbde094c94 Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Thu, 25 May 2023 16:54:11 +0200 Subject: [PATCH 044/172] chore: move populate to its own folder --- .../{populateUtils => populate}/builder.js | 7 ++-- .../utils/{populate.js => populate/index.js} | 35 +++++++++++++++++-- 2 files changed, 36 insertions(+), 6 deletions(-) rename packages/core/content-manager/server/services/utils/{populateUtils => populate}/builder.js (82%) rename packages/core/content-manager/server/services/utils/{populate.js => populate/index.js} (88%) diff --git a/packages/core/content-manager/server/services/utils/populateUtils/builder.js b/packages/core/content-manager/server/services/utils/populate/builder.js similarity index 82% rename from packages/core/content-manager/server/services/utils/populateUtils/builder.js rename to packages/core/content-manager/server/services/utils/populate/builder.js index 6a07f08c7b..4fa34ae3bc 100644 --- a/packages/core/content-manager/server/services/utils/populateUtils/builder.js +++ b/packages/core/content-manager/server/services/utils/populate/builder.js @@ -28,12 +28,13 @@ function populateBuilder(uid) { return builder; }, async build() { - const basePopulate = getPopulatePermission ? await getPopulatePermission() : {}; + const initialPopulate = getPopulatePermission ? await getPopulatePermission() : {}; if (deepPopulateOptions.maxLevel === -1) { - return basePopulate; + return initialPopulate; } - return getDeepPopulate(uid, { ...deepPopulateOptions, basePopulate }); + + return getDeepPopulate(uid, { ...deepPopulateOptions, initialPopulate }); }, }; diff --git a/packages/core/content-manager/server/services/utils/populate.js b/packages/core/content-manager/server/services/utils/populate/index.js similarity index 88% rename from packages/core/content-manager/server/services/utils/populate.js rename to packages/core/content-manager/server/services/utils/populate/index.js index 9a3148e0e5..79f7baee1b 100644 --- a/packages/core/content-manager/server/services/utils/populate.js +++ b/packages/core/content-manager/server/services/utils/populate/index.js @@ -25,13 +25,23 @@ const isDynamicZone = propEq('type', 'dynamiczone'); * @param {Boolean} options.countOne * @returns {true|{count: true}} */ -function getPopulateForRelation(attribute, model, attributeName, { countMany, countOne }) { +function getPopulateForRelation( + attribute, + model, + attributeName, + { countMany, countOne, initialPopulate } +) { const isManyRelation = isAnyToMany(attribute); + if (initialPopulate) { + return initialPopulate; + } + // always populate createdBy, updatedBy, localizations etc. if (!isVisibleAttribute(model, attributeName)) { return true; } + if ((isManyRelation && countMany) || (!isManyRelation && countOne)) { return { count: true }; } @@ -116,7 +126,7 @@ function getPopulateFor(attributeName, model, options, level) { */ const getDeepPopulate = ( uid, - { countMany = false, countOne = false, maxLevel = Infinity } = {}, + { initialPopulate = {}, countMany = false, countOne = false, maxLevel = Infinity } = {}, level = 1 ) => { if (level > maxLevel) { @@ -129,7 +139,12 @@ const getDeepPopulate = ( (populateAcc, attributeName) => merge( populateAcc, - getPopulateFor(attributeName, model, { countMany, countOne, maxLevel }, level) + getPopulateFor( + attributeName, + model, + { initialPopulate: initialPopulate?.[attributeName], countMany, countOne, maxLevel }, + level + ) ), {} ); @@ -242,8 +257,22 @@ const getQueryPopulate = async (uid, query) => { return populateQuery; }; +/** + * When config admin.webhooks.populateRelations is set to true, + * populated relations will be passed to any webhook event. + * The entity-manager response will not have the populated relations though. + * For performance reasons, it is recommended to set it to false, + * + * TODO V5: Set to false by default. + * TODO V5: Make webhooks always send the same entity data. + */ +const isPopulateRelationsEnabled = () => { + return strapi.config.get('server.webhooks.populateRelations', true); +}; + module.exports = { getDeepPopulate, getDeepPopulateDraftCount, getQueryPopulate, + isPopulateRelationsEnabled, }; From 7c0a562948e8c38b6dcb0a903bbb56b341711dd8 Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Thu, 25 May 2023 17:00:52 +0200 Subject: [PATCH 045/172] feat: use populate builder --- .../server/controllers/collection-types.js | 99 +++++++++++++++---- .../server/controllers/relations.js | 23 ++++- .../server/services/entity-manager.js | 14 +-- 3 files changed, 101 insertions(+), 35 deletions(-) diff --git a/packages/core/content-manager/server/controllers/collection-types.js b/packages/core/content-manager/server/controllers/collection-types.js index 09b9facecf..b7c65853e8 100644 --- a/packages/core/content-manager/server/controllers/collection-types.js +++ b/packages/core/content-manager/server/controllers/collection-types.js @@ -4,6 +4,7 @@ const { setCreatorFields, pipeAsync } = require('@strapi/utils'); const { getService, pickWritableAttributes } = require('../utils'); const { validateBulkDeleteInput } = require('./validation'); +const { populateBuilder } = require('../services/utils/populate/builder'); module.exports = { async find(ctx) { @@ -20,8 +21,13 @@ module.exports = { const permissionQuery = await permissionChecker.sanitizedQuery.read(query); - const { results, pagination } = await entityManager.findWithRelationCountsPage( - permissionQuery, + const populate = await populateBuilder(model) + .populateDeep(1) + .countRelations({ toMany: true, toOne: false }) + .build(); + + const { results, pagination } = await entityManager.findPage( + { ...permissionQuery, populate }, model ); @@ -45,11 +51,14 @@ module.exports = { if (permissionChecker.cannot.read()) { return ctx.forbidden(); } - const populateQuery = await permissionChecker.populateQuery(ctx.query); - const entity = await entityManager.findOneWithCreatorRolesAndCount(id, model, { - populate: populateQuery, - }); + const populate = await populateBuilder(model) + .populateRequiredPermissions(permissionChecker, ctx.query) + .populateDeep(Infinity) + .countRelations({ toMany: true, toOne: true }) + .build(); + + const entity = await entityManager.findOne(id, model, { populate }); if (!entity) { return ctx.notFound(); @@ -86,7 +95,14 @@ module.exports = { const sanitizeFn = pipeAsync(pickWritables, pickPermittedFields, setCreator); const sanitizedBody = await sanitizeFn(body); - const entity = await entityManager.create(sanitizedBody, model); + + const populate = await populateBuilder(model) + .populateDeep(Infinity) + // TODO: Use config to know if we need to count relations or not + .countRelations({ toMany: true, toOne: true }) + .build(); + + const entity = await entityManager.create(sanitizedBody, model, { populate }); ctx.body = await permissionChecker.sanitizeOutput(entity); @@ -109,7 +125,11 @@ module.exports = { return ctx.forbidden(); } - const entity = await entityManager.findOneWithCreatorRoles(id, model); + const populate = await populateBuilder(model) + .populateRequiredPermissions(permissionChecker, ctx.query) + .build(); + + const entity = await entityManager.findOne(id, model, { populate }); if (!entity) { return ctx.notFound(); @@ -122,11 +142,18 @@ module.exports = { const pickWritables = pickWritableAttributes({ model }); const pickPermittedFields = permissionChecker.sanitizeUpdateInput(entity); const setCreator = setCreatorFields({ user, isEdition: true }); - const sanitizeFn = pipeAsync(pickWritables, pickPermittedFields, setCreator); - const sanitizedBody = await sanitizeFn(body); - const updatedEntity = await entityManager.update(entity, sanitizedBody, model); + + const populateUpdate = await populateBuilder(model) + .populateDeep(Infinity) + // TODO: Use config to know if we need to count relations or not + .countRelations({ toMany: true, toOne: true }) + .build(); + + const updatedEntity = await entityManager.update(entity, sanitizedBody, model, { + populate: populateUpdate, + }); ctx.body = await permissionChecker.sanitizeOutput(updatedEntity); }, @@ -142,7 +169,11 @@ module.exports = { return ctx.forbidden(); } - const entity = await entityManager.findOneWithCreatorRoles(id, model); + const populate = await populateBuilder(model) + .populateRequiredPermissions(permissionChecker, ctx.query) + .build(); + + const entity = await entityManager.findOne(id, model, { populate }); if (!entity) { return ctx.notFound(); @@ -152,7 +183,15 @@ module.exports = { return ctx.forbidden(); } - const result = await entityManager.delete(entity, model); + const populateDelete = await populateBuilder(model) + .populateDeep(Infinity) + // TODO: Use config to know if we need to count relations or not + .countRelations({ toMany: true, toOne: true }) + .build(); + + const result = await entityManager.delete(entity, model, { populate: populateDelete }); + + // TODO: Count if config was enabled or populate based on permissions is not empty ctx.body = await permissionChecker.sanitizeOutput(result); }, @@ -168,7 +207,11 @@ module.exports = { return ctx.forbidden(); } - const entity = await entityManager.findOneWithCreatorRoles(id, model); + const populate = await populateBuilder(model) + .populateRequiredPermissions(permissionChecker, ctx.query) + .build(); + + const entity = await entityManager.findOne(id, model, { populate }); if (!entity) { return ctx.notFound(); @@ -178,10 +221,16 @@ module.exports = { return ctx.forbidden(); } + const populatePublish = await populateBuilder(model) + .populateDeep(Infinity) + .countRelations({ toMany: true, toOne: true }) + .build(); + const result = await entityManager.publish( entity, setCreatorFields({ user, isEdition: true })({}), - model + model, + { populate: populatePublish } ); ctx.body = await permissionChecker.sanitizeOutput(result); @@ -198,7 +247,11 @@ module.exports = { return ctx.forbidden(); } - const entity = await entityManager.findOneWithCreatorRoles(id, model); + const populate = await populateBuilder(model) + .populateRequiredPermissions(permissionChecker, ctx.query) + .build(); + + const entity = await entityManager.findOne(id, model, { populate }); if (!entity) { return ctx.notFound(); @@ -208,10 +261,16 @@ module.exports = { return ctx.forbidden(); } + const populateUnpublish = await populateBuilder(model) + .populateDeep(Infinity) + .countRelations({ toMany: true, toOne: true }) + .build(); + const result = await entityManager.unpublish( entity, setCreatorFields({ user, isEdition: true })({}), - model + model, + { populate: populateUnpublish } ); ctx.body = await permissionChecker.sanitizeOutput(result); @@ -259,7 +318,11 @@ module.exports = { return ctx.forbidden(); } - const entity = await entityManager.findOneWithCreatorRolesAndCount(id, model); + const populate = await populateBuilder(model) + .populateRequiredPermissions(permissionChecker, ctx.query) + .build(); + + const entity = await entityManager.findOne(id, model, { populate }); if (!entity) { return ctx.notFound(); diff --git a/packages/core/content-manager/server/controllers/relations.js b/packages/core/content-manager/server/controllers/relations.js index 8134d5812b..0baf86768c 100644 --- a/packages/core/content-manager/server/controllers/relations.js +++ b/packages/core/content-manager/server/controllers/relations.js @@ -4,6 +4,8 @@ const { prop, isEmpty } = require('lodash/fp'); const { hasDraftAndPublish } = require('@strapi/utils').contentTypes; const { isAnyToMany } = require('@strapi/utils').relations; const { PUBLISHED_AT_ATTRIBUTE } = require('@strapi/utils').contentTypes.constants; +const { populateBuilder } = require('../services/utils/populate/builder'); +const { isRelationsPopulateEnabled } = require('../services/utils/populate'); const { getService } = require('../utils'); const { validateFindAvailable, validateFindExisting } = require('./validation/relations'); @@ -55,7 +57,12 @@ module.exports = { if (entityId) { const entityManager = getService('entity-manager'); - const entity = await entityManager.findOneWithCreatorRoles(entityId, model); + const populate = await populateBuilder(model) + .populateDeep(Infinity) + .countRelations({ toMany: true, toOne: true }) + .build(); + + const entity = await entityManager.findOne(entityId, model, { populate }); if (!entity) { return ctx.notFound(); @@ -68,7 +75,8 @@ module.exports = { } else { // eslint-disable-next-line no-lonely-if if (entityId) { - const entity = await strapi.entityService.findOne(model, entityId); + const populate = await populateBuilder(model).populateDeep(Infinity).build(); + const entity = await strapi.entityService.findOne(model, entityId, { populate }); if (!entity) { return ctx.notFound(); @@ -161,7 +169,13 @@ module.exports = { return ctx.forbidden(); } - const entity = await entityManager.findOneWithCreatorRoles(id, model); + const countEnabled = !isRelationsPopulateEnabled(); + const populate = await populateBuilder(model) + .populateDeep(Infinity) + .countRelations({ toMany: countEnabled, toOne: countEnabled }) + .build(); + + const entity = await entityManager.findOne(id, model, { populate }); if (!entity) { return ctx.notFound(); @@ -171,7 +185,8 @@ module.exports = { return ctx.forbidden(); } } else { - const entity = await strapi.entityService.findOne(model, id); + const populate = await populateBuilder(model).populateDeep(Infinity).build(); + const entity = await strapi.entityService.findOne(model, id, { populate }); if (!entity) { return ctx.notFound(); diff --git a/packages/core/content-manager/server/services/entity-manager.js b/packages/core/content-manager/server/services/entity-manager.js index 1d75bbe125..287c7acdf7 100644 --- a/packages/core/content-manager/server/services/entity-manager.js +++ b/packages/core/content-manager/server/services/entity-manager.js @@ -7,6 +7,7 @@ const { ApplicationError } = require('@strapi/utils').errors; const { getDeepPopulate, getDeepPopulateDraftCount } = require('./utils/populate'); const { getDeepRelationsCount } = require('./utils/count'); const { sumDraftCounts } = require('./utils/draft'); +const { isRelationsPopulateEnabled } = require('./utils/populate'); const { hasDraftAndPublish } = strapiUtils.contentTypes; const { PUBLISHED_AT_ATTRIBUTE } = strapiUtils.contentTypes.constants; @@ -27,19 +28,6 @@ const emitEvent = async (event, entity, modelUid) => { }); }; -/** - * When webhooks.populateRelations is set to true, populated relations - * will be passed to any webhook event. The entity-manager - * response will not have the populated relations though. - * For performance reasons, it is recommended to set it to false, - * - * TODO V5: Set to false by default. - * TODO V5: Make webhooks always send the same entity data. - */ -const isRelationsPopulateEnabled = () => { - return strapi.config.get('server.webhooks.populateRelations', true); -}; - /** * @type {import('./entity-manager').default} */ From a9efdd0771a0d48076bfab1cf7f1f5a98e78cada Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Fri, 26 May 2023 12:34:00 +0200 Subject: [PATCH 046/172] feature: populate from query --- .../server/controllers/collection-types.js | 76 +++++-------------- 1 file changed, 20 insertions(+), 56 deletions(-) diff --git a/packages/core/content-manager/server/controllers/collection-types.js b/packages/core/content-manager/server/controllers/collection-types.js index b7c65853e8..ec78091feb 100644 --- a/packages/core/content-manager/server/controllers/collection-types.js +++ b/packages/core/content-manager/server/controllers/collection-types.js @@ -23,7 +23,7 @@ module.exports = { const populate = await populateBuilder(model) .populateDeep(1) - .countRelations({ toMany: true, toOne: false }) + .countRelations({ toOne: false }) .build(); const { results, pagination } = await entityManager.findPage( @@ -52,10 +52,11 @@ module.exports = { return ctx.forbidden(); } + const permissionQuery = await permissionChecker.sanitizedQuery.read(ctx.query); const populate = await populateBuilder(model) - .populateRequiredPermissions(permissionChecker, ctx.query) + .populateFromQuery(permissionQuery) .populateDeep(Infinity) - .countRelations({ toMany: true, toOne: true }) + .countRelations() .build(); const entity = await entityManager.findOne(id, model, { populate }); @@ -69,7 +70,7 @@ module.exports = { return ctx.forbidden(); } - // TODO: Move the transform relations to count here. + // TODO: Count populated relations by permissions ctx.body = await permissionChecker.sanitizeOutput(entity); }, @@ -96,13 +97,7 @@ module.exports = { const sanitizedBody = await sanitizeFn(body); - const populate = await populateBuilder(model) - .populateDeep(Infinity) - // TODO: Use config to know if we need to count relations or not - .countRelations({ toMany: true, toOne: true }) - .build(); - - const entity = await entityManager.create(sanitizedBody, model, { populate }); + const entity = await entityManager.create(sanitizedBody, model); ctx.body = await permissionChecker.sanitizeOutput(entity); @@ -125,9 +120,8 @@ module.exports = { return ctx.forbidden(); } - const populate = await populateBuilder(model) - .populateRequiredPermissions(permissionChecker, ctx.query) - .build(); + const permissionQuery = await permissionChecker.sanitizedQuery.update(ctx.query); + const populate = await populateBuilder(model).populateFromQuery(permissionQuery).build(); const entity = await entityManager.findOne(id, model, { populate }); @@ -145,15 +139,7 @@ module.exports = { const sanitizeFn = pipeAsync(pickWritables, pickPermittedFields, setCreator); const sanitizedBody = await sanitizeFn(body); - const populateUpdate = await populateBuilder(model) - .populateDeep(Infinity) - // TODO: Use config to know if we need to count relations or not - .countRelations({ toMany: true, toOne: true }) - .build(); - - const updatedEntity = await entityManager.update(entity, sanitizedBody, model, { - populate: populateUpdate, - }); + const updatedEntity = await entityManager.update(entity, sanitizedBody, model); ctx.body = await permissionChecker.sanitizeOutput(updatedEntity); }, @@ -169,9 +155,8 @@ module.exports = { return ctx.forbidden(); } - const populate = await populateBuilder(model) - .populateRequiredPermissions(permissionChecker, ctx.query) - .build(); + const permissionQuery = await permissionChecker.sanitizedQuery.delete(ctx.query); + const populate = await populateBuilder(model).populateFromQuery(permissionQuery).build(); const entity = await entityManager.findOne(id, model, { populate }); @@ -183,13 +168,7 @@ module.exports = { return ctx.forbidden(); } - const populateDelete = await populateBuilder(model) - .populateDeep(Infinity) - // TODO: Use config to know if we need to count relations or not - .countRelations({ toMany: true, toOne: true }) - .build(); - - const result = await entityManager.delete(entity, model, { populate: populateDelete }); + const result = await entityManager.delete(entity, model); // TODO: Count if config was enabled or populate based on permissions is not empty @@ -207,9 +186,8 @@ module.exports = { return ctx.forbidden(); } - const populate = await populateBuilder(model) - .populateRequiredPermissions(permissionChecker, ctx.query) - .build(); + const permissionQuery = await permissionChecker.sanitizedQuery.publish(ctx.query); + const populate = await populateBuilder(model).populateFromQuery(permissionQuery).build(); const entity = await entityManager.findOne(id, model, { populate }); @@ -221,16 +199,10 @@ module.exports = { return ctx.forbidden(); } - const populatePublish = await populateBuilder(model) - .populateDeep(Infinity) - .countRelations({ toMany: true, toOne: true }) - .build(); - const result = await entityManager.publish( entity, setCreatorFields({ user, isEdition: true })({}), - model, - { populate: populatePublish } + model ); ctx.body = await permissionChecker.sanitizeOutput(result); @@ -247,9 +219,8 @@ module.exports = { return ctx.forbidden(); } - const populate = await populateBuilder(model) - .populateRequiredPermissions(permissionChecker, ctx.query) - .build(); + const permissionQuery = await permissionChecker.sanitizedQuery.unpublish(ctx.query); + const populate = await populateBuilder(model).populateFromQuery(permissionQuery).build(); const entity = await entityManager.findOne(id, model, { populate }); @@ -261,16 +232,10 @@ module.exports = { return ctx.forbidden(); } - const populateUnpublish = await populateBuilder(model) - .populateDeep(Infinity) - .countRelations({ toMany: true, toOne: true }) - .build(); - const result = await entityManager.unpublish( entity, setCreatorFields({ user, isEdition: true })({}), - model, - { populate: populateUnpublish } + model ); ctx.body = await permissionChecker.sanitizeOutput(result); @@ -318,9 +283,8 @@ module.exports = { return ctx.forbidden(); } - const populate = await populateBuilder(model) - .populateRequiredPermissions(permissionChecker, ctx.query) - .build(); + const permissionQuery = await permissionChecker.sanitizedQuery.read(ctx.query); + const populate = await populateBuilder(model).populateFromQuery(permissionQuery).build(); const entity = await entityManager.findOne(id, model, { populate }); From f41e29c40b281f8a271a401ead299e1a2559175a Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Fri, 26 May 2023 12:34:18 +0200 Subject: [PATCH 047/172] feat: populate in relations and single types --- .../server/controllers/relations.js | 20 ++++++------------- .../server/controllers/single-types.js | 11 +++++++--- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/packages/core/content-manager/server/controllers/relations.js b/packages/core/content-manager/server/controllers/relations.js index 0baf86768c..d4044280ab 100644 --- a/packages/core/content-manager/server/controllers/relations.js +++ b/packages/core/content-manager/server/controllers/relations.js @@ -5,7 +5,6 @@ const { hasDraftAndPublish } = require('@strapi/utils').contentTypes; const { isAnyToMany } = require('@strapi/utils').relations; const { PUBLISHED_AT_ATTRIBUTE } = require('@strapi/utils').contentTypes.constants; const { populateBuilder } = require('../services/utils/populate/builder'); -const { isRelationsPopulateEnabled } = require('../services/utils/populate'); const { getService } = require('../utils'); const { validateFindAvailable, validateFindExisting } = require('./validation/relations'); @@ -57,10 +56,8 @@ module.exports = { if (entityId) { const entityManager = getService('entity-manager'); - const populate = await populateBuilder(model) - .populateDeep(Infinity) - .countRelations({ toMany: true, toOne: true }) - .build(); + const permissionQuery = await permissionChecker.sanitizedQuery.read(ctx.query); + const populate = await populateBuilder(model).populateFromQuery(permissionQuery).build(); const entity = await entityManager.findOne(entityId, model, { populate }); @@ -75,8 +72,7 @@ module.exports = { } else { // eslint-disable-next-line no-lonely-if if (entityId) { - const populate = await populateBuilder(model).populateDeep(Infinity).build(); - const entity = await strapi.entityService.findOne(model, entityId, { populate }); + const entity = await strapi.entityService.findOne(model, entityId); if (!entity) { return ctx.notFound(); @@ -169,11 +165,8 @@ module.exports = { return ctx.forbidden(); } - const countEnabled = !isRelationsPopulateEnabled(); - const populate = await populateBuilder(model) - .populateDeep(Infinity) - .countRelations({ toMany: countEnabled, toOne: countEnabled }) - .build(); + const permissionQuery = await permissionChecker.sanitizedQuery.read(ctx.query); + const populate = await populateBuilder(model).populateFromQuery(permissionQuery).build(); const entity = await entityManager.findOne(id, model, { populate }); @@ -185,8 +178,7 @@ module.exports = { return ctx.forbidden(); } } else { - const populate = await populateBuilder(model).populateDeep(Infinity).build(); - const entity = await strapi.entityService.findOne(model, id, { populate }); + const entity = await strapi.entityService.findOne(model, id); if (!entity) { return ctx.notFound(); diff --git a/packages/core/content-manager/server/controllers/single-types.js b/packages/core/content-manager/server/controllers/single-types.js index a46e40cb8e..6653d36390 100644 --- a/packages/core/content-manager/server/controllers/single-types.js +++ b/packages/core/content-manager/server/controllers/single-types.js @@ -3,12 +3,18 @@ const { setCreatorFields, pipeAsync } = require('@strapi/utils'); const { getService, pickWritableAttributes } = require('../utils'); +const { populateBuilder } = require('../services/utils/populate/builder'); const findEntity = async (query, model) => { const entityManager = getService('entity-manager'); - const entity = await entityManager.find(query, model); - return entityManager.assocCreatorRoles(entity); + const populate = await populateBuilder(model) + .populateFromQuery(query) + .populateDeep(Infinity) + .countRelations() + .build(); + + return entityManager.find(query, model, { populate }); }; module.exports = { @@ -56,7 +62,6 @@ module.exports = { } const sanitizedQuery = await permissionChecker.sanitizedQuery.update(query); - const entity = await findEntity(sanitizedQuery, model); const pickWritables = pickWritableAttributes({ model }); From f8f0b751853ec3445da0958df9e1ed63d77f8196 Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Fri, 26 May 2023 12:35:22 +0200 Subject: [PATCH 048/172] feat: populateFromQuery --- .../server/services/entity-manager.js | 49 ++++++++++--------- .../server/services/utils/populate/builder.js | 25 ++++++---- 2 files changed, 43 insertions(+), 31 deletions(-) diff --git a/packages/core/content-manager/server/services/entity-manager.js b/packages/core/content-manager/server/services/entity-manager.js index 287c7acdf7..33d5f5b744 100644 --- a/packages/core/content-manager/server/services/entity-manager.js +++ b/packages/core/content-manager/server/services/entity-manager.js @@ -7,7 +7,8 @@ const { ApplicationError } = require('@strapi/utils').errors; const { getDeepPopulate, getDeepPopulateDraftCount } = require('./utils/populate'); const { getDeepRelationsCount } = require('./utils/count'); const { sumDraftCounts } = require('./utils/draft'); -const { isRelationsPopulateEnabled } = require('./utils/populate'); +const { isPopulateRelationsEnabled } = require('./utils/populate'); +const { populateBuilder } = require('./utils/populate/builder'); const { hasDraftAndPublish } = strapiUtils.contentTypes; const { PUBLISHED_AT_ATTRIBUTE } = strapiUtils.contentTypes.constants; @@ -28,6 +29,15 @@ const emitEvent = async (event, entity, modelUid) => { }); }; +const buildCreateOrUpdatePopulate = (uid) => { + // User can configure to populate relations, so downstream services can use them. + // They will be transformed into counts later if this is set to true. + return populateBuilder(uid) + .populateDeep(Infinity) + .countRelationsIf(isPopulateRelationsEnabled(uid)) + .build(); +}; + /** * @type {import('./entity-manager').default} */ @@ -76,39 +86,38 @@ module.exports = ({ strapi }) => ({ .then((entity) => this.mapEntity(entity, uid)); }, - async create(body, uid, opts = {}) { + async create(body, uid) { const modelDef = strapi.getModel(uid); const publishData = { ...body }; + const populate = await buildCreateOrUpdatePopulate(uid); if (hasDraftAndPublish(modelDef)) { publishData[PUBLISHED_AT_ATTRIBUTE] = null; } - const params = { data: publishData, ...opts }; + const params = { data: publishData, populate }; const entity = await strapi.entityService .create(uid, params) .then((entity) => this.mapEntity(entity, uid)); - // If relations were populated, relations count will be returned instead of the array of relations. - if (isRelationsPopulateEnabled(uid)) { + if (isPopulateRelationsEnabled(uid)) { return getDeepRelationsCount(entity, uid); } return entity; }, - async update(entity, body, uid, opts = {}) { + async update(entity, body, uid) { const publishData = omitPublishedAtField(body); - - const params = { data: publishData, ...opts }; + const populate = await buildCreateOrUpdatePopulate(uid); + const params = { data: publishData, populate }; const updatedEntity = await strapi.entityService .update(uid, entity.id, params) .then((entity) => this.mapEntity(entity, uid)); - // If relations were populated, relations count will be returned instead of the array of relations. - if (isRelationsPopulateEnabled(uid)) { + if (isPopulateRelationsEnabled(uid)) { return getDeepRelationsCount(updatedEntity, uid); } @@ -119,7 +128,7 @@ module.exports = ({ strapi }) => ({ const deletedEntity = await strapi.entityService.delete(uid, entity.id, opts); // If relations were populated, relations count will be returned instead of the array of relations. - if (isRelationsPopulateEnabled(uid)) { + if (isPopulateRelationsEnabled(uid)) { return getDeepRelationsCount(deletedEntity, uid); } @@ -131,7 +140,7 @@ module.exports = ({ strapi }) => ({ return strapi.entityService.deleteMany(uid, opts); }, - async publish(entity, body = {}, uid, opts = {}) { + async publish(entity, body = {}, uid) { if (entity[PUBLISHED_AT_ATTRIBUTE]) { throw new ApplicationError('already.published'); } @@ -145,8 +154,9 @@ module.exports = ({ strapi }) => ({ ); const data = { ...body, [PUBLISHED_AT_ATTRIBUTE]: new Date() }; + const populate = await buildCreateOrUpdatePopulate(uid); - const params = { data, ...opts }; + const params = { data, populate }; const updatedEntity = await strapi.entityService.update(uid, entity.id, params); @@ -155,7 +165,7 @@ module.exports = ({ strapi }) => ({ const mappedEntity = await this.mapEntity(updatedEntity, uid); // If relations were populated, relations count will be returned instead of the array of relations. - if (isRelationsPopulateEnabled(uid)) { + if (isPopulateRelationsEnabled(uid)) { return getDeepRelationsCount(mappedEntity, uid); } @@ -168,14 +178,9 @@ module.exports = ({ strapi }) => ({ } const data = { ...body, [PUBLISHED_AT_ATTRIBUTE]: null }; - const populateRelations = isRelationsPopulateEnabled(uid); + const populate = await buildCreateOrUpdatePopulate(uid); - const params = { - data, - populate: populateRelations - ? getDeepPopulate(uid, {}) - : getDeepPopulate(uid, { countMany: true, countOne: true }), - }; + const params = { data, populate }; const updatedEntity = await strapi.entityService.update(uid, entity.id, params); @@ -184,7 +189,7 @@ module.exports = ({ strapi }) => ({ const mappedEntity = await this.mapEntity(updatedEntity, uid); // If relations were populated, relations count will be returned instead of the array of relations. - if (isRelationsPopulateEnabled(uid)) { + if (isPopulateRelationsEnabled(uid)) { return getDeepRelationsCount(mappedEntity, uid); } diff --git a/packages/core/content-manager/server/services/utils/populate/builder.js b/packages/core/content-manager/server/services/utils/populate/builder.js index 4fa34ae3bc..fb4779c189 100644 --- a/packages/core/content-manager/server/services/utils/populate/builder.js +++ b/packages/core/content-manager/server/services/utils/populate/builder.js @@ -1,24 +1,31 @@ 'use strict'; -const { getDeepPopulate, getQueryPopulate } = require('../populate'); +const { getDeepPopulate, getQueryPopulate } = require('.'); function populateBuilder(uid) { + let getInitialPopulate = async () => {}; const deepPopulateOptions = { countMany: false, countOne: false, maxLevel: -1, }; - let getPopulatePermission; const builder = { - populateRequiredPermissions(permissionChecker, query) { - getPopulatePermission = async () => { - const permissionQuery = await permissionChecker.sanitizedQuery.read(query); - return getQueryPopulate(permissionQuery); - }; + /** + * Populates fields present in a query. + * Useful for populating fields that permissionChecker needs to validate. + */ + populateFromQuery(query) { + getInitialPopulate = async () => getQueryPopulate(uid, query); return builder; }, - countRelations({ toMany = false, toOne = false } = {}) { + countRelationsIf(condition, { toMany = true, toOne = true } = {}) { + if (condition) { + return this.countRelations({ toMany, toOne }); + } + return builder; + }, + countRelations({ toMany = true, toOne = true } = {}) { deepPopulateOptions.countMany = toMany; deepPopulateOptions.countOne = toOne; return builder; @@ -28,7 +35,7 @@ function populateBuilder(uid) { return builder; }, async build() { - const initialPopulate = getPopulatePermission ? await getPopulatePermission() : {}; + const initialPopulate = await getInitialPopulate(); if (deepPopulateOptions.maxLevel === -1) { return initialPopulate; From ba845dd0ac4eaa4ab9efa36e57eb27c4958afb38 Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Fri, 26 May 2023 12:37:52 +0200 Subject: [PATCH 049/172] chore: update entity manager types --- .../content-manager/server/services/entity-manager.d.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/core/content-manager/server/services/entity-manager.d.ts b/packages/core/content-manager/server/services/entity-manager.d.ts index be7b84eeba..853f98497d 100644 --- a/packages/core/content-manager/server/services/entity-manager.d.ts +++ b/packages/core/content-manager/server/services/entity-manager.d.ts @@ -1,17 +1,16 @@ interface EntityManager { - assocCreatorRoles(): any; + mapEntity(entity: T): T; + mapEntitiesResponse(entities: T[], uid: string): T[]; find(): any; findPage(): any; - findWithRelationCountsPage(): any; - count(): any; findOne(): any; - findOneWithCreatorRoles(): any; create(): any; update(): any; delete(): any; deleteMany(): any; publish(): any; unpublish(): any; + getNumberOfDraftRelations(id: string, uid: string): number; } export default function (opts: { strapi: Strapi }): EntityManager; From ee5d821fa7a4f4cd71c69f9bf60b3a3f8d0db1e3 Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Fri, 26 May 2023 13:05:08 +0200 Subject: [PATCH 050/172] chore: cleanup comments --- examples/getstarted/src/index.js | 14 +------------- .../server/controllers/collection-types.js | 2 -- packages/core/permissions/lib/engine/index.js | 5 ----- 3 files changed, 1 insertion(+), 20 deletions(-) diff --git a/examples/getstarted/src/index.js b/examples/getstarted/src/index.js index 3df2386e35..03f47913aa 100644 --- a/examples/getstarted/src/index.js +++ b/examples/getstarted/src/index.js @@ -7,19 +7,7 @@ module.exports = { * * This gives you an opportunity to extend code. */ - async register({ strapi }) { - await strapi.admin.services.permission.conditionProvider.register({ - displayName: 'Something', - name: 'is-something', - plugin: 'foo', - handler: (user) => ({ - // name: { $ne: 'MARC' }, - // addresses: { notrepeat_req: { name: 'toto' } }, - 'addresses.repeat_req': { $elemMatch: { name: 'toto' } }, - addresses: { $elemMatch: { postal_code: { $eq: '58' } } }, - }), - }); - }, + async register({ strapi }) {}, /** * An asynchronous bootstrap function that runs before diff --git a/packages/core/content-manager/server/controllers/collection-types.js b/packages/core/content-manager/server/controllers/collection-types.js index ec78091feb..65c2fd92af 100644 --- a/packages/core/content-manager/server/controllers/collection-types.js +++ b/packages/core/content-manager/server/controllers/collection-types.js @@ -170,8 +170,6 @@ module.exports = { const result = await entityManager.delete(entity, model); - // TODO: Count if config was enabled or populate based on permissions is not empty - ctx.body = await permissionChecker.sanitizeOutput(result); }, diff --git a/packages/core/permissions/lib/engine/index.js b/packages/core/permissions/lib/engine/index.js index cf42c943e7..1b5fc73d56 100644 --- a/packages/core/permissions/lib/engine/index.js +++ b/packages/core/permissions/lib/engine/index.js @@ -104,11 +104,6 @@ module.exports = { ({ result }) => _.isBoolean(result) || _.isObject(result) ); - // conditions: string[] - // resolveConditions: string[] => unknown[] - // removeInvalidConditions: unknown[] => Function[] - // evaluateConditions: Function[] => unknown[] - // removeInvalidResults: unknown[] => (boolean | object)[] const evaluatedConditions = await Promise.resolve(conditions) .then(resolveConditions) .then(removeInvalidConditions) From fabe6c7c710051ca7870da20673a93ed45bf387a Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Fri, 26 May 2023 13:17:48 +0200 Subject: [PATCH 051/172] chore: document populate builder --- .../server/services/utils/populate/builder.js | 40 ++++++++++++++++++- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/packages/core/content-manager/server/services/utils/populate/builder.js b/packages/core/content-manager/server/services/utils/populate/builder.js index fb4779c189..0929a230bf 100644 --- a/packages/core/content-manager/server/services/utils/populate/builder.js +++ b/packages/core/content-manager/server/services/utils/populate/builder.js @@ -2,6 +2,17 @@ const { getDeepPopulate, getQueryPopulate } = require('.'); +/** + * Builder to create a Strapi populate object. + * + * @param {string} uid - Content type UID + * @returns {Object} + * + * @example + * const populate = await populateBuilder('api::article.article').countRelations().build(); + * // populate = { article: { populate: { count: true } } } + * + */ function populateBuilder(uid) { let getInitialPopulate = async () => {}; const deepPopulateOptions = { @@ -12,28 +23,53 @@ function populateBuilder(uid) { const builder = { /** - * Populates fields present in a query. - * Useful for populating fields that permissionChecker needs to validate. + * Populates all attribute fields present in a query. + * @param {Object} query - Query object + * @returns {typeof builder} - Builder */ populateFromQuery(query) { getInitialPopulate = async () => getQueryPopulate(uid, query); return builder; }, + /** + * Populate relations as count if condition is true. + * @param {Boolean} condition + * @param {Object} options + * @param {Boolean} options.toMany - Populate XtoMany relations as count if true. + * @param {Boolean} options.toOne - Populate XtoOne relations as count if true. + * @returns {typeof builder} - Builder + */ countRelationsIf(condition, { toMany = true, toOne = true } = {}) { if (condition) { return this.countRelations({ toMany, toOne }); } return builder; }, + /** + * Populate relations as count. + * @param {Object} options + * @param {Boolean} options.toMany - Populate XtoMany relations as count if true. + * @param {Boolean} options.toOne - Populate XtoOne relations as count if true. + * @returns {typeof builder} - Builder + */ countRelations({ toMany = true, toOne = true } = {}) { deepPopulateOptions.countMany = toMany; deepPopulateOptions.countOne = toOne; return builder; }, + /** + * Populate relations deeply, up to a certain level. + * @param {Number} [level=Infinity] - Max level of nested populate. + * @returns {typeof builder} - Builder + */ populateDeep(level = Infinity) { deepPopulateOptions.maxLevel = level; return builder; }, + /** + * Construct the populate object based on the builder options. + * @returns {Object} - Populate object + */ async build() { const initialPopulate = await getInitialPopulate(); From ee592064283020f06bf48f3030cdb454d5e355f9 Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Fri, 26 May 2023 13:19:37 +0200 Subject: [PATCH 052/172] chore: document getQueryPopulate --- .../server/services/utils/populate/index.js | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/packages/core/content-manager/server/services/utils/populate/index.js b/packages/core/content-manager/server/services/utils/populate/index.js index 79f7baee1b..cf85de517b 100644 --- a/packages/core/content-manager/server/services/utils/populate/index.js +++ b/packages/core/content-manager/server/services/utils/populate/index.js @@ -213,7 +213,13 @@ const getDeepPopulateDraftCount = (uid) => { return { populate, hasRelations }; }; -// TODO: Explain this function and the populate format +/** + * Create a Strapi populate object which populates all attribute fields of a Strapi query. + * + * @param {string} uid + * @param {Object} query + * @returns {Object} populate object + */ const getQueryPopulate = async (uid, query) => { const pathToPopulate = (path) => path.replaceAll('.', '.populate.'); let populateQuery = {}; @@ -221,10 +227,10 @@ const getQueryPopulate = async (uid, query) => { await strapiUtils.traverse.traverseQueryFilters( /** * - * @param {*} param0 - * @param {*} param0.key - Attribute name - * @param {*} param0.attribute - Attribute definition - * @param {*} param0.path - Content Type path to the attribute + * @param {Object} param0 + * @param {string} param0.key - Attribute name + * @param {Object} param0.attribute - Attribute definition + * @param {string} param0.path - Content Type path to the attribute * @returns */ ({ key, attribute, path }) => { From 450b9fd7cf49300ab5a0ea5eaefda2d47000b304 Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Fri, 26 May 2023 13:21:53 +0200 Subject: [PATCH 053/172] chore: remove jsdoc unnecessary return --- .../content-manager/server/services/utils/populate/builder.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/core/content-manager/server/services/utils/populate/builder.js b/packages/core/content-manager/server/services/utils/populate/builder.js index 0929a230bf..29e5c8fdcc 100644 --- a/packages/core/content-manager/server/services/utils/populate/builder.js +++ b/packages/core/content-manager/server/services/utils/populate/builder.js @@ -6,7 +6,6 @@ const { getDeepPopulate, getQueryPopulate } = require('.'); * Builder to create a Strapi populate object. * * @param {string} uid - Content type UID - * @returns {Object} * * @example * const populate = await populateBuilder('api::article.article').countRelations().build(); From 00b166d4398f7cb3679c3ad15d27b2058fe678fb Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Fri, 26 May 2023 14:45:22 +0200 Subject: [PATCH 054/172] fix: single types unit test --- .../server/controllers/__tests__/single-types.test.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/core/content-manager/server/controllers/__tests__/single-types.test.js b/packages/core/content-manager/server/controllers/__tests__/single-types.test.js index 6915ec2d6e..9629c3d8e7 100644 --- a/packages/core/content-manager/server/controllers/__tests__/single-types.test.js +++ b/packages/core/content-manager/server/controllers/__tests__/single-types.test.js @@ -3,6 +3,13 @@ const createContext = require('../../../../../../test/helpers/create-context'); const singleTypes = require('../single-types'); +// Mock the populate functions +jest.mock('../../services/utils/populate', () => ({ + ...jest.requireActual('../../services/utils/populate'), + getDeepPopulate: () => ({}), + getQueryPopulate: async () => ({}), +})); + describe('Single Types', () => { test('Successfull find', async () => { const state = { @@ -36,6 +43,7 @@ describe('Single Types', () => { }, }, }, + getModel: jest.fn(), plugins: { 'content-manager': { services: { From 9fca32a25e21b64c8f2664b2d1153f2eb8ae4314 Mon Sep 17 00:00:00 2001 From: Convly Date: Fri, 26 May 2023 15:23:50 +0200 Subject: [PATCH 055/172] Update data transfer types --- .../data-transfer/types/common-entities.d.ts | 9 ++++----- .../core/data-transfer/types/encryption.d.ts | 2 +- .../core/data-transfer/types/providers.d.ts | 10 +++++----- .../protocol/client/transfer/index.d.ts | 1 + .../remote/protocol/client/transfer/pull.d.ts | 2 +- .../remote/protocol/client/transfer/push.d.ts | 10 ++-------- .../protocol/client/transfer/utils.d.ts | 8 ++++++++ .../types/remote/protocol/index.d.ts | 4 ++-- .../data-transfer/types/transfer-engine.d.ts | 7 +++---- packages/core/data-transfer/types/utils.d.ts | 20 +++++++++++-------- 10 files changed, 39 insertions(+), 34 deletions(-) diff --git a/packages/core/data-transfer/types/common-entities.d.ts b/packages/core/data-transfer/types/common-entities.d.ts index 4c682b49e2..64bdc778a5 100644 --- a/packages/core/data-transfer/types/common-entities.d.ts +++ b/packages/core/data-transfer/types/common-entities.d.ts @@ -1,5 +1,4 @@ -import type { GetAttributesValues, RelationsType } from '@strapi/strapi'; -import type { SchemaUID } from '@strapi/strapi/lib/types/utils'; +import type { Attribute, Common } from '@strapi/strapi'; import type { Readable } from 'stream'; export interface IMetadata { @@ -14,7 +13,7 @@ export interface IMetadata { * Common TransferEngine format to represent a Strapi entity * @template T The schema UID this entity represents */ -export interface IEntity { +export interface IEntity { /** * UID of the parent type (content-type, component, etc...) */ @@ -29,7 +28,7 @@ export interface IEntity { /** * The entity data (attributes value) */ - data: GetAttributesValues; + data: Attribute.GetValues; } /** @@ -50,7 +49,7 @@ interface IDefaultLink { /** * The relation type */ - relation: RelationsType; + relation: Attribute.RelationsType; /** * Left side of the link diff --git a/packages/core/data-transfer/types/encryption.d.ts b/packages/core/data-transfer/types/encryption.d.ts index 70c840e715..d56f6bb178 100644 --- a/packages/core/data-transfer/types/encryption.d.ts +++ b/packages/core/data-transfer/types/encryption.d.ts @@ -1,4 +1,4 @@ -import type { Cipher, CipherKey, BinaryLike } from 'crypto'; +import type { Cipher } from 'crypto'; export type EncryptionStrategy = (key: string) => Cipher; diff --git a/packages/core/data-transfer/types/providers.d.ts b/packages/core/data-transfer/types/providers.d.ts index 97bc1f6977..9cad099d18 100644 --- a/packages/core/data-transfer/types/providers.d.ts +++ b/packages/core/data-transfer/types/providers.d.ts @@ -1,16 +1,16 @@ -import type { PipelineSource, PipelineDestination, Readable, Writable } from 'stream'; +import type { Schema, Utils } from '@strapi/strapi'; +import type { Readable, Writable } from 'stream'; import type { IDestinationProviderTransferResults, IProviderTransferResults, ISourceProviderTransferResults, - Stream, MaybePromise, } from './utils'; import type { IMetadata } from './common-entities'; -type ProviderType = 'source' | 'destination'; +export type ProviderType = 'source' | 'destination'; -interface IProvider { +export interface IProvider { type: ProviderType; name: string; results?: IProviderTransferResults; @@ -19,7 +19,7 @@ interface IProvider { close?(): MaybePromise; getMetadata(): MaybePromise; - getSchemas?(): MaybePromise; + getSchemas?(): MaybePromise | null>; beforeTransfer?(): MaybePromise; validateOptions?(): MaybePromise; diff --git a/packages/core/data-transfer/types/remote/protocol/client/transfer/index.d.ts b/packages/core/data-transfer/types/remote/protocol/client/transfer/index.d.ts index 037b3bc61f..8a58f8368b 100644 --- a/packages/core/data-transfer/types/remote/protocol/client/transfer/index.d.ts +++ b/packages/core/data-transfer/types/remote/protocol/client/transfer/index.d.ts @@ -5,6 +5,7 @@ import type { TransferPushMessage } from './push'; export * from './action'; export * from './pull'; export * from './push'; +export * from './utils'; export type TransferMessage = { type: 'transfer'; transferID: string } & ( | Action diff --git a/packages/core/data-transfer/types/remote/protocol/client/transfer/pull.d.ts b/packages/core/data-transfer/types/remote/protocol/client/transfer/pull.d.ts index 544d996b79..97c28acfe7 100644 --- a/packages/core/data-transfer/types/remote/protocol/client/transfer/pull.d.ts +++ b/packages/core/data-transfer/types/remote/protocol/client/transfer/pull.d.ts @@ -1,5 +1,5 @@ import type { IEntity, ILink, IConfiguration } from '../../../../common-entities'; -import { CreateTransferMessage } from './utils'; +import { CreateTransferMessage, TransferAssetFlow } from './utils'; export type TransferPullMessage = CreateTransferMessage< 'step', diff --git a/packages/core/data-transfer/types/remote/protocol/client/transfer/push.d.ts b/packages/core/data-transfer/types/remote/protocol/client/transfer/push.d.ts index 38867fad1b..0b9a0bd50b 100644 --- a/packages/core/data-transfer/types/remote/protocol/client/transfer/push.d.ts +++ b/packages/core/data-transfer/types/remote/protocol/client/transfer/push.d.ts @@ -1,5 +1,5 @@ -import type { CreateTransferMessage } from './utils'; -import type { IEntity, ILink, IConfiguration, IAsset } from '../../../../common-entities'; +import type { CreateTransferMessage, TransferAssetFlow } from './utils'; +import type { IEntity, ILink, IConfiguration } from '../../../../common-entities'; export type TransferPushMessage = CreateTransferMessage< 'step', @@ -23,9 +23,3 @@ export type TransferPushStep = TransferPushMessage['step']; type TransferStepCommands = { step: T } & TransferStepFlow; type TransferStepFlow = { action: 'start' } | { action: 'stream'; data: U } | { action: 'end' }; - -type TransferAssetFlow = { assetID: string } & ( - | { action: 'start'; data: Omit } - | { action: 'stream'; data: Buffer } - | { action: 'end' } -); diff --git a/packages/core/data-transfer/types/remote/protocol/client/transfer/utils.d.ts b/packages/core/data-transfer/types/remote/protocol/client/transfer/utils.d.ts index b9d838c95e..3ef2001240 100644 --- a/packages/core/data-transfer/types/remote/protocol/client/transfer/utils.d.ts +++ b/packages/core/data-transfer/types/remote/protocol/client/transfer/utils.d.ts @@ -1,5 +1,13 @@ +import type { IAsset } from '../../../../common-entities'; + export type CreateTransferMessage = { type: 'transfer'; kind: T; transferID: string; } & U; + +export type TransferAssetFlow = { assetID: string } & ( + | { action: 'start'; data: Omit } + | { action: 'stream'; data: Buffer } + | { action: 'end' } +); diff --git a/packages/core/data-transfer/types/remote/protocol/index.d.ts b/packages/core/data-transfer/types/remote/protocol/index.d.ts index 4cbe5b42a3..2fbdb56fd6 100644 --- a/packages/core/data-transfer/types/remote/protocol/index.d.ts +++ b/packages/core/data-transfer/types/remote/protocol/index.d.ts @@ -1,2 +1,2 @@ -export * as client from './client'; -export * as server from './server'; +export * as Client from './client'; +export * as Server from './server'; diff --git a/packages/core/data-transfer/types/transfer-engine.d.ts b/packages/core/data-transfer/types/transfer-engine.d.ts index 1c9c729739..32a8020f72 100644 --- a/packages/core/data-transfer/types/transfer-engine.d.ts +++ b/packages/core/data-transfer/types/transfer-engine.d.ts @@ -1,12 +1,11 @@ import type { PassThrough } from 'stream'; import type { ITransferResults, TransferTransforms, TransferProgress } from './utils'; import type { ISourceProvider, IDestinationProvider } from './providers'; -import type { DiagnosticReporter } from '../src/engine/diagnostic'; +import type { IDiagnosticReporter } from '../src/engine/diagnostic'; +import type { Diff } from '../src/utils/json'; export type TransferFilterPreset = 'content' | 'files' | 'config'; -type SchemaMap = Record; - // Error resolving handler middleware for the transfer engine export type NextMiddleware = (context: T) => void | Promise; export type Middleware = (context: T, next: NextMiddleware) => Promise | void; @@ -42,7 +41,7 @@ export interface ITransferEngine< * A diagnostic reporter instance used to gather information about * errors, warnings and information emitted by the engine */ - diagnostics: DiagnosticReporter; + diagnostics: IDiagnosticReporter; /** * Utilities used to retrieve transfer progress data */ diff --git a/packages/core/data-transfer/types/utils.d.ts b/packages/core/data-transfer/types/utils.d.ts index f72de86b88..fab6cdf40b 100644 --- a/packages/core/data-transfer/types/utils.d.ts +++ b/packages/core/data-transfer/types/utils.d.ts @@ -1,15 +1,15 @@ /* eslint-disable @typescript-eslint/ban-types */ -import type { Readable, Writable, Duplex, Transform } from 'stream'; import type { Schema } from '@strapi/strapi'; -import type { KnexTransaction } from 'knex'; -import type { IDestinationProvider, ISourceProvider } from './providers'; +import type { Knex } from 'knex'; +import type { Duplex, Readable, Transform, Writable } from 'stream'; import type { IAsset, IEntity, ILink } from './common-entities'; +import type { IDestinationProvider, ISourceProvider } from './providers'; export type MaybePromise = T | Promise; // The data type passed in for each stage export type TransferStageTypeMap = { - schemas: Schema; + schemas: Schema.Schema; entities: IEntity; links: ILink; assets: IAsset; @@ -31,7 +31,7 @@ export type TransferMap = { }; export type Stream = Readable | Writable | Duplex | Transform; -export type TransformFunction = (chunk: any, encoding?: string) => any; +export type TransformFunction = (chunk: unknown, encoding?: string) => unknown; export type StreamItem = Stream | TransformFunction; export type TransferTransformsTypeMap = TransferStageTypeMap & { @@ -40,7 +40,9 @@ export type TransferTransformsTypeMap = TransferStageTypeMap & { export type TransferStage = keyof TransferStageTypeMap; -export type TransferTransformArray = TransferTransform[]; +export type TransferTransformArray = TransferTransform< + TransferTransformsTypeMap[T] +>[]; export type TransferTransformOption = keyof TransferTransformsTypeMap; @@ -51,7 +53,9 @@ export type TransferTransforms = { /* * Filters */ -export type TransferFilterArray = TransferFilter[]; +export type TransferFilterArray = TransferFilter< + TransferTransforms[T] +>[]; export type TransferFilters = { [key in TransferTransformOption]?: boolean | TransferFilterArray; @@ -86,7 +90,7 @@ export type IProviderTransferResults = {}; export type ISourceProviderTransferResults = {}; export type IDestinationProviderTransferResults = {}; -export type { KnexTransaction }; +export type KnexTransaction = Knex.Transaction; export type TransactionCallback = (trx?: KnexTransaction) => Promise; export type Transaction = { attach(callback: TransactionCallback): Promise; From 9bd29e3d9b83dd21e8afe74752fb7dbb161a473d Mon Sep 17 00:00:00 2001 From: Convly Date: Fri, 26 May 2023 15:25:12 +0200 Subject: [PATCH 056/172] Update data transfer code to adapt with new types --- .../src/engine/__tests__/engine.test.ts | 26 +-- .../core/data-transfer/src/engine/index.ts | 181 ++++-------------- .../src/engine/validation/schemas/index.ts | 4 +- .../src/file/providers/source/index.ts | 2 +- .../strategies/restore/entities.ts | 8 +- .../strategies/restore/index.ts | 6 +- .../strapi/providers/local-source/entities.ts | 6 +- .../providers/remote-destination/index.ts | 27 +-- .../strapi/providers/remote-source/index.ts | 78 ++++++-- .../src/strapi/providers/utils.ts | 28 +-- .../src/strapi/queries/entity.ts | 11 +- .../src/strapi/remote/handlers/pull.ts | 12 +- .../src/strapi/remote/handlers/push.ts | 18 +- .../src/strapi/remote/handlers/utils.ts | 2 +- .../core/data-transfer/src/utils/schema.ts | 8 +- .../lib/types/core/attributes/common.d.ts | 6 +- .../strapi/lib/types/core/attributes/uid.d.ts | 2 +- 17 files changed, 191 insertions(+), 234 deletions(-) diff --git a/packages/core/data-transfer/src/engine/__tests__/engine.test.ts b/packages/core/data-transfer/src/engine/__tests__/engine.test.ts index b7ea5e6ca9..0af68b86c7 100644 --- a/packages/core/data-transfer/src/engine/__tests__/engine.test.ts +++ b/packages/core/data-transfer/src/engine/__tests__/engine.test.ts @@ -145,28 +145,32 @@ const schemas = { }, }; +type Entity = IEntity< + 'api::foo.foo' | 'api::bar.bar' | 'admin::permission' | 'api::homepage.homepage' +>; + const getEntitiesMockSourceStream = ( - data: Iterable> = [ - { id: 1, type: 'foo', data: { foo: 'bar' } }, - { id: 2, type: 'bar', data: { bar: 'foo' } }, + data: Array = [ + { id: 1, type: 'api::foo.foo', data: { foo: 'bar' } }, + { id: 2, type: 'api::bar.bar', data: { bar: 'foo' } }, { id: 1, type: 'admin::permission', data: { foo: 'bar' } }, { id: 2, type: 'api::homepage.homepage', data: { bar: 'foo' } }, ] ) => getMockSourceStream(data); const getLinksMockSourceStream = ( - data: Iterable = [ + data: Array = [ { kind: 'relation.basic', relation: 'oneToOne', - left: { type: 'foo', ref: 1, field: 'foo' }, - right: { type: 'bar', ref: 2, field: 'bar' }, + left: { type: 'api::foo.foo', ref: 1, field: 'foo' }, + right: { type: 'api::bar.bar', ref: 2, field: 'bar' }, }, { kind: 'relation.basic', relation: 'oneToMany', - left: { type: 'foo', ref: 1, field: 'foos' }, - right: { type: 'bar', ref: 2, field: 'bar' }, + left: { type: 'api::foo.foo', ref: 1, field: 'foos' }, + right: { type: 'api::bar.bar', ref: 2, field: 'bar' }, }, ] ) => getMockSourceStream(data); @@ -196,7 +200,7 @@ const getConfigurationMockSourceStream = ( ) => getMockSourceStream(data); const getSchemasMockSourceStream = ( - data: Iterable = [ + data: Array = [ { info: { displayName: 'foo' }, modelType: 'contentType', @@ -245,10 +249,10 @@ const metadata = { const createSource = (streamData?: { assets?: IAsset[]; - entities?: IEntity[]; + entities?: Entity[]; links?: ILink[]; configuration?: IConfiguration[]; - schemas?: Schema[]; + schemas?: Schema.Schema[]; }): ISourceProvider => { return { type: 'source', diff --git a/packages/core/data-transfer/src/engine/index.ts b/packages/core/data-transfer/src/engine/index.ts index cfdc52a2a2..917df2098c 100644 --- a/packages/core/data-transfer/src/engine/index.ts +++ b/packages/core/data-transfer/src/engine/index.ts @@ -1,16 +1,14 @@ import { PassThrough, Transform, Readable, Writable } from 'stream'; import { extname } from 'path'; import { EOL } from 'os'; -import { isEmpty, uniq, last, isNumber, difference, omit, set } from 'lodash/fp'; +import { isEmpty, uniq, last, isNumber } from 'lodash/fp'; import { diff as semverDiff } from 'semver'; -import type { Schema } from '@strapi/strapi'; -import * as utils from '../utils'; +import type { Schema, Utils } from '@strapi/strapi'; import type { IAsset, IDestinationProvider, IEntity, - ILink, IMetadata, ISourceProvider, ITransferEngine, @@ -22,9 +20,6 @@ import type { IProvider, TransferFilters, TransferFilterPreset, - SchemaDiffHandler, - SchemaDiffHandlerContext, - SchemaMap, } from '../../types'; import type { Diff } from '../utils/json'; @@ -38,7 +33,6 @@ import { ErrorDiagnosticSeverity, } from './diagnostic'; import { DataTransferError } from '../errors'; -import { runMiddleware } from '../utils/middleware'; export const TRANSFER_STAGES: ReadonlyArray = Object.freeze([ 'entities', @@ -79,9 +73,8 @@ export const TransferGroupPresets: TransferGroupFilter = { export const DEFAULT_VERSION_STRATEGY = 'ignore'; export const DEFAULT_SCHEMA_STRATEGY = 'strict'; -/** - * Transfer Engine Class - */ +type SchemaMap = Utils.StringRecord; + class TransferEngine< S extends ISourceProvider = ISourceProvider, D extends IDestinationProvider = IDestinationProvider @@ -105,16 +98,6 @@ class TransferEngine< diagnostics: IDiagnosticReporter; - #handlers: { - schemaDiff: SchemaDiffHandler[]; - } = { - schemaDiff: [], - }; - - onSchemaDiff(handler: SchemaDiffHandler) { - this.#handlers?.schemaDiff?.push(handler); - } - // Save the currently open stream so that we can access it at any time #currentStream?: Writable; @@ -134,8 +117,8 @@ class TransferEngine< /** * Report a fatal error and throw it */ - panic(error: Error) { - this.reportError(error, 'fatal'); + #panic(error: Error) { + this.#reportError(error, 'fatal'); throw error; } @@ -143,7 +126,7 @@ class TransferEngine< /** * Report an error diagnostic */ - reportError(error: Error, severity: ErrorDiagnosticSeverity) { + #reportError(error: Error, severity: ErrorDiagnosticSeverity) { this.diagnostics.report({ kind: 'error', details: { @@ -159,7 +142,7 @@ class TransferEngine< /** * Report a warning diagnostic */ - reportWarning(message: string, origin?: string) { + #reportWarning(message: string, origin?: string) { this.diagnostics.report({ kind: 'warning', details: { createdAt: new Date(), message, origin }, @@ -169,7 +152,7 @@ class TransferEngine< /** * Report an info diagnostic */ - reportInfo(message: string, params?: unknown) { + #reportInfo(message: string, params?: unknown) { this.diagnostics.report({ kind: 'info', details: { createdAt: new Date(), message, params }, @@ -390,7 +373,7 @@ class TransferEngine< const schemaDiffs = compareSchemas(sourceSchema, destinationSchema, strategy); if (schemaDiffs.length) { - diffs[key] = schemaDiffs as Diff[]; + diffs[key] = schemaDiffs as Diff[]; } }); @@ -405,11 +388,11 @@ class TransferEngine< const path = diff.path.join('.'); if (diff.kind === 'added') { - return `${path} exists in destination schema but not in source schema and the data will not be transferred.`; + return `${path} exists in destination schema but not in source schema`; } if (diff.kind === 'deleted') { - return `${path} exists in source schema but not in destination schema and the data will not be transferred.`; + return `${path} exists in source schema but not in destination schema`; } if (diff.kind === 'modified') { @@ -504,7 +487,7 @@ class TransferEngine< results.forEach((state) => { if (state.status === 'rejected') { - this.reportWarning(state.reason, `transfer(${stage})`); + this.#reportWarning(state.reason, `transfer(${stage})`); } }); @@ -531,7 +514,7 @@ class TransferEngine< .on('error', (e) => { updateEndTime(); this.#emitStageUpdate('error', stage); - this.reportError(e, 'error'); + this.#reportError(e, 'error'); destination.destroy(e); reject(e); }) @@ -547,11 +530,7 @@ class TransferEngine< // Cause an ongoing transfer to abort gracefully async abortTransfer(): Promise { - const err = new TransferEngineError('fatal', 'Transfer aborted.'); - if (!this.#currentStream) { - throw err; - } - this.#currentStream.destroy(err); + this.#currentStream?.destroy(new TransferEngineError('fatal', 'Transfer aborted.')); } async init(): Promise { @@ -578,7 +557,7 @@ class TransferEngine< results.forEach((result) => { if (result.status === 'rejected') { - this.panic(result.reason); + this.#panic(result.reason); } }); } @@ -594,7 +573,7 @@ class TransferEngine< results.forEach((result) => { if (result.status === 'rejected') { - this.panic(result.reason); + this.#panic(result.reason); } }); } @@ -613,54 +592,26 @@ class TransferEngine< } async integrityCheck() { - const sourceMetadata = await this.sourceProvider.getMetadata(); - const destinationMetadata = await this.destinationProvider.getMetadata(); - - if (sourceMetadata && destinationMetadata) { - this.#assertStrapiVersionIntegrity( - sourceMetadata?.strapi?.version, - destinationMetadata?.strapi?.version - ); - } - - const sourceSchemas = (await this.sourceProvider.getSchemas?.()) as SchemaMap; - const destinationSchemas = (await this.destinationProvider.getSchemas?.()) as SchemaMap; - try { + const sourceMetadata = await this.sourceProvider.getMetadata(); + const destinationMetadata = await this.destinationProvider.getMetadata(); + + if (sourceMetadata && destinationMetadata) { + this.#assertStrapiVersionIntegrity( + sourceMetadata?.strapi?.version, + destinationMetadata?.strapi?.version + ); + } + + const sourceSchemas = (await this.sourceProvider.getSchemas?.()) as SchemaMap; + const destinationSchemas = (await this.destinationProvider.getSchemas?.()) as SchemaMap; + if (sourceSchemas && destinationSchemas) { this.#assertSchemasMatching(sourceSchemas, destinationSchemas); } } catch (error) { - // if this is a schema matching error, allow handlers to resolve it - if (error instanceof TransferEngineValidationError && error.details?.details?.diffs) { - const schemaDiffs = error.details?.details?.diffs as Record; - - const context: SchemaDiffHandlerContext = { - ignoredDiffs: {}, - diffs: schemaDiffs, - source: this.sourceProvider, - destination: this.destinationProvider, - }; - - // if we don't have any handlers, throw the original error - if (isEmpty(this.#handlers.schemaDiff)) { - throw error; - } - - await runMiddleware(context, this.#handlers.schemaDiff); - - // if there are any remaining diffs that weren't ignored - const unresolvedDiffs = utils.json.diff(context.diffs, context.ignoredDiffs); - if (unresolvedDiffs.length) { - this.panic( - new TransferEngineValidationError('Unresolved differences in schema', { - check: 'schema.changes', - unresolvedDiffs, - }) - ); - } - - return; + if (error instanceof Error) { + this.#panic(error); } throw error; @@ -701,7 +652,7 @@ class TransferEngine< e instanceof Error && (!lastDiagnostic || lastDiagnostic.kind !== 'error' || lastDiagnostic.details.error !== e) ) { - this.reportError(e, (e as DataTransferError).severity || 'fatal'); + this.#reportError(e, (e as DataTransferError).severity || 'fatal'); } // Rollback the destination provider if an exception is thrown during the transfer @@ -725,9 +676,9 @@ class TransferEngine< } catch (error) { // Error happening during the before transfer step should be considered fatal errors if (error instanceof Error) { - this.panic(error); + this.#panic(error); } else { - this.panic( + this.#panic( new Error(`Unknwon error when executing "beforeTransfer" on the ${origin} provider`) ); } @@ -745,7 +696,9 @@ class TransferEngine< const destination = await this.destinationProvider.createSchemasWriteStream?.(); const transform = this.#createStageTransformStream(stage); - const tracker = this.#progressTracker(stage, { key: (value: Schema) => value.modelType }); + const tracker = this.#progressTracker(stage, { + key: (value: Schema.Schema) => value.modelType, + }); await this.#transferStage({ stage, source, destination, transform, tracker }); } @@ -756,36 +709,7 @@ class TransferEngine< const source = await this.sourceProvider.createEntitiesReadStream?.(); const destination = await this.destinationProvider.createEntitiesWriteStream?.(); - const transform = this.#createStageTransformStream(stage).pipe( - new Transform({ - objectMode: true, - transform: async (entity: IEntity, _encoding, callback) => { - const schemas = await this.destinationProvider.getSchemas?.(); - - if (!schemas) { - return callback(null, entity); - } - - // TODO: this would be safer if we only ignored things in ignoredDiffs, otherwise continue and let an error be thrown - const availableContentTypes = Object.entries(schemas) - .filter(([, schema]) => schema.modelType === 'contentType') - .map(([uid]) => uid); - - // If the type of the transferred entity doesn't exist in the destination, then discard it - if (!availableContentTypes.includes(entity.type)) { - return callback(null, undefined); - } - - const { type, data } = entity; - const attributes = (schemas[type] as Record).attributes as object; - - const attributesToRemove = difference(Object.keys(data), Object.keys(attributes)); - const updatedEntity = set('data', omit(attributesToRemove, data), entity); - - callback(null, updatedEntity); - }, - }) - ); + const transform = this.#createStageTransformStream(stage); const tracker = this.#progressTracker(stage, { key: (value: IEntity) => value.type }); await this.#transferStage({ stage, source, destination, transform, tracker }); @@ -797,32 +721,7 @@ class TransferEngine< const source = await this.sourceProvider.createLinksReadStream?.(); const destination = await this.destinationProvider.createLinksWriteStream?.(); - const transform = this.#createStageTransformStream(stage).pipe( - new Transform({ - objectMode: true, - transform: async (link: ILink, _encoding, callback) => { - const schemas = await this.destinationProvider.getSchemas?.(); - - if (!schemas) { - return callback(null, link); - } - - // TODO: this would be safer if we only ignored things in ignoredDiffs, otherwise continue and let an error be thrown - const availableContentTypes = Object.entries(schemas) - .filter(([, schema]) => schema.modelType === 'contentType') - .map(([uid]) => uid); - - const isValidType = (uid: string) => availableContentTypes.includes(uid); - - if (!isValidType(link.left.type) || !isValidType(link.right.type)) { - return callback(null, undefined); // ignore the link - } - - callback(null, link); - }, - }) - ); - + const transform = this.#createStageTransformStream(stage); const tracker = this.#progressTracker(stage); await this.#transferStage({ stage, source, destination, transform, tracker }); diff --git a/packages/core/data-transfer/src/engine/validation/schemas/index.ts b/packages/core/data-transfer/src/engine/validation/schemas/index.ts index aee394d239..99652860b2 100644 --- a/packages/core/data-transfer/src/engine/validation/schemas/index.ts +++ b/packages/core/data-transfer/src/engine/validation/schemas/index.ts @@ -21,11 +21,11 @@ const isAttributeIgnorable = (diff: Diff) => { // exclude admin tables that are not transferrable and are optionally available (such as audit logs which are only available in EE) const isOptionalAdminType = (diff: Diff) => { if ('value' in diff && isObject(diff.value)) { - const name = (diff?.value as Schema)?.info?.singularName; + const name = (diff?.value as Schema.Schema)?.info?.singularName; return (OPTIONAL_CONTENT_TYPES as ReadonlyArray).includes(name); } if ('values' in diff && isArray(diff.values) && isObject(diff.values[0])) { - const name = (diff?.values[0] as Schema)?.info?.singularName; + const name = (diff?.values[0] as Schema.Schema)?.info?.singularName; return (OPTIONAL_CONTENT_TYPES as ReadonlyArray).includes(name); } return false; diff --git a/packages/core/data-transfer/src/file/providers/source/index.ts b/packages/core/data-transfer/src/file/providers/source/index.ts index 80c993f1cc..f4ab425109 100644 --- a/packages/core/data-transfer/src/file/providers/source/index.ts +++ b/packages/core/data-transfer/src/file/providers/source/index.ts @@ -103,7 +103,7 @@ class LocalFileSourceProvider implements ISourceProvider { } async getSchemas() { - const schemas = await collect(this.createSchemasReadStream()); + const schemas = await collect(this.createSchemasReadStream()); if (isEmpty(schemas)) { throw new ProviderInitializationError('Could not load schemas from Strapi data file.'); diff --git a/packages/core/data-transfer/src/strapi/providers/local-destination/strategies/restore/entities.ts b/packages/core/data-transfer/src/strapi/providers/local-destination/strategies/restore/entities.ts index baccbb85ac..2cba4e78ce 100644 --- a/packages/core/data-transfer/src/strapi/providers/local-destination/strategies/restore/entities.ts +++ b/packages/core/data-transfer/src/strapi/providers/local-destination/strategies/restore/entities.ts @@ -1,4 +1,4 @@ -import type { SchemaUID } from '@strapi/strapi/lib/types/utils'; +import type { Common } from '@strapi/strapi'; import { get, last } from 'lodash/fp'; import { Writable } from 'stream'; @@ -10,7 +10,11 @@ import * as queries from '../../../../queries'; interface IEntitiesRestoreStreamOptions { strapi: Strapi.Strapi; - updateMappingTable(type: T, oldID: number, newID: number): void; + updateMappingTable( + type: T, + oldID: number, + newID: number + ): void; transaction?: Transaction; } diff --git a/packages/core/data-transfer/src/strapi/providers/local-destination/strategies/restore/index.ts b/packages/core/data-transfer/src/strapi/providers/local-destination/strategies/restore/index.ts index 3d4808a17c..cc891350d0 100644 --- a/packages/core/data-transfer/src/strapi/providers/local-destination/strategies/restore/index.ts +++ b/packages/core/data-transfer/src/strapi/providers/local-destination/strategies/restore/index.ts @@ -1,4 +1,4 @@ -import type { ContentTypeSchema } from '@strapi/strapi'; +import type { Schema } from '@strapi/strapi'; import { ProviderTransferError } from '../../../../../errors/providers'; import * as queries from '../../../../queries'; @@ -11,7 +11,7 @@ export interface IRestoreOptions { entities?: { include?: string[]; exclude?: string[]; - filters?: ((contentType: ContentTypeSchema) => boolean)[]; + filters?: ((contentType: Schema.ContentType) => boolean)[]; params?: { [uid: string]: unknown }; }; } @@ -38,7 +38,7 @@ const deleteEntitiesRecord = async ( ): Promise => { const { entities } = options; const query = queries.entity.createEntityQuery(strapi); - const contentTypes = Object.values(strapi.contentTypes); + const contentTypes = Object.values(strapi.contentTypes); const contentTypesToClear = contentTypes.filter((contentType) => { let keep = true; diff --git a/packages/core/data-transfer/src/strapi/providers/local-source/entities.ts b/packages/core/data-transfer/src/strapi/providers/local-source/entities.ts index 7aba49f26f..90a074c57f 100644 --- a/packages/core/data-transfer/src/strapi/providers/local-source/entities.ts +++ b/packages/core/data-transfer/src/strapi/providers/local-source/entities.ts @@ -1,4 +1,4 @@ -import type { ContentTypeSchema } from '@strapi/strapi'; +import type { Schema } from '@strapi/strapi'; import { Readable, PassThrough } from 'stream'; import * as shared from '../../queries'; @@ -8,7 +8,7 @@ import { IEntity } from '../../../../types'; * Generate and consume content-types streams in order to stream each entity individually */ export const createEntitiesStream = (strapi: Strapi.Strapi): Readable => { - const contentTypes: ContentTypeSchema[] = Object.values(strapi.contentTypes); + const contentTypes: Schema.ContentType[] = Object.values(strapi.contentTypes); async function* contentTypeStreamGenerator() { for (const contentType of contentTypes) { @@ -31,7 +31,7 @@ export const createEntitiesStream = (strapi: Strapi.Strapi): Readable => { return Readable.from( (async function* entitiesGenerator(): AsyncGenerator<{ entity: IEntity; - contentType: ContentTypeSchema; + contentType: Schema.ContentType; }> { for await (const { stream, contentType } of contentTypeStreamGenerator()) { try { diff --git a/packages/core/data-transfer/src/strapi/providers/remote-destination/index.ts b/packages/core/data-transfer/src/strapi/providers/remote-destination/index.ts index 13fef83cde..94efcbda7b 100644 --- a/packages/core/data-transfer/src/strapi/providers/remote-destination/index.ts +++ b/packages/core/data-transfer/src/strapi/providers/remote-destination/index.ts @@ -2,11 +2,12 @@ import { WebSocket } from 'ws'; import { randomUUID } from 'crypto'; import { Writable } from 'stream'; import { once } from 'lodash/fp'; +import type { Schema, Utils } from '@strapi/strapi'; import { createDispatcher, connectToWebsocket, trimTrailingSlash } from '../utils'; import type { IDestinationProvider, IMetadata, ProviderType, IAsset } from '../../../../types'; -import type { client, server } from '../../../../types/remote/protocol'; +import type { Client, Server } from '../../../../types/remote/protocol'; import type { ILocalStrapiDestinationProviderOptions } from '../local-destination'; import { TRANSFER_PATH } from '../../remote/constants'; import { ProviderTransferError, ProviderValidationError } from '../../../errors/providers'; @@ -52,18 +53,18 @@ class RemoteStrapiDestinationProvider implements IDestinationProvider { params: { options: { strategy, restore }, transfer: 'push' }, }); - const res = (await query) as server.Payload; + const res = (await query) as Server.Payload; if (!res?.transferID) { throw new ProviderTransferError('Init failed, invalid response from the server'); } return res.transferID; } - #startStepOnce(stage: client.TransferPushStep) { + #startStepOnce(stage: Client.TransferPushStep) { return once(() => this.#startStep(stage)); } - async #startStep(step: T) { + async #startStep(step: T) { try { await this.dispatcher?.dispatchTransferStep({ action: 'start', step }); } catch (e) { @@ -81,7 +82,7 @@ class RemoteStrapiDestinationProvider implements IDestinationProvider { return null; } - async #endStep(step: T) { + async #endStep(step: T) { try { await this.dispatcher?.dispatchTransferStep({ action: 'end', step }); } catch (e) { @@ -99,9 +100,9 @@ class RemoteStrapiDestinationProvider implements IDestinationProvider { return null; } - async #streamStep( + async #streamStep( step: T, - data: client.GetTransferPushStreamData + data: Client.GetTransferPushStreamData ) { try { await this.dispatcher?.dispatchTransferStep({ action: 'stream', step, data }); @@ -120,13 +121,13 @@ class RemoteStrapiDestinationProvider implements IDestinationProvider { return null; } - #writeStream(step: Exclude): Writable { + #writeStream(step: Exclude): Writable { type Step = typeof step; const batchSize = 1024 * 1024; // 1MB; const startTransferOnce = this.#startStepOnce(step); - let batch = [] as client.GetTransferPushStreamData; + let batch = [] as Client.GetTransferPushStreamData; const batchLength = () => jsonLength(batch); @@ -257,12 +258,12 @@ class RemoteStrapiDestinationProvider implements IDestinationProvider { await this.dispatcher?.dispatchTransferAction('rollback'); } - getSchemas(): Promise { + getSchemas() { if (!this.dispatcher) { return Promise.resolve(null); } - return this.dispatcher.dispatchTransferAction('getSchemas'); + return this.dispatcher.dispatchTransferAction>('getSchemas'); } createEntitiesWriteStream(): Writable { @@ -278,7 +279,7 @@ class RemoteStrapiDestinationProvider implements IDestinationProvider { } createAssetsWriteStream(): Writable | Promise { - let batch: client.TransferAssetFlow[] = []; + let batch: Client.TransferAssetFlow[] = []; let hasStarted = false; const batchSize = 1024 * 1024; // 1MB; @@ -296,7 +297,7 @@ class RemoteStrapiDestinationProvider implements IDestinationProvider { return streamError; }; - const safePush = async (chunk: client.TransferAssetFlow) => { + const safePush = async (chunk: Client.TransferAssetFlow) => { batch.push(chunk); if (batchLength() >= batchSize) { diff --git a/packages/core/data-transfer/src/strapi/providers/remote-source/index.ts b/packages/core/data-transfer/src/strapi/providers/remote-source/index.ts index 96667aafdc..ea7a301629 100644 --- a/packages/core/data-transfer/src/strapi/providers/remote-source/index.ts +++ b/packages/core/data-transfer/src/strapi/providers/remote-source/index.ts @@ -1,3 +1,4 @@ +import type { Schema, Utils } from '@strapi/strapi'; import { PassThrough, Readable } from 'stream'; import { WebSocket } from 'ws'; @@ -10,8 +11,12 @@ import type { ProviderType, TransferStage, } from '../../../../types'; -import { client, server } from '../../../../types/remote/protocol'; -import { ProviderTransferError, ProviderValidationError } from '../../../errors/providers'; +import { Client, Server } from '../../../../types/remote/protocol'; +import { + ProviderInitializationError, + ProviderTransferError, + ProviderValidationError, +} from '../../../errors/providers'; import { TRANSFER_PATH } from '../../remote/constants'; import { ILocalStrapiSourceProviderOptions } from '../local-source'; import { createDispatcher, connectToWebsocket, trimTrailingSlash } from '../utils'; @@ -166,17 +171,56 @@ class RemoteStrapiSourceProvider implements ISourceProvider { } async initTransfer(): Promise { - const query = this.dispatcher?.dispatchCommand({ - command: 'init', + return new Promise((resolve, reject) => { + this.ws + ?.on('unexpected-response', (_req, res) => { + if (res.statusCode === 401) { + return reject( + new ProviderInitializationError( + 'Failed to initialize the connection: Authentication Error' + ) + ); + } + + if (res.statusCode === 403) { + return reject( + new ProviderInitializationError( + 'Failed to initialize the connection: Authorization Error' + ) + ); + } + + if (res.statusCode === 404) { + return reject( + new ProviderInitializationError( + 'Failed to initialize the connection: Data transfer is not enabled on the remote host' + ) + ); + } + + return reject( + new ProviderInitializationError( + `Failed to initialize the connection: Unexpected server response ${res.statusCode}` + ) + ); + }) + ?.once('open', async () => { + const query = this.dispatcher?.dispatchCommand({ + command: 'init', + }); + + const res = (await query) as Server.Payload; + + if (!res?.transferID) { + return reject( + new ProviderTransferError('Init failed, invalid response from the server') + ); + } + + resolve(res.transferID); + }) + .once('error', reject); }); - - const res = (await query) as server.Payload; - - if (!res?.transferID) { - throw new ProviderTransferError('Init failed, invalid response from the server'); - } - - return res.transferID; } async bootstrap(): Promise { @@ -232,14 +276,16 @@ class RemoteStrapiSourceProvider implements ISourceProvider { }); } - async getSchemas(): Promise { + async getSchemas() { const schemas = - (await this.dispatcher?.dispatchTransferAction('getSchemas')) ?? null; + (await this.dispatcher?.dispatchTransferAction>( + 'getSchemas' + )) ?? null; return schemas; } - async #startStep(step: T) { + async #startStep(step: T) { try { return await this.dispatcher?.dispatchTransferStep({ action: 'start', step }); } catch (e) { @@ -267,7 +313,7 @@ class RemoteStrapiSourceProvider implements ISourceProvider { }); } - async #endStep(step: T) { + async #endStep(step: T) { try { await this.dispatcher?.dispatchTransferStep({ action: 'end', step }); } catch (e) { diff --git a/packages/core/data-transfer/src/strapi/providers/utils.ts b/packages/core/data-transfer/src/strapi/providers/utils.ts index 11396b41cd..820d9d4c98 100644 --- a/packages/core/data-transfer/src/strapi/providers/utils.ts +++ b/packages/core/data-transfer/src/strapi/providers/utils.ts @@ -1,7 +1,7 @@ import { randomUUID } from 'crypto'; import { RawData, WebSocket } from 'ws'; -import type { client, server } from '../../../types/remote/protocol'; +import type { Client, Server } from '../../../types/remote/protocol'; import { ProviderError, ProviderTransferError, @@ -9,7 +9,7 @@ import { } from '../../errors/providers'; interface IDispatcherState { - transfer?: { kind: client.TransferKind; id: string }; + transfer?: { kind: Client.TransferKind; id: string }; } interface IDispatchOptions { @@ -21,7 +21,7 @@ type Dispatch = Omit; export const createDispatcher = (ws: WebSocket) => { const state: IDispatcherState = {}; - type DispatchMessage = Dispatch; + type DispatchMessage = Dispatch; const dispatch = async ( message: DispatchMessage, @@ -48,7 +48,7 @@ export const createDispatcher = (ws: WebSocket) => { }); const onResponse = (raw: RawData) => { - const response: server.Message = JSON.parse(raw.toString()); + const response: Server.Message = JSON.parse(raw.toString()); if (response.uuid === uuid) { if (response.error) { return reject(new ProviderError('error', response.error.message)); @@ -64,33 +64,33 @@ export const createDispatcher = (ws: WebSocket) => { }); }; - const dispatchCommand = ( + const dispatchCommand = ( payload: { command: U; - } & ([client.GetCommandParams] extends [never] + } & ([Client.GetCommandParams] extends [never] ? unknown - : { params?: client.GetCommandParams }) + : { params?: Client.GetCommandParams }) ) => { - return dispatch({ type: 'command', ...payload } as client.CommandMessage); + return dispatch({ type: 'command', ...payload } as Client.CommandMessage); }; - const dispatchTransferAction = async (action: client.Action['action']) => { - const payload: Dispatch = { type: 'transfer', kind: 'action', action }; + const dispatchTransferAction = async (action: Client.Action['action']) => { + const payload: Dispatch = { type: 'transfer', kind: 'action', action }; return dispatch(payload, { attachTransfer: true }) ?? Promise.resolve(null); }; const dispatchTransferStep = async < T, - A extends client.TransferPushMessage['action'] = client.TransferPushMessage['action'], - S extends client.TransferPushStep = client.TransferPushStep + A extends Client.TransferPushMessage['action'] = Client.TransferPushMessage['action'], + S extends Client.TransferPushStep = Client.TransferPushStep >( payload: { step: S; action: A; - } & (A extends 'stream' ? { data: client.GetTransferPushStreamData } : unknown) + } & (A extends 'stream' ? { data: Client.GetTransferPushStreamData } : unknown) ) => { - const message: Dispatch = { + const message: Dispatch = { type: 'transfer', kind: 'step', ...payload, diff --git a/packages/core/data-transfer/src/strapi/queries/entity.ts b/packages/core/data-transfer/src/strapi/queries/entity.ts index 82003d0e08..36add753f1 100644 --- a/packages/core/data-transfer/src/strapi/queries/entity.ts +++ b/packages/core/data-transfer/src/strapi/queries/entity.ts @@ -1,15 +1,18 @@ -import type { ContentTypeSchema } from '@strapi/strapi'; +import type { Attribute, Schema } from '@strapi/strapi'; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore import * as componentsService from '@strapi/strapi/lib/services/entity-service/components'; import { assign, isArray, isEmpty, isObject, map, omit, size } from 'lodash/fp'; -const sanitizeComponentLikeAttributes = (model: ContentTypeSchema, data: T) => { +const sanitizeComponentLikeAttributes = ( + model: T, + data: Attribute.GetValues +) => { const { attributes } = model; const componentLikeAttributesKey = Object.entries(attributes) - .filter(([, attribute]) => ['component', 'dynamiczone'].includes(attribute.type)) + .filter(([, attribute]) => attribute.type === 'component' || attribute.type === 'dynamiczone') .map(([key]) => key); return omit(componentLikeAttributesKey, data); @@ -75,7 +78,7 @@ const createEntityQuery = (strapi: Strapi.Strapi) => { }; const getDeepPopulateComponentLikeQuery = ( - contentType: ContentTypeSchema, + contentType: Schema.ContentType, params = { select: '*' } ) => { const { attributes } = contentType; diff --git a/packages/core/data-transfer/src/strapi/remote/handlers/pull.ts b/packages/core/data-transfer/src/strapi/remote/handlers/pull.ts index ce1a2ce3b7..b3dc36a7c6 100644 --- a/packages/core/data-transfer/src/strapi/remote/handlers/pull.ts +++ b/packages/core/data-transfer/src/strapi/remote/handlers/pull.ts @@ -19,9 +19,9 @@ export interface PullHandler extends Handler { assertValidTransferAction(action: string): asserts action is PullTransferAction; - onTransferMessage(msg: Protocol.client.TransferMessage): Promise | unknown; - onTransferAction(msg: Protocol.client.Action): Promise | unknown; - onTransferStep(msg: Protocol.client.TransferPullMessage): Promise | unknown; + onTransferMessage(msg: Protocol.Client.TransferMessage): Promise | unknown; + onTransferAction(msg: Protocol.Client.Action): Promise | unknown; + onTransferStep(msg: Protocol.Client.TransferPullMessage): Promise | unknown; createReadableStreamForStep(step: TransferStage): Promise; @@ -113,7 +113,7 @@ export const createPullController = handlerControllerFactory - ): Promise> { + params: Protocol.Client.GetCommandParams<'end'> + ): Promise> { await this.verifyAuth(); if (this.transferID !== params.transferID) { diff --git a/packages/core/data-transfer/src/strapi/remote/handlers/push.ts b/packages/core/data-transfer/src/strapi/remote/handlers/push.ts index 2f54b0ef01..cc5e8ae5ca 100644 --- a/packages/core/data-transfer/src/strapi/remote/handlers/push.ts +++ b/packages/core/data-transfer/src/strapi/remote/handlers/push.ts @@ -62,24 +62,24 @@ export interface PushHandler extends Handler { /** * Callback when receiving a regular transfer message */ - onTransferMessage(msg: Protocol.client.TransferMessage): Promise | unknown; + onTransferMessage(msg: Protocol.Client.TransferMessage): Promise | unknown; /** * Callback when receiving a transfer action message */ - onTransferAction(msg: Protocol.client.Action): Promise | unknown; + onTransferAction(msg: Protocol.Client.Action): Promise | unknown; /** * Callback when receiving a transfer step message */ - onTransferStep(msg: Protocol.client.TransferPushMessage): Promise | unknown; + onTransferStep(msg: Protocol.Client.TransferPushMessage): Promise | unknown; /** * Start streaming an asset */ streamAsset( this: PushHandler, - payload: Protocol.client.GetTransferPushStreamData<'assets'> + payload: Protocol.Client.GetTransferPushStreamData<'assets'> ): Promise; // Transfer Flow @@ -248,7 +248,7 @@ export const createPushController = handlerControllerFactory - ): Promise> { + params: Protocol.Client.GetCommandParams<'init'> + ): Promise> { if (this.transferID || this.provider) { throw new Error('Transfer already in progress'); } @@ -466,8 +466,8 @@ export const createPushController = handlerControllerFactory - ): Promise> { + params: Protocol.Client.GetCommandParams<'end'> + ): Promise> { await this.verifyAuth(); if (this.transferID !== params.transferID) { diff --git a/packages/core/data-transfer/src/strapi/remote/handlers/utils.ts b/packages/core/data-transfer/src/strapi/remote/handlers/utils.ts index 5e08729624..13a9b3b995 100644 --- a/packages/core/data-transfer/src/strapi/remote/handlers/utils.ts +++ b/packages/core/data-transfer/src/strapi/remote/handlers/utils.ts @@ -32,7 +32,7 @@ export const assertValidHeader = (ctx: Context) => { } }; -export const isDataTransferMessage = (message: unknown): message is Protocol.client.Message => { +export const isDataTransferMessage = (message: unknown): message is Protocol.Client.Message => { if (!message || typeof message !== 'object') { return false; } diff --git a/packages/core/data-transfer/src/utils/schema.ts b/packages/core/data-transfer/src/utils/schema.ts index 1ab4c1dfde..e2045cad6e 100644 --- a/packages/core/data-transfer/src/utils/schema.ts +++ b/packages/core/data-transfer/src/utils/schema.ts @@ -1,4 +1,4 @@ -import type { Schema } from '@strapi/strapi'; +import type { Schema, Utils } from '@strapi/strapi'; import { mapValues, pick } from 'lodash/fp'; /** @@ -19,9 +19,9 @@ const VALID_SCHEMA_PROPERTIES = [ ]; /** - * Sanitize a schemas dictionnary by omiting unwanted properties + * Sanitize a schemas dictionary by omitting unwanted properties * The list of allowed properties can be found here: {@link VALID_SCHEMA_PROPERTIES} */ -export const mapSchemasValues = (schemas: Record) => { - return mapValues(pick(VALID_SCHEMA_PROPERTIES), schemas); +export const mapSchemasValues = (schemas: Utils.StringRecord) => { + return mapValues(pick(VALID_SCHEMA_PROPERTIES), schemas) as Utils.StringRecord; }; diff --git a/packages/core/strapi/lib/types/core/attributes/common.d.ts b/packages/core/strapi/lib/types/core/attributes/common.d.ts index 6f495e066f..fbd0b9c47d 100644 --- a/packages/core/strapi/lib/types/core/attributes/common.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/common.d.ts @@ -46,7 +46,7 @@ export type DefaultTo = { default: T }; export type Any = | Attribute.BigInteger | Attribute.Boolean - | Attribute.Component + | Attribute.Component | Attribute.DateTime | Attribute.Date | Attribute.Decimal @@ -56,7 +56,7 @@ export type Any = | Attribute.Float | Attribute.Integer | Attribute.JSON - | (Attribute.Media | Attribute.Media) + | Attribute.Media | Attribute.Password | Attribute.Relation | Attribute.RichText @@ -64,4 +64,4 @@ export type Any = | Attribute.Text | Attribute.Time | Attribute.Timestamp - | (Attribute.UID | Attribute.UID); + | Attribute.UID; diff --git a/packages/core/strapi/lib/types/core/attributes/uid.d.ts b/packages/core/strapi/lib/types/core/attributes/uid.d.ts index 85ab92335b..7536321777 100644 --- a/packages/core/strapi/lib/types/core/attributes/uid.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/uid.d.ts @@ -16,7 +16,7 @@ export interface UIDProperties< // UID options S extends UIDOptions = UIDOptions > { - targetField: U; + targetField: U extends undefined ? string | undefined : U; options: UIDOptions & S; } From b30a3b426f9da4a11c8dcbb8fb474525e506d5b9 Mon Sep 17 00:00:00 2001 From: Convly Date: Fri, 26 May 2023 15:26:36 +0200 Subject: [PATCH 057/172] Update ControllerHandler return type to accept void --- packages/core/strapi/lib/types/core/common/controller.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/strapi/lib/types/core/common/controller.d.ts b/packages/core/strapi/lib/types/core/common/controller.d.ts index 971a4c8d15..24b55beaf1 100644 --- a/packages/core/strapi/lib/types/core/common/controller.d.ts +++ b/packages/core/strapi/lib/types/core/common/controller.d.ts @@ -3,6 +3,6 @@ import type koa from 'koa'; export type ControllerHandler = ( context: koa.ExtendableContext, next: koa.Next -) => Promise | T; +) => Promise | T | void; export type Controller = Record; From 1b506673a1b06d6cdb6d70e0aecdd34e4ad0ad28 Mon Sep 17 00:00:00 2001 From: Convly Date: Fri, 26 May 2023 15:27:45 +0200 Subject: [PATCH 058/172] Use ColonsSeparator for api & plugin namespace (origin <> scope) --- packages/core/strapi/lib/types/core/namespace.d.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/strapi/lib/types/core/namespace.d.ts b/packages/core/strapi/lib/types/core/namespace.d.ts index 595be540d6..1f633ef262 100644 --- a/packages/core/strapi/lib/types/core/namespace.d.ts +++ b/packages/core/strapi/lib/types/core/namespace.d.ts @@ -13,12 +13,12 @@ export type Strapi = 'strapi'; /** * Namespace for scoped APIs resources */ -export type API = `api::${T}`; +export type API = `api${ColonsSeparator}${T}`; /** * Namespace for scoped plugins resources */ -export type Plugin = `plugin::${T}`; +export type Plugin = `plugin${ColonsSeparator}${T}`; /** * Namespace for global resources From 90b5fa8d55080772b6418ddcafe50c3dac414923 Mon Sep 17 00:00:00 2001 From: Convly Date: Fri, 26 May 2023 15:30:42 +0200 Subject: [PATCH 059/172] Rename AssertNamespaceIs to EnsureNamespaceMatches for uids --- packages/core/strapi/lib/types/core/uid.d.ts | 24 ++++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/core/strapi/lib/types/core/uid.d.ts b/packages/core/strapi/lib/types/core/uid.d.ts index 4a46b75431..46f64c9309 100644 --- a/packages/core/strapi/lib/types/core/uid.d.ts +++ b/packages/core/strapi/lib/types/core/uid.d.ts @@ -108,16 +108,16 @@ export type Parse = ExtractNamespace extends infer B extends N * It returns N (the {@link Namespace.Any} literal) if there is a match, never otherwise. * * @example - * type T = AssertNamespaceIs<'admin::foo', Namespace.Admin> + * type T = EnsureNamespaceMatches<'admin::foo', Namespace.Admin> * // ^ Namespace.Admin * @example - * type T = AssertNamespaceIs<'foo.bar', Namespace.API> + * type T = EnsureNamespaceMatches<'foo.bar', Namespace.API> * // ^ never * @example - * type T = AssertNamespaceIs<'api::foo.bar', Namespace.Plugin> + * type T = EnsureNamespaceMatches<'api::foo.bar', Namespace.Plugin> * // ^ never */ -export type AssertNamespaceIs = U extends StringSuffix< +export type EnsureNamespaceMatches = U extends StringSuffix< Namespace.WithSeparator > ? N @@ -137,18 +137,18 @@ export type Select> = Pick, P>; * Extract the namespace literal from a given UID. * * @example - * type T = AssertNamespaceIs<'admin::foo'> + * type T = ExtractNamespace<'admin::foo'> * // ^ Namespace.Admin * @example - * type T = AssertNamespaceIs<'api::foo.bar'> + * type T = ExtractNamespace<'api::foo.bar'> * // ^ Namespace.API * @example - * type T = AssertNamespaceIs<'admin::foo' | 'api::foo.bar'> + * type T = ExtractNamespace<'admin::foo' | 'api::foo.bar'> * // ^ Namespace.Admin | Namespace.API */ export type ExtractNamespace = - | AssertNamespaceIs - | AssertNamespaceIs - | AssertNamespaceIs - | AssertNamespaceIs - | AssertNamespaceIs; + | EnsureNamespaceMatches + | EnsureNamespaceMatches + | EnsureNamespaceMatches + | EnsureNamespaceMatches + | EnsureNamespaceMatches; From 2cdc6b07a3b716aac4a110f3b69ddf1dc8a92da8 Mon Sep 17 00:00:00 2001 From: Convly Date: Fri, 26 May 2023 15:33:09 +0200 Subject: [PATCH 060/172] Rename Contains to Includes --- packages/core/strapi/lib/types/core/registry.d.ts | 2 +- packages/core/strapi/lib/types/utils.d.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/core/strapi/lib/types/core/registry.d.ts b/packages/core/strapi/lib/types/core/registry.d.ts index c204bb2a20..7efb556a2d 100644 --- a/packages/core/strapi/lib/types/core/registry.d.ts +++ b/packages/core/strapi/lib/types/core/registry.d.ts @@ -51,7 +51,7 @@ export type Keys = Extract; * type T = keyof WhereKeys; * // ^ "plugin::foo.bar" | "admin::foo" | "admin::bar" * - * type T = keyof WhereKeys }>; + * type T = keyof WhereKeys }>; * // ^ "api::foo.bar" | "api::foo.baz" */ export type WhereKeys, U extends UID.Any = UID.Any> = { diff --git a/packages/core/strapi/lib/types/utils.d.ts b/packages/core/strapi/lib/types/utils.d.ts index d09cffd5f7..adb16e8880 100644 --- a/packages/core/strapi/lib/types/utils.d.ts +++ b/packages/core/strapi/lib/types/utils.d.ts @@ -10,9 +10,9 @@ export type Literal = string | number | bigint | boolean; /** - * Used to check if a string contains a given literal + * Used to check if a string includes a given literal */ -export type Contains = `${string}${S}${string}`; +export type Includes = `${string}${S}${string}`; /** * Used to make sure the given string is not empty From 8adcef602904ee2005ff9351274276707e39bbf4 Mon Sep 17 00:00:00 2001 From: Marc Date: Fri, 26 May 2023 16:08:40 +0200 Subject: [PATCH 061/172] Update examples/getstarted/src/index.js MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jean-Sébastien Herbaux --- examples/getstarted/src/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/getstarted/src/index.js b/examples/getstarted/src/index.js index 03f47913aa..5abfcc85cf 100644 --- a/examples/getstarted/src/index.js +++ b/examples/getstarted/src/index.js @@ -7,7 +7,7 @@ module.exports = { * * This gives you an opportunity to extend code. */ - async register({ strapi }) {}, + register({ strapi }) {}, /** * An asynchronous bootstrap function that runs before From 832b4aa46d5805924fe74f70f5c6fdf4212b3789 Mon Sep 17 00:00:00 2001 From: Marc Date: Fri, 26 May 2023 16:11:33 +0200 Subject: [PATCH 062/172] Update packages/core/content-manager/server/controllers/collection-types.js MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jean-Sébastien Herbaux --- .../core/content-manager/server/controllers/collection-types.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/content-manager/server/controllers/collection-types.js b/packages/core/content-manager/server/controllers/collection-types.js index 65c2fd92af..0969482429 100644 --- a/packages/core/content-manager/server/controllers/collection-types.js +++ b/packages/core/content-manager/server/controllers/collection-types.js @@ -23,7 +23,7 @@ module.exports = { const populate = await populateBuilder(model) .populateDeep(1) - .countRelations({ toOne: false }) + .countRelations({ toOne: false, toMany: true }) .build(); const { results, pagination } = await entityManager.findPage( From 94e3595718fd483c07722fecf8a382b933aab428 Mon Sep 17 00:00:00 2001 From: Convly Date: Fri, 26 May 2023 17:14:07 +0200 Subject: [PATCH 063/172] Move utils to namespaces & fix types --- .../core/data-transfer/src/engine/index.ts | 2 +- .../providers/remote-destination/index.ts | 2 +- .../strapi/providers/remote-source/index.ts | 2 +- .../core/data-transfer/src/utils/schema.ts | 4 +- .../lib/types/core/attributes/common.d.ts | 8 +- .../types/core/attributes/dynamic-zone.d.ts | 2 +- .../types/core/attributes/enumeration.d.ts | 2 +- .../lib/types/core/attributes/relation.d.ts | 6 +- .../strapi/lib/types/core/attributes/uid.d.ts | 19 ++- .../lib/types/core/attributes/utils.d.ts | 6 +- .../lib/types/core/common/controller.d.ts | 6 +- .../strapi/lib/types/core/common/uid.d.ts | 4 +- .../core/strapi/lib/types/core/namespace.d.ts | 2 +- .../strapi/lib/types/core/schemas/index.d.ts | 4 +- .../strapi/lib/types/core/strapi/index.d.ts | 9 +- packages/core/strapi/lib/types/core/uid.d.ts | 2 +- packages/core/strapi/lib/types/utils.d.ts | 121 ------------------ .../core/strapi/lib/types/utils/array.d.ts | 6 + .../core/strapi/lib/types/utils/guard.d.ts | 14 ++ .../core/strapi/lib/types/utils/index.d.ts | 18 +++ .../core/strapi/lib/types/utils/object.d.ts | 29 +++++ .../core/strapi/lib/types/utils/string.d.ts | 38 ++++++ .../core/strapi/lib/types/utils/tuple.d.ts | 13 ++ 23 files changed, 162 insertions(+), 157 deletions(-) delete mode 100644 packages/core/strapi/lib/types/utils.d.ts create mode 100644 packages/core/strapi/lib/types/utils/array.d.ts create mode 100644 packages/core/strapi/lib/types/utils/guard.d.ts create mode 100644 packages/core/strapi/lib/types/utils/index.d.ts create mode 100644 packages/core/strapi/lib/types/utils/object.d.ts create mode 100644 packages/core/strapi/lib/types/utils/string.d.ts create mode 100644 packages/core/strapi/lib/types/utils/tuple.d.ts diff --git a/packages/core/data-transfer/src/engine/index.ts b/packages/core/data-transfer/src/engine/index.ts index 917df2098c..92e303d34d 100644 --- a/packages/core/data-transfer/src/engine/index.ts +++ b/packages/core/data-transfer/src/engine/index.ts @@ -73,7 +73,7 @@ export const TransferGroupPresets: TransferGroupFilter = { export const DEFAULT_VERSION_STRATEGY = 'ignore'; export const DEFAULT_SCHEMA_STRATEGY = 'strict'; -type SchemaMap = Utils.StringRecord; +type SchemaMap = Utils.String.Dict; class TransferEngine< S extends ISourceProvider = ISourceProvider, diff --git a/packages/core/data-transfer/src/strapi/providers/remote-destination/index.ts b/packages/core/data-transfer/src/strapi/providers/remote-destination/index.ts index 94efcbda7b..740c78f753 100644 --- a/packages/core/data-transfer/src/strapi/providers/remote-destination/index.ts +++ b/packages/core/data-transfer/src/strapi/providers/remote-destination/index.ts @@ -263,7 +263,7 @@ class RemoteStrapiDestinationProvider implements IDestinationProvider { return Promise.resolve(null); } - return this.dispatcher.dispatchTransferAction>('getSchemas'); + return this.dispatcher.dispatchTransferAction>('getSchemas'); } createEntitiesWriteStream(): Writable { diff --git a/packages/core/data-transfer/src/strapi/providers/remote-source/index.ts b/packages/core/data-transfer/src/strapi/providers/remote-source/index.ts index ea7a301629..4d21811f7a 100644 --- a/packages/core/data-transfer/src/strapi/providers/remote-source/index.ts +++ b/packages/core/data-transfer/src/strapi/providers/remote-source/index.ts @@ -278,7 +278,7 @@ class RemoteStrapiSourceProvider implements ISourceProvider { async getSchemas() { const schemas = - (await this.dispatcher?.dispatchTransferAction>( + (await this.dispatcher?.dispatchTransferAction>( 'getSchemas' )) ?? null; diff --git a/packages/core/data-transfer/src/utils/schema.ts b/packages/core/data-transfer/src/utils/schema.ts index e2045cad6e..45143ddb78 100644 --- a/packages/core/data-transfer/src/utils/schema.ts +++ b/packages/core/data-transfer/src/utils/schema.ts @@ -22,6 +22,6 @@ const VALID_SCHEMA_PROPERTIES = [ * Sanitize a schemas dictionary by omitting unwanted properties * The list of allowed properties can be found here: {@link VALID_SCHEMA_PROPERTIES} */ -export const mapSchemasValues = (schemas: Utils.StringRecord) => { - return mapValues(pick(VALID_SCHEMA_PROPERTIES), schemas) as Utils.StringRecord; +export const mapSchemasValues = (schemas: Utils.String.Dict) => { + return mapValues(pick(VALID_SCHEMA_PROPERTIES), schemas) as Utils.String.Dict; }; diff --git a/packages/core/strapi/lib/types/core/attributes/common.d.ts b/packages/core/strapi/lib/types/core/attributes/common.d.ts index fbd0b9c47d..e7f95e3c5c 100644 --- a/packages/core/strapi/lib/types/core/attributes/common.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/common.d.ts @@ -25,7 +25,7 @@ export type Configurable = { configurable: true }; export type NonConfigurable = { configurable: false }; // custom field -export type CustomField = { +export type CustomField = { customField: T; options?: P; }; @@ -46,7 +46,7 @@ export type DefaultTo = { default: T }; export type Any = | Attribute.BigInteger | Attribute.Boolean - | Attribute.Component + | Attribute.Component | Attribute.DateTime | Attribute.Date | Attribute.Decimal @@ -56,7 +56,7 @@ export type Any = | Attribute.Float | Attribute.Integer | Attribute.JSON - | Attribute.Media + | Attribute.Media | Attribute.Password | Attribute.Relation | Attribute.RichText @@ -64,4 +64,4 @@ export type Any = | Attribute.Text | Attribute.Time | Attribute.Timestamp - | Attribute.UID; + | Attribute.UID; diff --git a/packages/core/strapi/lib/types/core/attributes/dynamic-zone.d.ts b/packages/core/strapi/lib/types/core/attributes/dynamic-zone.d.ts index 3822ceb38a..9212400edf 100644 --- a/packages/core/strapi/lib/types/core/attributes/dynamic-zone.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/dynamic-zone.d.ts @@ -14,7 +14,7 @@ export type DynamicZone = Array< - Utils.GetArrayValues extends infer P + Utils.Array.Values extends infer P ? P extends Common.UID.ContentType ? Attribute.GetValues

& { __component: P } : never : never From 9ba81c85202bb074a379122a854b5cdaaa0e18e8 Mon Sep 17 00:00:00 2001 From: Convly Date: Mon, 5 Jun 2023 14:38:41 +0200 Subject: [PATCH 098/172] Use getSchemas to fetch providers' schemas --- packages/core/data-transfer/src/engine/index.ts | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/core/data-transfer/src/engine/index.ts b/packages/core/data-transfer/src/engine/index.ts index be9e54f20b..f88f41adbf 100644 --- a/packages/core/data-transfer/src/engine/index.ts +++ b/packages/core/data-transfer/src/engine/index.ts @@ -626,8 +626,8 @@ class TransferEngine< } return { - sourceSchema: this.#schema.source, - destinationSchema: this.#schema.destination, + sourceSchemas: this.#schema.source, + destinationSchemas: this.#schema.destination, }; } @@ -642,8 +642,7 @@ class TransferEngine< ); } - const sourceSchemas = (await this.sourceProvider.getSchemas?.()) as SchemaMap; - const destinationSchemas = (await this.destinationProvider.getSchemas?.()) as SchemaMap; + const { sourceSchemas, destinationSchemas } = await this.#getSchemas(); try { if (sourceSchemas && destinationSchemas) { @@ -785,7 +784,7 @@ class TransferEngine< new Transform({ objectMode: true, transform: async (entity: IEntity, _encoding, callback) => { - const { destinationSchema: schemas } = await this.#getSchemas(); + const { destinationSchemas: schemas } = await this.#getSchemas(); if (!schemas) { return callback(null, entity); @@ -828,7 +827,7 @@ class TransferEngine< new Transform({ objectMode: true, transform: async (link: ILink, _encoding, callback) => { - const { destinationSchema: schemas } = await this.#getSchemas(); + const { destinationSchemas: schemas } = await this.#getSchemas(); if (!schemas) { return callback(null, link); From d0e4691af2b40330a9c4e2e4606a143d53d052a1 Mon Sep 17 00:00:00 2001 From: Convly Date: Mon, 5 Jun 2023 14:54:38 +0200 Subject: [PATCH 099/172] Use Knex.Transaction instead of exporting it from DTS --- .../core/admin/ee/server/services/review-workflows/stages.js | 2 +- packages/core/data-transfer/src/strapi/queries/link.ts | 5 +++-- packages/core/data-transfer/types/utils.d.ts | 3 +-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/core/admin/ee/server/services/review-workflows/stages.js b/packages/core/admin/ee/server/services/review-workflows/stages.js index 235bb7edb6..442dfb9f5e 100644 --- a/packages/core/admin/ee/server/services/review-workflows/stages.js +++ b/packages/core/admin/ee/server/services/review-workflows/stages.js @@ -144,7 +144,7 @@ module.exports = ({ strapi }) => { * @param {string} contentTypeUID * @param {number} fromStageId * @param {number} toStageId - * @param {KnexTransaction} trx + * @param {import('knex').Knex.Transaction} trx * @returns */ async updateEntitiesStage(contentTypeUID, { fromStageId, toStageId, trx = null }) { diff --git a/packages/core/data-transfer/src/strapi/queries/link.ts b/packages/core/data-transfer/src/strapi/queries/link.ts index 8562c45aae..3ba9bf47fd 100644 --- a/packages/core/data-transfer/src/strapi/queries/link.ts +++ b/packages/core/data-transfer/src/strapi/queries/link.ts @@ -1,9 +1,10 @@ +import type { Knex } from 'knex'; import { clone, isNil } from 'lodash/fp'; -import { ILink, KnexTransaction } from '../../../types'; +import { ILink } from '../../../types'; // TODO: Remove any types when we'll have types for DB metadata -export const createLinkQuery = (strapi: Strapi.Strapi, trx?: KnexTransaction) => { +export const createLinkQuery = (strapi: Strapi.Strapi, trx?: Knex.Transaction) => { const query = () => { const { connection } = strapi.db; diff --git a/packages/core/data-transfer/types/utils.d.ts b/packages/core/data-transfer/types/utils.d.ts index fab6cdf40b..b7b75d3e78 100644 --- a/packages/core/data-transfer/types/utils.d.ts +++ b/packages/core/data-transfer/types/utils.d.ts @@ -90,8 +90,7 @@ export type IProviderTransferResults = {}; export type ISourceProviderTransferResults = {}; export type IDestinationProviderTransferResults = {}; -export type KnexTransaction = Knex.Transaction; -export type TransactionCallback = (trx?: KnexTransaction) => Promise; +export type TransactionCallback = (trx?: Knex.Transaction) => Promise; export type Transaction = { attach(callback: TransactionCallback): Promise; end(): boolean; From 2375e5cadbb2782cd0258e230315a6898594f7bd Mon Sep 17 00:00:00 2001 From: Convly Date: Mon, 5 Jun 2023 15:10:58 +0200 Subject: [PATCH 100/172] Fix space typo --- packages/core/strapi/lib/types/core/attributes/json.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/strapi/lib/types/core/attributes/json.d.ts b/packages/core/strapi/lib/types/core/attributes/json.d.ts index 2d5e9e6ec7..2dbae3628d 100644 --- a/packages/core/strapi/lib/types/core/attributes/json.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/json.d.ts @@ -1,7 +1,7 @@ import type { Attribute } from '@strapi/strapi'; export type JSON = Attribute.Attribute<'json'> & - //Options + // Options Attribute.ConfigurableOption & Attribute.RequiredOption & Attribute.PrivateOption; From 266c8eeff903be21c1a2922329837aff10e988b4 Mon Sep 17 00:00:00 2001 From: Ben Irvin Date: Mon, 5 Jun 2023 15:15:59 +0200 Subject: [PATCH 101/172] fix linting --- .github/actions/yarn-nm-install/action.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/actions/yarn-nm-install/action.yml b/.github/actions/yarn-nm-install/action.yml index 8ae662224b..872106155b 100644 --- a/.github/actions/yarn-nm-install/action.yml +++ b/.github/actions/yarn-nm-install/action.yml @@ -45,7 +45,7 @@ runs: id: yarn-config shell: bash env: - YARN_ENABLE_GLOBAL_CACHE: "false" + YARN_ENABLE_GLOBAL_CACHE: 'false' run: | echo "CACHE_FOLDER=$(yarn config get cacheFolder)" >> $GITHUB_OUTPUT echo "CURRENT_NODE_VERSION="node-$(node --version)"" >> $GITHUB_OUTPUT @@ -81,8 +81,8 @@ runs: run: yarn install --immutable --inline-builds env: # Overrides/align yarnrc.yml options (v3, v4) for a CI context - YARN_ENABLE_GLOBAL_CACHE: "false" # Use local cache folder to keep downloaded archives - YARN_NM_MODE: "hardlinks-local" # Reduce node_modules size - YARN_INSTALL_STATE_PATH: ".yarn/ci-cache/install-state.gz" # Might speed up resolutions when node_modules present + YARN_ENABLE_GLOBAL_CACHE: 'false' # Use local cache folder to keep downloaded archives + YARN_NM_MODE: 'hardlinks-local' # Reduce node_modules size + YARN_INSTALL_STATE_PATH: '.yarn/ci-cache/install-state.gz' # Might speed up resolutions when node_modules present # Other environment variables HUSKY: '0' # By default do not run HUSKY install From c371765df3e1317e83ef8e3300f23b2486df8b6f Mon Sep 17 00:00:00 2001 From: Convly Date: Tue, 6 Jun 2023 11:42:56 +0200 Subject: [PATCH 102/172] Change import paths, update the core api types --- .../strapi/lib/core-api/controller/index.d.ts | 26 ------ packages/core/strapi/lib/factories.d.ts | 82 ++++++++++++++++ packages/core/strapi/lib/index.d.ts | 3 +- .../strapi/lib/types/core-api/controller.d.ts | 57 ++++++++++++ .../core/strapi/lib/types/core-api/index.d.ts | 1 + .../lib/types/core/common/controller.d.ts | 2 +- .../strapi/lib/types/core/common/uid.d.ts | 14 ++- .../strapi/lib/types/core/strapi/index.d.ts | 7 +- packages/core/strapi/lib/types/factories.d.ts | 93 ------------------- packages/core/strapi/lib/types/index.d.ts | 3 +- 10 files changed, 156 insertions(+), 132 deletions(-) delete mode 100644 packages/core/strapi/lib/core-api/controller/index.d.ts create mode 100644 packages/core/strapi/lib/factories.d.ts create mode 100644 packages/core/strapi/lib/types/core-api/controller.d.ts create mode 100644 packages/core/strapi/lib/types/core-api/index.d.ts delete mode 100644 packages/core/strapi/lib/types/factories.d.ts diff --git a/packages/core/strapi/lib/core-api/controller/index.d.ts b/packages/core/strapi/lib/core-api/controller/index.d.ts deleted file mode 100644 index 42f65235a0..0000000000 --- a/packages/core/strapi/lib/core-api/controller/index.d.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Context, Next } from 'koa'; -import { ControllerHandler } from '../../types/core/common'; - -interface Controller { - transformResponse(data: object, meta: object): object; - sanitizeOutput(data: object, ctx: Context): Promise; - sanitizeInput(data: object, ctx: Context): Promise; -} - -export interface SingleTypeController extends Controller { - find?: ControllerHandler; - update?: ControllerHandler; - delete?: ControllerHandler; -} - -export interface CollectionTypeController extends Controller { - find?: ControllerHandler; - findOne?: ControllerHandler; - create?: ControllerHandler; - update?: ControllerHandler; - delete?: ControllerHandler; -} - -export type GenericController = Partial & { - [method: string | number | symbol]: (ctx: Context, next?: Next) => unknown; -}; diff --git a/packages/core/strapi/lib/factories.d.ts b/packages/core/strapi/lib/factories.d.ts new file mode 100644 index 0000000000..bd120a50f8 --- /dev/null +++ b/packages/core/strapi/lib/factories.d.ts @@ -0,0 +1,82 @@ +import type { Common, CoreApi, Strapi } from '@strapi/strapi'; + +type WithStrapiCallback = (params: S) => T; + +// type HandlerConfig = { +// auth?: false | { scope: string[] }; +// policies?: Array; +// middlewares?: Array; +// }; + +// type SingleTypeRouterConfig = { +// find?: HandlerConfig; +// update?: HandlerConfig; +// delete?: HandlerConfig; +// }; + +// type CollectionTypeRouterConfig = { +// find?: HandlerConfig; +// findOne?: HandlerConfig; +// create?: HandlerConfig; +// update?: HandlerConfig; +// delete?: HandlerConfig; +// }; + +// type RouterConfig = { +// prefix?: string; +// // TODO Refactor when we have a controller registry +// only?: string[]; +// except?: string[]; +// config: T; +// }; + +// interface Route { +// method: string; +// path: string; +// } +// interface Router { +// prefix: string; +// routes: Route[]; +// } + +// export declare function createCoreRouter( +// uid: T, +// cfg?: RouterConfig = {} +// ): () => Router; + +export declare function createCoreController< + T extends Common.UID.ContentType, + S extends Partial> +>( + uid: T, + config?: WithStrapiCallback | S +): () => Required>; + +// export declare function createCoreService< +// T extends Common.UID.ContentType, +// S extends Partial> +// >(uid: T, config?: WithStrapiCallback | S): () => Required>; + +// type GetBaseSchemaController = IsCollectionType< +// T, +// CollectionTypeController, +// SingleTypeController +// > & +// GenericController; + +// type GetBaseSchemaService = IsCollectionType< +// T, +// CollectionTypeService, +// SingleTypeService +// > & +// GenericService; + +// type GetBaseConfig = IsCollectionType< +// T, +// CollectionTypeRouterConfig, +// SingleTypeRouterConfig +// >; + +// type IsCollectionType = T extends Strapi.CollectionTypeUIDs +// ? Y +// : N; diff --git a/packages/core/strapi/lib/index.d.ts b/packages/core/strapi/lib/index.d.ts index 1f7f33cd14..9b0fecd589 100644 --- a/packages/core/strapi/lib/index.d.ts +++ b/packages/core/strapi/lib/index.d.ts @@ -1,5 +1,6 @@ import './global'; export * from './types'; +export * as factories from './factories'; -export default function (opts): Strapi; +export default function (opts): Strapi.Strapi; diff --git a/packages/core/strapi/lib/types/core-api/controller.d.ts b/packages/core/strapi/lib/types/core-api/controller.d.ts new file mode 100644 index 0000000000..34775a28ba --- /dev/null +++ b/packages/core/strapi/lib/types/core-api/controller.d.ts @@ -0,0 +1,57 @@ +import type { Common, Schema, Shared } from '@strapi/strapi'; +import type { ExtendableContext } from 'koa'; + +/** + * Base Core-API controller type + * + * TODO: Make use of the T generic to type the other methods based on the given content type + */ +export interface Base { + // TODO: Use actual entities instead of regular object + transformResponse(data: U, meta: object): P; + sanitizeOutput(data: U, ctx: ExtendableContext): Promise; + sanitizeInput(data: U, ctx: ExtendableContext): Promise; + sanitizeQuery(data: U, ctx: ExtendableContext): Promise; +} + +/** + * Generic controller structure + */ +export type Generic = { + [name: string]: Common.ControllerHandler; +}; + +/** + * Core-API collection type controller + */ +export type CollectionType = Base & { + find?: Common.ControllerHandler; + findOne?: Common.ControllerHandler; + create?: Common.ControllerHandler; + update?: Common.ControllerHandler; + delete?: Common.ControllerHandler; +}; + +/** + * Core-API single type controller + */ +export type SingleType = Base & { + find?: Common.ControllerHandler; + update?: Common.ControllerHandler; + delete?: Common.ControllerHandler; +}; + +export type ContentType = + // Checks that the content type exists in the shared registry + Shared.ContentTypes[T] extends infer S extends Schema.Schema + ? S extends Schema.CollectionType + ? CollectionType + : S extends Schema.SingleType + ? SingleType + : // This should never happen. It would mean a schema (other than collection type + // or a single type has been registered to the shared content-type registry) + never + : // If it doesn't exist, return a base controller + Base; + +export type Extendable = ContentType & Generic; diff --git a/packages/core/strapi/lib/types/core-api/index.d.ts b/packages/core/strapi/lib/types/core-api/index.d.ts new file mode 100644 index 0000000000..8213cb2aee --- /dev/null +++ b/packages/core/strapi/lib/types/core-api/index.d.ts @@ -0,0 +1 @@ +export * as Controller from './controller'; diff --git a/packages/core/strapi/lib/types/core/common/controller.d.ts b/packages/core/strapi/lib/types/core/common/controller.d.ts index 1fcdc96b2f..91f5678ea4 100644 --- a/packages/core/strapi/lib/types/core/common/controller.d.ts +++ b/packages/core/strapi/lib/types/core/common/controller.d.ts @@ -1,6 +1,6 @@ import type { ExtendableContext, Next } from 'koa'; -export type ControllerHandler = ( +export type ControllerHandler = ( context: ExtendableContext, next: Next ) => Promise | T | void; diff --git a/packages/core/strapi/lib/types/core/common/uid.d.ts b/packages/core/strapi/lib/types/core/common/uid.d.ts index 5ef444cc1b..881659678f 100644 --- a/packages/core/strapi/lib/types/core/common/uid.d.ts +++ b/packages/core/strapi/lib/types/core/common/uid.d.ts @@ -16,12 +16,18 @@ export type Policy = Registry.Keys; export type Middleware = Registry.Keys; export type ContentType = Registry.Keys; -export type CollectionType = Extract< - Utils.Object.KeysBy, + +export type CollectionType = Utils.Guard.Never< + // extract uids only for collection types + Extract, ContentType>, + // if no collection type is found (never), fallback to a generic content type uid ContentType >; -export type SingleType = Extract< - Utils.Object.KeysBy, + +export type SingleType = Utils.Guard.Never< + // extract uids only for single types + Extract, ContentType>, + // if no single type is found (never), fallback to a generic content type uid ContentType >; diff --git a/packages/core/strapi/lib/types/core/strapi/index.d.ts b/packages/core/strapi/lib/types/core/strapi/index.d.ts index 548c68145c..17ee55f174 100644 --- a/packages/core/strapi/lib/types/core/strapi/index.d.ts +++ b/packages/core/strapi/lib/types/core/strapi/index.d.ts @@ -1,8 +1,5 @@ -import { Database } from '@strapi/database'; - +import type { Database } from '@strapi/database'; import type { Shared, Common } from '@strapi/strapi'; -import type { GenericController } from '../../../core-api/controller'; -import type { GenericService } from '../../../core-api/service'; // TODO move custom fields types to a separate file interface CustomFieldServerOptions { @@ -73,7 +70,7 @@ export interface Strapi { /** * Find a service using its unique identifier */ - service(uid: string): T | undefined; + service(uid: string): T | undefined; /** * Getter for the Strapi controllers container diff --git a/packages/core/strapi/lib/types/factories.d.ts b/packages/core/strapi/lib/types/factories.d.ts deleted file mode 100644 index 56652876c8..0000000000 --- a/packages/core/strapi/lib/types/factories.d.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { GenericService, CollectionTypeService, SingleTypeService } from '../core-api/service'; -import { - CollectionTypeController, - SingleTypeController, - Controller, - GenericController, -} from '../core-api/controller'; -import { Middleware } from '../middlewares'; -import { Policy } from '../core/registries/policies'; -import { Strapi } from './core/strapi'; -import { SchemaUID } from './utils'; -import { UID } from './core'; - -type HandlerConfig = { - auth?: false | { scope: string[] }; - policies?: Array; - middlewares?: Array; -}; - -type SingleTypeRouterConfig = { - find?: HandlerConfig; - update?: HandlerConfig; - delete?: HandlerConfig; -}; - -type CollectionTypeRouterConfig = { - find?: HandlerConfig; - findOne?: HandlerConfig; - create?: HandlerConfig; - update?: HandlerConfig; - delete?: HandlerConfig; -}; - -type RouterConfig = { - prefix?: string; - // TODO Refactor when we have a controller registry - only?: string[]; - except?: string[]; - config: T; -}; - -interface Route { - method: string; - path: string; -} -interface Router { - prefix: string; - routes: Route[]; -} - -type ControllerCallback = (params: { - strapi: Strapi; -}) => T; -type ServiceCallback = (params: { strapi: Strapi }) => T; - -export declare function createCoreRouter( - uid: T, - cfg?: RouterConfig = {} -): () => Router; - -export declare function createCoreController< - T extends UID.ContentType, - S extends Partial> ->(uid: T, cfg?: ControllerCallback | S): () => Required>; - -export declare function createCoreService< - T extends UID.ContentType, - S extends Partial> ->(uid: T, cfg?: ServiceCallback | S): () => Required>; - -type GetBaseSchemaController = IsCollectionType< - T, - CollectionTypeController, - SingleTypeController -> & - GenericController; - -type GetBaseSchemaService = IsCollectionType< - T, - CollectionTypeService, - SingleTypeService -> & - GenericService; - -type GetBaseConfig = IsCollectionType< - T, - CollectionTypeRouterConfig, - SingleTypeRouterConfig ->; - -type IsCollectionType = T extends Strapi.CollectionTypeUIDs - ? Y - : N; diff --git a/packages/core/strapi/lib/types/index.d.ts b/packages/core/strapi/lib/types/index.d.ts index 29b49fcbba..780786a88e 100644 --- a/packages/core/strapi/lib/types/index.d.ts +++ b/packages/core/strapi/lib/types/index.d.ts @@ -1,7 +1,6 @@ // Exports from core should already be modules export * from './core'; +export * as CoreApi from './core-api'; export * as Utils from './utils'; export * as Shared from './shared'; - -export * as factories from './factories'; From b1503aab84656e57f22e63e4214dc27cb0964744 Mon Sep 17 00:00:00 2001 From: Convly Date: Tue, 6 Jun 2023 11:51:48 +0200 Subject: [PATCH 103/172] Rename artefact to artifact --- .../lib/commands/actions/develop/action.js | 2 +- .../actions/ts/generate-types/action.js | 2 +- .../utils/typescript/lib/generators/index.js | 60 +++++++++---------- 3 files changed, 32 insertions(+), 32 deletions(-) diff --git a/packages/core/strapi/lib/commands/actions/develop/action.js b/packages/core/strapi/lib/commands/actions/develop/action.js index 415285459a..4d933c6bf2 100644 --- a/packages/core/strapi/lib/commands/actions/develop/action.js +++ b/packages/core/strapi/lib/commands/actions/develop/action.js @@ -128,7 +128,7 @@ const workerProcess = async ({ appDir, distDir, watchAdmin, polling, isTSProject pwd: appDir, rootDir: undefined, logger: { silent: true, debug: false }, - artefacts: { contentTypes: true, components: true }, + artifacts: { contentTypes: true, components: true }, }); } diff --git a/packages/core/strapi/lib/commands/actions/ts/generate-types/action.js b/packages/core/strapi/lib/commands/actions/ts/generate-types/action.js index a893a51077..922254950f 100644 --- a/packages/core/strapi/lib/commands/actions/ts/generate-types/action.js +++ b/packages/core/strapi/lib/commands/actions/ts/generate-types/action.js @@ -22,7 +22,7 @@ module.exports = async ({ debug, silent, verbose, outDir }) => { // TODO V5: verbose is deprecated and should be removed debug: debug || verbose, }, - artefacts: { contentTypes: true, components: true }, + artifacts: { contentTypes: true, components: true }, }); app.destroy(); diff --git a/packages/utils/typescript/lib/generators/index.js b/packages/utils/typescript/lib/generators/index.js index 7cc7801269..757c68385d 100644 --- a/packages/utils/typescript/lib/generators/index.js +++ b/packages/utils/typescript/lib/generators/index.js @@ -18,13 +18,13 @@ const GENERATORS = { * * @property {object} strapi * @property {boolean} pwd - * @property {object} [artefacts] - * @property {boolean} [artefacts.contentTypes] - * @property {boolean} [artefacts.components] - * @property {boolean} [artefacts.services] - * @property {boolean} [artefacts.controllers] - * @property {boolean} [artefacts.policies] - * @property {boolean} [artefacts.middlewares] + * @property {object} [artifacts] + * @property {boolean} [artifacts.contentTypes] + * @property {boolean} [artifacts.components] + * @property {boolean} [artifacts.services] + * @property {boolean} [artifacts.controllers] + * @property {boolean} [artifacts.policies] + * @property {boolean} [artifacts.middlewares] * @property {object} [logger] * @property {boolean} [logger.silent] * @property {boolean} [logger.debug] @@ -37,7 +37,7 @@ const GENERATORS = { * @param {GenerateConfig} [config] */ const generate = async (config = {}) => { - const { pwd, rootDir = TYPES_ROOT_DIR, strapi, artefacts = {}, logger: loggerConfig } = config; + const { pwd, rootDir = TYPES_ROOT_DIR, strapi, artifacts = {}, logger: loggerConfig } = config; const reports = {}; const logger = createLogger(loggerConfig); const psTimer = timer().start(); @@ -58,57 +58,57 @@ const generate = async (config = {}) => { return reports; }; - const enabledArtefacts = Object.keys(artefacts).filter((p) => artefacts[p] === true); + const enabledArtifacts = Object.keys(artifacts).filter((p) => artifacts[p] === true); logger.info('Starting the type generation process'); - logger.debug(`Enabled artefacts: ${enabledArtefacts.join(', ')}`); + logger.debug(`Enabled artifacts: ${enabledArtifacts.join(', ')}`); - for (const artefact of enabledArtefacts) { - const boldArtefact = chalk.bold(artefact); // used for log messages + for (const artifact of enabledArtifacts) { + const boldArtifact = chalk.bold(artifact); // used for log messages - logger.info(`Generating types for ${boldArtefact}`); + logger.info(`Generating types for ${boldArtifact}`); - if (artefact in GENERATORS) { - const generator = GENERATORS[artefact]; + if (artifact in GENERATORS) { + const generator = GENERATORS[artifact]; try { - const artefactGenTimer = timer().start(); + const artifactGenTimer = timer().start(); - reports[artefact] = await generator(generatorConfig); + reports[artifact] = await generator(generatorConfig); - artefactGenTimer.end(); + artifactGenTimer.end(); - logger.debug(`Generated ${boldArtefact} in ${artefactGenTimer.duration}s`); + logger.debug(`Generated ${boldArtifact} in ${artifactGenTimer.duration}s`); } catch (e) { logger.error( - `Failed to generate types for ${boldArtefact}: ${e.message ?? e.toString()}. Exiting` + `Failed to generate types for ${boldArtifact}: ${e.message ?? e.toString()}. Exiting` ); return returnWithMessage(); } } else { - logger.warn(`The types generator for ${boldArtefact} is not implemented, skipping`); + logger.warn(`The types generator for ${boldArtifact} is not implemented, skipping`); } } - for (const artefact of Object.keys(reports)) { - const boldArtefact = chalk.bold(artefact); // used for log messages + for (const artifact of Object.keys(reports)) { + const boldArtifact = chalk.bold(artifact); // used for log messages - const artefactFsTimer = timer().start(); + const artifactFsTimer = timer().start(); - const report = reports[artefact]; - const filename = `${artefact}.d.ts`; + const report = reports[artifact]; + const filename = `${artifact}.d.ts`; try { const outPath = await saveDefinitionToFileSystem(registryPwd, filename, report.output); const relativeOutPath = path.relative(__dirname, outPath); - artefactFsTimer.end(); + artifactFsTimer.end(); - logger.info(`Saved ${boldArtefact} types in ${chalk.bold(relativeOutPath)}`); - logger.debug(`Saved ${boldArtefact} in ${artefactFsTimer.duration}s`); + logger.info(`Saved ${boldArtifact} types in ${chalk.bold(relativeOutPath)}`); + logger.debug(`Saved ${boldArtifact} in ${artifactFsTimer.duration}s`); } catch (e) { logger.error( - `An error occurred while saving ${boldArtefact} types to the filesystem: ${ + `An error occurred while saving ${boldArtifact} types to the filesystem: ${ e.message ?? e.toString() }. Exiting` ); From ee3789694608f165f2fe41d0ab453ff3918b29f2 Mon Sep 17 00:00:00 2001 From: Convly Date: Tue, 6 Jun 2023 12:09:25 +0200 Subject: [PATCH 104/172] Rename Attribute.Attribute to Attribute.OfType when using a generic --- .../core/strapi/lib/types/core/attributes/base.d.ts | 6 ++++-- .../strapi/lib/types/core/attributes/biginteger.d.ts | 2 +- .../core/strapi/lib/types/core/attributes/boolean.d.ts | 2 +- .../strapi/lib/types/core/attributes/component.d.ts | 2 +- .../strapi/lib/types/core/attributes/date-time.d.ts | 2 +- .../core/strapi/lib/types/core/attributes/date.d.ts | 2 +- .../core/strapi/lib/types/core/attributes/decimal.d.ts | 2 +- .../strapi/lib/types/core/attributes/dynamic-zone.d.ts | 2 +- .../core/strapi/lib/types/core/attributes/email.d.ts | 2 +- .../strapi/lib/types/core/attributes/enumeration.d.ts | 2 +- .../core/strapi/lib/types/core/attributes/float.d.ts | 2 +- .../core/strapi/lib/types/core/attributes/integer.d.ts | 2 +- .../core/strapi/lib/types/core/attributes/json.d.ts | 2 +- .../core/strapi/lib/types/core/attributes/media.d.ts | 2 +- .../strapi/lib/types/core/attributes/password.d.ts | 2 +- .../strapi/lib/types/core/attributes/relation.d.ts | 2 +- .../strapi/lib/types/core/attributes/richtext.d.ts | 2 +- .../core/strapi/lib/types/core/attributes/string.d.ts | 2 +- .../core/strapi/lib/types/core/attributes/text.d.ts | 2 +- .../core/strapi/lib/types/core/attributes/time.d.ts | 2 +- .../strapi/lib/types/core/attributes/timestamp.d.ts | 2 +- .../core/strapi/lib/types/core/attributes/uid.d.ts | 2 +- .../core/strapi/lib/types/core/attributes/utils.d.ts | 10 +++++----- 23 files changed, 30 insertions(+), 28 deletions(-) diff --git a/packages/core/strapi/lib/types/core/attributes/base.d.ts b/packages/core/strapi/lib/types/core/attributes/base.d.ts index 729c3e87f7..f50f317256 100644 --- a/packages/core/strapi/lib/types/core/attributes/base.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/base.d.ts @@ -1,7 +1,7 @@ /** * List of all the Strapi attribute types */ -export type Type = +export type Kind = | 'string' | 'text' | 'richtext' @@ -27,7 +27,7 @@ export type Type = /** * Most basic shape of a schema attribute */ -export interface Attribute { +export interface Attribute { /** * Type of the attribute */ @@ -39,6 +39,8 @@ export interface Attribute { pluginOptions?: object; } +export type OfType = Attribute; + // Common attributes Options export interface RequiredOption { diff --git a/packages/core/strapi/lib/types/core/attributes/biginteger.d.ts b/packages/core/strapi/lib/types/core/attributes/biginteger.d.ts index 13b4aac77c..f1848ab94a 100644 --- a/packages/core/strapi/lib/types/core/attributes/biginteger.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/biginteger.d.ts @@ -1,6 +1,6 @@ import type { Attribute } from '@strapi/strapi'; -export type BigInteger = Attribute.Attribute<'biginteger'> & +export type BigInteger = Attribute.OfType<'biginteger'> & // Options Attribute.ConfigurableOption & Attribute.DefaultOption & diff --git a/packages/core/strapi/lib/types/core/attributes/boolean.d.ts b/packages/core/strapi/lib/types/core/attributes/boolean.d.ts index c96b1e9a0c..c83f0d4f27 100644 --- a/packages/core/strapi/lib/types/core/attributes/boolean.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/boolean.d.ts @@ -1,6 +1,6 @@ import type { Attribute } from '@strapi/strapi'; -export type Boolean = Attribute.Attribute<'boolean'> & +export type Boolean = Attribute.OfType<'boolean'> & // Options Attribute.ConfigurableOption & Attribute.DefaultOption & diff --git a/packages/core/strapi/lib/types/core/attributes/component.d.ts b/packages/core/strapi/lib/types/core/attributes/component.d.ts index c0f60e51a0..61cabf3d77 100644 --- a/packages/core/strapi/lib/types/core/attributes/component.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/component.d.ts @@ -15,7 +15,7 @@ export type Component< T extends Common.UID.Component = Common.UID.Component, // Repeatable R extends boolean = false -> = Attribute.Attribute<'component'> & +> = Attribute.OfType<'component'> & // Component Properties ComponentProperties & // Options diff --git a/packages/core/strapi/lib/types/core/attributes/date-time.d.ts b/packages/core/strapi/lib/types/core/attributes/date-time.d.ts index 9e077e7a25..471e358d12 100644 --- a/packages/core/strapi/lib/types/core/attributes/date-time.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/date-time.d.ts @@ -1,6 +1,6 @@ import type { Attribute } from '@strapi/strapi'; -export type DateTime = Attribute.Attribute<'datetime'> & +export type DateTime = Attribute.OfType<'datetime'> & // Options Attribute.ConfigurableOption & Attribute.DefaultOption & diff --git a/packages/core/strapi/lib/types/core/attributes/date.d.ts b/packages/core/strapi/lib/types/core/attributes/date.d.ts index 825609d45f..937955fe0b 100644 --- a/packages/core/strapi/lib/types/core/attributes/date.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/date.d.ts @@ -1,6 +1,6 @@ import type { Attribute } from '@strapi/strapi'; -export type Date = Attribute.Attribute<'date'> & +export type Date = Attribute.OfType<'date'> & // Options Attribute.ConfigurableOption & Attribute.DefaultOption & diff --git a/packages/core/strapi/lib/types/core/attributes/decimal.d.ts b/packages/core/strapi/lib/types/core/attributes/decimal.d.ts index 86bde724df..02adc7d2de 100644 --- a/packages/core/strapi/lib/types/core/attributes/decimal.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/decimal.d.ts @@ -1,6 +1,6 @@ import type { Attribute } from '@strapi/strapi'; -export type Decimal = Attribute.Attribute<'decimal'> & +export type Decimal = Attribute.OfType<'decimal'> & // Options Attribute.ConfigurableOption & Attribute.DefaultOption & diff --git a/packages/core/strapi/lib/types/core/attributes/dynamic-zone.d.ts b/packages/core/strapi/lib/types/core/attributes/dynamic-zone.d.ts index a88886f831..01654ace70 100644 --- a/packages/core/strapi/lib/types/core/attributes/dynamic-zone.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/dynamic-zone.d.ts @@ -5,7 +5,7 @@ export interface DynamicZoneProperties { } export type DynamicZone = - Attribute.Attribute<'dynamiczone'> & + Attribute.OfType<'dynamiczone'> & // Properties DynamicZoneProperties & // Options diff --git a/packages/core/strapi/lib/types/core/attributes/email.d.ts b/packages/core/strapi/lib/types/core/attributes/email.d.ts index fdf3ddf409..54710fb78b 100644 --- a/packages/core/strapi/lib/types/core/attributes/email.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/email.d.ts @@ -1,6 +1,6 @@ import type { Attribute } from '@strapi/strapi'; -export type Email = Attribute.Attribute<'email'> & +export type Email = Attribute.OfType<'email'> & // Options Attribute.ConfigurableOption & Attribute.DefaultOption & diff --git a/packages/core/strapi/lib/types/core/attributes/enumeration.d.ts b/packages/core/strapi/lib/types/core/attributes/enumeration.d.ts index ddcd236efb..9245bf555c 100644 --- a/packages/core/strapi/lib/types/core/attributes/enumeration.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/enumeration.d.ts @@ -4,7 +4,7 @@ export interface EnumerationProperties { enum: T; } -export type Enumeration = Attribute.Attribute<'enumeration'> & +export type Enumeration = Attribute.OfType<'enumeration'> & EnumerationProperties & // Options Attribute.ConfigurableOption & diff --git a/packages/core/strapi/lib/types/core/attributes/float.d.ts b/packages/core/strapi/lib/types/core/attributes/float.d.ts index 45c0585b68..1207e4aeca 100644 --- a/packages/core/strapi/lib/types/core/attributes/float.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/float.d.ts @@ -1,6 +1,6 @@ import type { Attribute } from '@strapi/strapi'; -export type Float = Attribute.Attribute<'float'> & +export type Float = Attribute.OfType<'float'> & // Options Attribute.ConfigurableOption & Attribute.DefaultOption & diff --git a/packages/core/strapi/lib/types/core/attributes/integer.d.ts b/packages/core/strapi/lib/types/core/attributes/integer.d.ts index de40b9d1d7..afd76ae01f 100644 --- a/packages/core/strapi/lib/types/core/attributes/integer.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/integer.d.ts @@ -1,6 +1,6 @@ import type { Attribute } from '@strapi/strapi'; -export type Integer = Attribute.Attribute<'integer'> & +export type Integer = Attribute.OfType<'integer'> & // Options Attribute.ConfigurableOption & Attribute.DefaultOption & diff --git a/packages/core/strapi/lib/types/core/attributes/json.d.ts b/packages/core/strapi/lib/types/core/attributes/json.d.ts index 2dbae3628d..4441416b5a 100644 --- a/packages/core/strapi/lib/types/core/attributes/json.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/json.d.ts @@ -1,6 +1,6 @@ import type { Attribute } from '@strapi/strapi'; -export type JSON = Attribute.Attribute<'json'> & +export type JSON = Attribute.OfType<'json'> & // Options Attribute.ConfigurableOption & Attribute.RequiredOption & diff --git a/packages/core/strapi/lib/types/core/attributes/media.d.ts b/packages/core/strapi/lib/types/core/attributes/media.d.ts index 8d1d639d16..e4f6823f9f 100644 --- a/packages/core/strapi/lib/types/core/attributes/media.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/media.d.ts @@ -17,7 +17,7 @@ export type Media< T extends AllowedMediaTypes | undefined = undefined, // Multiple U extends boolean = false -> = Attribute.Attribute<'media'> & +> = Attribute.OfType<'media'> & // Properties MediaProperties & // Options diff --git a/packages/core/strapi/lib/types/core/attributes/password.d.ts b/packages/core/strapi/lib/types/core/attributes/password.d.ts index 083996e3db..232268de9a 100644 --- a/packages/core/strapi/lib/types/core/attributes/password.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/password.d.ts @@ -1,6 +1,6 @@ import type { Attribute } from '@strapi/strapi'; -export type Password = Attribute.Attribute<'password'> & +export type Password = Attribute.OfType<'password'> & // Options Attribute.ConfigurableOption & Attribute.DefaultOption & diff --git a/packages/core/strapi/lib/types/core/attributes/relation.d.ts b/packages/core/strapi/lib/types/core/attributes/relation.d.ts index 9b6a072b76..d48a6b2daf 100644 --- a/packages/core/strapi/lib/types/core/attributes/relation.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/relation.d.ts @@ -37,7 +37,7 @@ export type Relation< S extends Common.UID.Schema = Common.UID.Schema, R extends RelationsType = RelationsType, T extends R extends PolymorphicRelationsType ? never : Common.UID.Schema = never -> = Attribute.Attribute<'relation'> & +> = Attribute.OfType<'relation'> & // Properties (R extends BasicRelationsType ? BasicRelationProperties diff --git a/packages/core/strapi/lib/types/core/attributes/richtext.d.ts b/packages/core/strapi/lib/types/core/attributes/richtext.d.ts index dca3ecf821..92ac062121 100644 --- a/packages/core/strapi/lib/types/core/attributes/richtext.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/richtext.d.ts @@ -1,6 +1,6 @@ import type { Attribute } from '@strapi/strapi'; -export type RichText = Attribute.Attribute<'richtext'> & +export type RichText = Attribute.OfType<'richtext'> & // Options Attribute.ConfigurableOption & Attribute.DefaultOption & diff --git a/packages/core/strapi/lib/types/core/attributes/string.d.ts b/packages/core/strapi/lib/types/core/attributes/string.d.ts index 5fc00852b8..488e4b7f27 100644 --- a/packages/core/strapi/lib/types/core/attributes/string.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/string.d.ts @@ -4,7 +4,7 @@ export interface StringProperties { regex?: RegExp; } -export type String = Attribute.Attribute<'string'> & +export type String = Attribute.OfType<'string'> & // Properties StringProperties & // Options diff --git a/packages/core/strapi/lib/types/core/attributes/text.d.ts b/packages/core/strapi/lib/types/core/attributes/text.d.ts index 7fff003e75..41aa0c982f 100644 --- a/packages/core/strapi/lib/types/core/attributes/text.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/text.d.ts @@ -4,7 +4,7 @@ export interface TextProperties { regex?: RegExp; } -export type Text = Attribute.Attribute<'text'> & +export type Text = Attribute.OfType<'text'> & // Properties TextProperties & // Options diff --git a/packages/core/strapi/lib/types/core/attributes/time.d.ts b/packages/core/strapi/lib/types/core/attributes/time.d.ts index 307d75d171..f38ddcb623 100644 --- a/packages/core/strapi/lib/types/core/attributes/time.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/time.d.ts @@ -1,6 +1,6 @@ import type { Attribute } from '@strapi/strapi'; -export type Time = Attribute.Attribute<'time'> & +export type Time = Attribute.OfType<'time'> & // Options Attribute.ConfigurableOption & Attribute.DefaultOption & diff --git a/packages/core/strapi/lib/types/core/attributes/timestamp.d.ts b/packages/core/strapi/lib/types/core/attributes/timestamp.d.ts index e1058f1937..9d37223115 100644 --- a/packages/core/strapi/lib/types/core/attributes/timestamp.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/timestamp.d.ts @@ -1,6 +1,6 @@ import type { Attribute } from '@strapi/strapi'; -export type Timestamp = Attribute.Attribute<'timestamp'> & +export type Timestamp = Attribute.OfType<'timestamp'> & // Options Attribute.ConfigurableOption & Attribute.DefaultOption & diff --git a/packages/core/strapi/lib/types/core/attributes/uid.d.ts b/packages/core/strapi/lib/types/core/attributes/uid.d.ts index b923ec14fc..d91edc4e84 100644 --- a/packages/core/strapi/lib/types/core/attributes/uid.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/uid.d.ts @@ -32,7 +32,7 @@ export type UID< U extends TargetAttributeByUID = TargetAttributeByUID, // UID options S extends UIDOptions = UIDOptions -> = Attribute.Attribute<'uid'> & +> = Attribute.OfType<'uid'> & // Properties (T extends Common.UID.Schema ? UIDProperties : GenericUIDProperties) & // Options diff --git a/packages/core/strapi/lib/types/core/attributes/utils.d.ts b/packages/core/strapi/lib/types/core/attributes/utils.d.ts index 2fe6a68851..09e53eb7fe 100644 --- a/packages/core/strapi/lib/types/core/attributes/utils.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/utils.d.ts @@ -1,18 +1,18 @@ import type { Attribute, Common, Utils } from '@strapi/strapi'; -export type PickTypes = T; +export type PickTypes = T; export type GetKeysByType< T extends Common.UID.Schema, - U extends Attribute.Type, + U extends Attribute.Kind, P = never -> = Utils.Object.KeysBy, Attribute.Attribute & Utils.Guard.Never>; +> = Utils.Object.KeysBy, Attribute.OfType & Utils.Guard.Never>; export type GetByType< T extends Common.UID.Schema, - U extends Attribute.Type, + U extends Attribute.Kind, P = never -> = Utils.Object.PickBy, Attribute.Attribute & Utils.Guard.Never>; +> = Utils.Object.PickBy, Attribute.OfType & Utils.Guard.Never>; export type Get> = Utils.Get, U>; From 2b8d9de6ac295d4acfe11ec865062f2d68be3ffa Mon Sep 17 00:00:00 2001 From: Convly Date: Tue, 6 Jun 2023 12:21:03 +0200 Subject: [PATCH 105/172] Update wording for relation types --- .../data-transfer/types/common-entities.d.ts | 2 +- .../lib/types/core/attributes/relation.d.ts | 26 +++++++++---------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/packages/core/data-transfer/types/common-entities.d.ts b/packages/core/data-transfer/types/common-entities.d.ts index 64bdc778a5..c2cbed0624 100644 --- a/packages/core/data-transfer/types/common-entities.d.ts +++ b/packages/core/data-transfer/types/common-entities.d.ts @@ -49,7 +49,7 @@ interface IDefaultLink { /** * The relation type */ - relation: Attribute.RelationsType; + relation: Attribute.RelationType; /** * Left side of the link diff --git a/packages/core/strapi/lib/types/core/attributes/relation.d.ts b/packages/core/strapi/lib/types/core/attributes/relation.d.ts index d48a6b2daf..83fa19bd92 100644 --- a/packages/core/strapi/lib/types/core/attributes/relation.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/relation.d.ts @@ -1,27 +1,27 @@ import type { Attribute, Common, Utils } from '@strapi/strapi'; -export type BasicRelationsType = +export type BasicRelationType = | 'oneToOne' | 'oneToMany' | 'manyToOne' | 'manyToMany' | 'morphOne' | 'morphMany'; -export type PolymorphicRelationsType = 'morphToOne' | 'morphToMany'; -export type RelationsType = BasicRelationsType | PolymorphicRelationsType; +export type PolymorphicRelationType = 'morphToOne' | 'morphToMany'; +export type RelationType = BasicRelationType | PolymorphicRelationType; export type BasicRelationProperties< S extends Common.UID.Schema, - R extends BasicRelationsType, + R extends BasicRelationType, T extends Common.UID.Schema > = { relation: R; target: T; -} & R extends `morph${string}` +} & R extends Utils.String.Suffix<'morph', 'One' | 'Many'> ? { morphBy?: Utils.Object.KeysBy< Common.Schemas[T]['attributes'], - Attribute.Relation + Attribute.Relation >; } : { @@ -29,19 +29,19 @@ export type BasicRelationProperties< mappedBy?: RelationsKeysFromTo; }; -export interface PolymorphicRelationProperties { +export interface PolymorphicRelationProperties { relation: R; } export type Relation< S extends Common.UID.Schema = Common.UID.Schema, - R extends RelationsType = RelationsType, - T extends R extends PolymorphicRelationsType ? never : Common.UID.Schema = never + R extends RelationType = RelationType, + T extends R extends PolymorphicRelationType ? never : Common.UID.Schema = never > = Attribute.OfType<'relation'> & // Properties - (R extends BasicRelationsType + (R extends BasicRelationType ? BasicRelationProperties - : R extends PolymorphicRelationsType + : R extends PolymorphicRelationType ? PolymorphicRelationProperties : {}) & // Options @@ -59,12 +59,12 @@ export type PickRelationsFromTo< > = Attribute.GetByType; export type RelationPluralityModifier< - TRelation extends RelationsType, + TRelation extends RelationType, TValue extends Record > = TRelation extends `${string}Many` ? TValue[] : TValue; export type RelationValue< - TRelation extends RelationsType, + TRelation extends RelationType, TTarget extends Common.UID.Schema > = RelationPluralityModifier>; From eff2db3281f850334a5a08974cd59c43d5e8882b Mon Sep 17 00:00:00 2001 From: Convly Date: Tue, 6 Jun 2023 12:29:35 +0200 Subject: [PATCH 106/172] Add example for Component UID warning --- packages/core/strapi/lib/types/core/uid.d.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/core/strapi/lib/types/core/uid.d.ts b/packages/core/strapi/lib/types/core/uid.d.ts index ef4fe25823..1dadf79ca8 100644 --- a/packages/core/strapi/lib/types/core/uid.d.ts +++ b/packages/core/strapi/lib/types/core/uid.d.ts @@ -56,7 +56,14 @@ export type ContentType = StringSuffix< /** * Template for components' unique identifier * - * Warning: Can cause overlap with other UID formats. + * @example + * 'default.foo' extends Component => true (T = 'default', N = 'foo') + * + * @example + * // /!\ Warning: Can cause overlap with other UID formats: + * // 'api::foo.bar' both extends ContentType and Component + * 'api::foo.bar' extends ContentType => true (N = 'api', S='::', T='foo') + * 'api::foo.bar' extends Component => true (T = 'api::foo', N = 'bar') */ export type Component = `${T}.${N}`; From 6bcd972026a0e36b4a776ceb336fc092f41d4d29 Mon Sep 17 00:00:00 2001 From: Convly Date: Tue, 6 Jun 2023 16:32:07 +0200 Subject: [PATCH 107/172] Remove pluralize usage --- packages/utils/typescript/lib/generators/index.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/utils/typescript/lib/generators/index.js b/packages/utils/typescript/lib/generators/index.js index 757c68385d..4785686ec8 100644 --- a/packages/utils/typescript/lib/generators/index.js +++ b/packages/utils/typescript/lib/generators/index.js @@ -46,8 +46,8 @@ const generate = async (config = {}) => { const generatorConfig = { strapi, pwd: registryPwd, logger }; const returnWithMessage = () => { - const nbWarnings = chalk.yellow(maybePlural('warning', logger.warnings)); - const nbErrors = chalk.red(maybePlural('error', logger.errors)); + const nbWarnings = chalk.yellow(`${logger.warnings} warning(s)`); + const nbErrors = chalk.red(`${logger.errors} error(s)`); const status = logger.errors > 0 ? chalk.red('errored') : chalk.green('completed successfully'); @@ -119,6 +119,4 @@ const generate = async (config = {}) => { return returnWithMessage(); }; -const maybePlural = (word, n) => `${n} ${word}${n > 1 ? 's' : ''}`; - module.exports = { generate }; From 595a4c885a1bd79e2bb4283a87984f33d7f857b0 Mon Sep 17 00:00:00 2001 From: Convly Date: Tue, 6 Jun 2023 18:24:15 +0200 Subject: [PATCH 108/172] Use better generic parameter names to follow new Strapi x TS conventions --- .../strategies/restore/entities.ts | 6 +- .../lib/types/core/attributes/base.d.ts | 4 +- .../lib/types/core/attributes/common.d.ts | 14 +-- .../lib/types/core/attributes/component.d.ts | 35 +++--- .../types/core/attributes/dynamic-zone.d.ts | 22 ++-- .../types/core/attributes/enumeration.d.ts | 17 ++- .../lib/types/core/attributes/media.d.ts | 31 ++--- .../lib/types/core/attributes/relation.d.ts | 62 +++++----- .../strapi/lib/types/core/attributes/uid.d.ts | 42 +++---- .../lib/types/core/attributes/utils.d.ts | 117 ++++++++++-------- .../lib/types/core/common/controller.d.ts | 4 +- .../strapi/lib/types/core/common/uid.d.ts | 4 +- .../core/strapi/lib/types/core/namespace.d.ts | 19 +-- .../core/strapi/lib/types/core/registry.d.ts | 23 ++-- .../strapi/lib/types/core/strapi/index.d.ts | 4 +- packages/core/strapi/lib/types/core/uid.d.ts | 62 +++++----- .../core/strapi/lib/types/utils/array.d.ts | 4 +- .../core/strapi/lib/types/utils/guard.d.ts | 4 +- .../core/strapi/lib/types/utils/index.d.ts | 4 +- .../core/strapi/lib/types/utils/object.d.ts | 12 +- .../core/strapi/lib/types/utils/string.d.ts | 23 ++-- .../core/strapi/lib/types/utils/tuple.d.ts | 14 +-- 22 files changed, 286 insertions(+), 241 deletions(-) diff --git a/packages/core/data-transfer/src/strapi/providers/local-destination/strategies/restore/entities.ts b/packages/core/data-transfer/src/strapi/providers/local-destination/strategies/restore/entities.ts index 2cba4e78ce..717136951f 100644 --- a/packages/core/data-transfer/src/strapi/providers/local-destination/strategies/restore/entities.ts +++ b/packages/core/data-transfer/src/strapi/providers/local-destination/strategies/restore/entities.ts @@ -10,8 +10,8 @@ import * as queries from '../../../../queries'; interface IEntitiesRestoreStreamOptions { strapi: Strapi.Strapi; - updateMappingTable( - type: T, + updateMappingTable( + type: TSchemaUID, oldID: number, newID: number ): void; @@ -35,7 +35,7 @@ const createEntitiesWriteStream = (options: IEntitiesRestoreStreamOptions) => { * Resolve the component UID of an entity's attribute based * on a given path (components & dynamic zones only) */ - const resolveType = (paths: string[]): string | undefined => { + const resolveType = (paths: string[]): Common.UID.Component | undefined => { let cType = contentType; let value: unknown = data; diff --git a/packages/core/strapi/lib/types/core/attributes/base.d.ts b/packages/core/strapi/lib/types/core/attributes/base.d.ts index f50f317256..a53ce51928 100644 --- a/packages/core/strapi/lib/types/core/attributes/base.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/base.d.ts @@ -27,11 +27,11 @@ export type Kind = /** * Most basic shape of a schema attribute */ -export interface Attribute { +export interface Attribute { /** * Type of the attribute */ - type: T; + type: TKind; /** * Options defined and used by the plugins diff --git a/packages/core/strapi/lib/types/core/attributes/common.d.ts b/packages/core/strapi/lib/types/core/attributes/common.d.ts index e7f95e3c5c..2b67aa42f7 100644 --- a/packages/core/strapi/lib/types/core/attributes/common.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/common.d.ts @@ -25,19 +25,19 @@ export type Configurable = { configurable: true }; export type NonConfigurable = { configurable: false }; // custom field -export type CustomField = { - customField: T; - options?: P; +export type CustomField = { + customField: TKind; + options?: TOptions; }; // min/max -export type SetMinMax, U = number> = T; +export type SetMinMax, TType = number> = TConfig; // minLength/maxLength -export type SetMinMaxLength = T; +export type SetMinMaxLength = TConfig; // pluginOptions -export type SetPluginOptions = { pluginOptions?: T }; +export type SetPluginOptions = { pluginOptions?: TConfig }; // default export type DefaultTo = { default: T }; @@ -56,7 +56,7 @@ export type Any = | Attribute.Float | Attribute.Integer | Attribute.JSON - | Attribute.Media + | Attribute.Media | Attribute.Password | Attribute.Relation | Attribute.RichText diff --git a/packages/core/strapi/lib/types/core/attributes/component.d.ts b/packages/core/strapi/lib/types/core/attributes/component.d.ts index 61cabf3d77..7c5e6d95c8 100644 --- a/packages/core/strapi/lib/types/core/attributes/component.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/component.d.ts @@ -1,23 +1,19 @@ import type { Common, Attribute } from '@strapi/strapi'; export interface ComponentProperties< - // Targeted component - T extends Common.UID.Component, - // Repeatable - R extends boolean = false + TComponentUID extends Common.UID.Component, + TRepeatable extends boolean = false > { - component: T; - repeatable?: R; + component: TComponentUID; + repeatable?: TRepeatable; } export type Component< - // Targeted component - T extends Common.UID.Component = Common.UID.Component, - // Repeatable - R extends boolean = false + TComponentUID extends Common.UID.Component = Common.UID.Component, + TRepeatable extends boolean = false > = Attribute.OfType<'component'> & // Component Properties - ComponentProperties & + ComponentProperties & // Options Attribute.ConfigurableOption & Attribute.MinMaxOption & @@ -25,10 +21,15 @@ export type Component< Attribute.RequiredOption; export type ComponentValue< - T extends Common.UID.Component, - R extends boolean -> = Attribute.GetValues extends infer V ? (R extends true ? V[] : V) : never; - -export type GetComponentValue = T extends Component - ? ComponentValue + TComponentUID extends Common.UID.Component, + TRepeatable extends boolean +> = Attribute.GetValues extends infer TValues + ? TRepeatable extends true + ? TValues[] + : TValues : never; + +export type GetComponentValue = + TAttribute extends Component + ? ComponentValue + : never; diff --git a/packages/core/strapi/lib/types/core/attributes/dynamic-zone.d.ts b/packages/core/strapi/lib/types/core/attributes/dynamic-zone.d.ts index 01654ace70..0ade9cf48b 100644 --- a/packages/core/strapi/lib/types/core/attributes/dynamic-zone.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/dynamic-zone.d.ts @@ -1,26 +1,26 @@ import type { Utils, Attribute, Common } from '@strapi/strapi'; -export interface DynamicZoneProperties { - components: T; +export interface DynamicZoneProperties { + components: TComponentsUIDs; } -export type DynamicZone = +export type DynamicZone = Attribute.OfType<'dynamiczone'> & // Properties - DynamicZoneProperties & + DynamicZoneProperties & // Options Attribute.ConfigurableOption & Attribute.MinMaxOption & Attribute.RequiredOption; -type DynamicZoneValue = Array< - Utils.Array.Values extends infer P - ? P extends Common.UID.Component - ? Attribute.GetValues

& { __component: P } +type DynamicZoneValue = Array< + // Extract tuple values to a component uid union type + Utils.Array.Values extends infer TComponentUID + ? TComponentUID extends Common.UID.Component + ? Attribute.GetValues & { __component: TComponentUID } : never : never >; -export type GetDynamicZoneValue = T extends DynamicZone - ? DynamicZoneValue - : never; +export type GetDynamicZoneValue = + TAttribute extends DynamicZone ? DynamicZoneValue : never; diff --git a/packages/core/strapi/lib/types/core/attributes/enumeration.d.ts b/packages/core/strapi/lib/types/core/attributes/enumeration.d.ts index 9245bf555c..bee4b3bafd 100644 --- a/packages/core/strapi/lib/types/core/attributes/enumeration.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/enumeration.d.ts @@ -1,19 +1,18 @@ import type { Attribute, Utils } from '@strapi/strapi'; -export interface EnumerationProperties { - enum: T; +export interface EnumerationProperties { + enum: TValues; } -export type Enumeration = Attribute.OfType<'enumeration'> & - EnumerationProperties & +export type Enumeration = Attribute.OfType<'enumeration'> & + EnumerationProperties & // Options Attribute.ConfigurableOption & - Attribute.DefaultOption & + Attribute.DefaultOption & Attribute.PrivateOption & Attribute.RequiredOption; -export type EnumerationValue = Utils.Array.Values; +export type EnumerationValue = Utils.Array.Values; -export type GetEnumerationValue = T extends Enumeration - ? EnumerationValue - : never; +export type GetEnumerationValue = + TAttribute extends Enumeration ? EnumerationValue : never; diff --git a/packages/core/strapi/lib/types/core/attributes/media.d.ts b/packages/core/strapi/lib/types/core/attributes/media.d.ts index e4f6823f9f..09a38a73c1 100644 --- a/packages/core/strapi/lib/types/core/attributes/media.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/media.d.ts @@ -1,32 +1,33 @@ import type { Attribute } from '@strapi/strapi'; -export type AllowedMediaTypes = 'images' | 'videos' | 'files' | 'audios'; +export type MediaKind = 'images' | 'videos' | 'files' | 'audios'; export interface MediaProperties< - // Media Type - T extends AllowedMediaTypes | undefined = undefined, - // Multiple - U extends boolean = false + TKind extends MediaKind | undefined = undefined, + TMultiple extends boolean = false > { - allowedTypes?: T; - multiple?: U; + allowedTypes?: TKind; + multiple?: TMultiple; } export type Media< - // Media Type - T extends AllowedMediaTypes | undefined = undefined, - // Multiple - U extends boolean = false + TKind extends MediaKind | undefined = undefined, + TMultiple extends boolean = false > = Attribute.OfType<'media'> & // Properties - MediaProperties & + MediaProperties & // Options Attribute.ConfigurableOption & Attribute.RequiredOption & Attribute.PrivateOption; -export type MediaValue = T extends true ? any[] : any; +// TODO: Introduce a real type for the media values +export type MediaValue = TMultiple extends true ? any[] : any; -export type GetMediaValue = T extends Media - ? MediaValue +export type GetMediaValue = TAttribute extends Media< + // Unused as long as the media value is any + infer _TKind, + infer TMultiple +> + ? MediaValue : never; diff --git a/packages/core/strapi/lib/types/core/attributes/relation.d.ts b/packages/core/strapi/lib/types/core/attributes/relation.d.ts index 83fa19bd92..79f5d5d39d 100644 --- a/packages/core/strapi/lib/types/core/attributes/relation.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/relation.d.ts @@ -11,38 +11,38 @@ export type PolymorphicRelationType = 'morphToOne' | 'morphToMany'; export type RelationType = BasicRelationType | PolymorphicRelationType; export type BasicRelationProperties< - S extends Common.UID.Schema, - R extends BasicRelationType, - T extends Common.UID.Schema + TOrigin extends Common.UID.Schema, + TRelationType extends BasicRelationType, + TTarget extends Common.UID.Schema > = { - relation: R; - target: T; -} & R extends Utils.String.Suffix<'morph', 'One' | 'Many'> + relation: TRelationType; + target: TTarget; +} & TRelationType extends Utils.String.Suffix<'morph', 'One' | 'Many'> ? { morphBy?: Utils.Object.KeysBy< - Common.Schemas[T]['attributes'], + Common.Schemas[TTarget]['attributes'], Attribute.Relation >; } : { - inversedBy?: RelationsKeysFromTo; - mappedBy?: RelationsKeysFromTo; + inversedBy?: RelationsKeysFromTo; + mappedBy?: RelationsKeysFromTo; }; -export interface PolymorphicRelationProperties { - relation: R; +export interface PolymorphicRelationProperties { + relation: TRelationType; } export type Relation< - S extends Common.UID.Schema = Common.UID.Schema, - R extends RelationType = RelationType, - T extends R extends PolymorphicRelationType ? never : Common.UID.Schema = never + TOrigin extends Common.UID.Schema = Common.UID.Schema, + TRelationType extends RelationType = RelationType, + TTarget extends TRelationType extends PolymorphicRelationType ? never : Common.UID.Schema = never > = Attribute.OfType<'relation'> & // Properties - (R extends BasicRelationType - ? BasicRelationProperties - : R extends PolymorphicRelationType - ? PolymorphicRelationProperties + (TRelationType extends BasicRelationType + ? BasicRelationProperties + : TRelationType extends PolymorphicRelationType + ? PolymorphicRelationProperties : {}) & // Options Attribute.ConfigurableOption & @@ -50,28 +50,28 @@ export type Relation< export type RelationsKeysFromTo< TTarget extends Common.UID.Schema, - TSource extends Common.UID.Schema -> = keyof PickRelationsFromTo; + TOrigin extends Common.UID.Schema +> = keyof PickRelationsFromTo; export type PickRelationsFromTo< TTarget extends Common.UID.Schema, - TSource extends Common.UID.Schema -> = Attribute.GetByType; + TOrigin extends Common.UID.Schema +> = Attribute.GetByType; export type RelationPluralityModifier< - TRelation extends RelationType, - TValue extends Record -> = TRelation extends `${string}Many` ? TValue[] : TValue; + TRelationType extends RelationType, + TValue +> = TRelationType extends Utils.String.Suffix ? TValue[] : TValue; export type RelationValue< - TRelation extends RelationType, + TRelationType extends RelationType, TTarget extends Common.UID.Schema -> = RelationPluralityModifier>; +> = RelationPluralityModifier>; -export type GetRelationValue = T extends Relation< - infer _TSource, - infer TRelation, +export type GetRelationValue = TAttribute extends Relation< + infer _TOrigin, + infer TRelationType, infer TTarget > - ? RelationValue + ? RelationValue : never; diff --git a/packages/core/strapi/lib/types/core/attributes/uid.d.ts b/packages/core/strapi/lib/types/core/attributes/uid.d.ts index d91edc4e84..8b962e9da7 100644 --- a/packages/core/strapi/lib/types/core/attributes/uid.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/uid.d.ts @@ -9,32 +9,28 @@ export interface UIDOptions { } export interface UIDProperties< - // Own Schema Reference - T extends Common.UID.Schema, - // Target attribute - U extends TargetAttributeByUID, - // UID options - S extends UIDOptions = UIDOptions + TOrigin extends Common.UID.Schema, + TTargetAttribute extends AllowedTargetAttributes, + TOptions extends UIDOptions = UIDOptions > { - targetField: U; - options: UIDOptions & S; + targetField: TTargetAttribute; + options: UIDOptions & TOptions; } -export interface GenericUIDProperties { +export interface GenericUIDProperties { targetField?: string; - options: UIDOptions & S; + options: TOptions & UIDOptions; } export type UID< - // Own Schema Reference - T extends Common.UID.Schema | undefined = undefined, - // Target attribute - U extends TargetAttributeByUID = TargetAttributeByUID, - // UID options - S extends UIDOptions = UIDOptions + TOrigin extends Common.UID.Schema | undefined = undefined, + TTargetAttribute extends AllowedTargetAttributes = AllowedTargetAttributes, + TOptions extends UIDOptions = UIDOptions > = Attribute.OfType<'uid'> & // Properties - (T extends Common.UID.Schema ? UIDProperties : GenericUIDProperties) & + (TOrigin extends Common.UID.Schema + ? UIDProperties + : GenericUIDProperties) & // Options Attribute.ConfigurableOption & Attribute.DefaultOption & @@ -42,12 +38,16 @@ export type UID< Attribute.PrivateOption & Attribute.RequiredOption; -type TargetAttributeByUID = T extends Common.UID.Schema - ? Utils.Guard.Never, string> - : never; +type AllowedTargetAttributes = + TOrigin extends Common.UID.Schema + ? Utils.Guard.Never, string> + : never; export type UIDValue = string; -export type GetUIDValue = T extends UID +export type GetUIDValue = TAttribute extends UID< + infer _TOrigin, + infer _TTargetAttribute +> ? UIDValue : never; diff --git a/packages/core/strapi/lib/types/core/attributes/utils.d.ts b/packages/core/strapi/lib/types/core/attributes/utils.d.ts index 09e53eb7fe..b8d5925ad1 100644 --- a/packages/core/strapi/lib/types/core/attributes/utils.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/utils.d.ts @@ -1,71 +1,88 @@ import type { Attribute, Common, Utils } from '@strapi/strapi'; -export type PickTypes = T; - export type GetKeysByType< - T extends Common.UID.Schema, - U extends Attribute.Kind, - P = never -> = Utils.Object.KeysBy, Attribute.OfType & Utils.Guard.Never>; + TSchemaUID extends Common.UID.Schema, + TKind extends Attribute.Kind, + TCondition = never +> = Utils.Object.KeysBy< + GetAll, + Attribute.OfType & Utils.Guard.Never +>; export type GetByType< - T extends Common.UID.Schema, - U extends Attribute.Kind, - P = never -> = Utils.Object.PickBy, Attribute.OfType & Utils.Guard.Never>; + TSchemaUID extends Common.UID.Schema, + TKind extends Attribute.Kind, + TCondition = never +> = Utils.Object.PickBy< + GetAll, + Attribute.OfType & Utils.Guard.Never +>; -export type Get> = Utils.Get, U>; +export type Get> = Utils.Get< + GetAll, + TKey +>; -export type GetAll = Utils.Get; +export type GetAll = Utils.Get< + Common.Schemas[TSchemaUID], + 'attributes' +>; -export type GetKeys = keyof GetAll; +export type GetKeys = keyof GetAll; -export type GetValue = - | Attribute.GetBigIntegerValue - | Attribute.GetBooleanValue - | Attribute.GetComponentValue - | Attribute.GetDecimalValue - | Attribute.GetDynamicZoneValue - | Attribute.GetEnumerationValue - | Attribute.GetEmailValue - | Attribute.GetFloatValue - | Attribute.GetIntegerValue - | Attribute.GetJsonValue - | Attribute.GetMediaValue - | Attribute.GetPasswordValue - | Attribute.GetRelationValue - | Attribute.GetRichTextValue - | Attribute.GetStringValue - | Attribute.GetTextValue - | Attribute.GetUIDValue - | Attribute.GetDateValue - | Attribute.GetDateTimeValue - | Attribute.GetTimeValue - | Attribute.GetTimestampValue; +export type GetValue = + | Attribute.GetBigIntegerValue + | Attribute.GetBooleanValue + | Attribute.GetComponentValue + | Attribute.GetDecimalValue + | Attribute.GetDynamicZoneValue + | Attribute.GetEnumerationValue + | Attribute.GetEmailValue + | Attribute.GetFloatValue + | Attribute.GetIntegerValue + | Attribute.GetJsonValue + | Attribute.GetMediaValue + | Attribute.GetPasswordValue + | Attribute.GetRelationValue + | Attribute.GetRichTextValue + | Attribute.GetStringValue + | Attribute.GetTextValue + | Attribute.GetUIDValue + | Attribute.GetDateValue + | Attribute.GetDateTimeValue + | Attribute.GetTimeValue + | Attribute.GetTimestampValue; -export type GetValueByKey> = Get< - T, - U -> extends infer P - ? P extends Attribute.Attribute - ? GetValue

- : never +export type GetValueByKey< + TSchemaUID extends Common.UID.Schema, + TKey extends GetKeys +> = Get extends infer TAttribute extends Attribute.Attribute + ? GetValue : never; -export type GetValues = GetKeys> = { +export type GetValues< + TSchemaUID extends Common.UID.Schema, + TKey extends GetKeys = GetKeys +> = { // Handle required attributes - [key in GetRequiredKeys as key extends U ? key : never]-?: GetValueByKey; + [key in GetRequiredKeys as key extends TKey ? key : never]-?: GetValueByKey< + TSchemaUID, + key + >; } & { // Handle optional attributes - [key in GetOptionalKeys as key extends U ? key : never]?: GetValueByKey; + [key in GetOptionalKeys as key extends TKey ? key : never]?: GetValueByKey< + TSchemaUID, + key + >; }; -export type GetRequiredKeys = Utils.Object.KeysBy< - GetAll, +export type GetRequiredKeys = Utils.Object.KeysBy< + GetAll, { required: true } >; -export type GetOptionalKeys = keyof Omit< - GetAll, - GetRequiredKeys +export type GetOptionalKeys = keyof Omit< + GetAll, + GetRequiredKeys >; diff --git a/packages/core/strapi/lib/types/core/common/controller.d.ts b/packages/core/strapi/lib/types/core/common/controller.d.ts index 1fcdc96b2f..49fed03787 100644 --- a/packages/core/strapi/lib/types/core/common/controller.d.ts +++ b/packages/core/strapi/lib/types/core/common/controller.d.ts @@ -1,8 +1,8 @@ import type { ExtendableContext, Next } from 'koa'; -export type ControllerHandler = ( +export type ControllerHandler = ( context: ExtendableContext, next: Next -) => Promise | T | void; +) => Promise | TResponse | void; export type Controller = Record; diff --git a/packages/core/strapi/lib/types/core/common/uid.d.ts b/packages/core/strapi/lib/types/core/common/uid.d.ts index 5ef444cc1b..9d9472e4ee 100644 --- a/packages/core/strapi/lib/types/core/common/uid.d.ts +++ b/packages/core/strapi/lib/types/core/common/uid.d.ts @@ -26,7 +26,9 @@ export type SingleType = Extract< >; export type Component = Registry.Keys; -export type ComponentCategory = Component extends UID.Component ? A : never; +export type ComponentCategory = Component extends UID.Component + ? TCategory + : never; export type Schema = Registry.Keys< Common.Schemas, diff --git a/packages/core/strapi/lib/types/core/namespace.d.ts b/packages/core/strapi/lib/types/core/namespace.d.ts index c506eac2f7..638b5713ee 100644 --- a/packages/core/strapi/lib/types/core/namespace.d.ts +++ b/packages/core/strapi/lib/types/core/namespace.d.ts @@ -43,7 +43,7 @@ export type Any = API | Plugin | Admin | Strapi | Global; * type S = GetSeparator * // ^ '.' | '::' */ -export type GetSeparator = T extends Scoped +export type GetSeparator = TNamespace extends Scoped ? // 'api::foo' | 'plugin::bar' => '.' DotSeparator : // 'admin' | 'strapi' | 'global' => '::' @@ -67,23 +67,28 @@ export type GetSeparator = T extends Scoped * type T = WithSeparator | WithSeparator * // ^ 'admin::' | 'api::{string}.' */ -export type WithSeparator = Utils.String.Suffix>; +export type WithSeparator = Utils.String.Suffix< + TNamespace, + GetSeparator +>; /** - * Represents namespaces composed of an origin and a name, separated by colons + * Represents namespaces composed of an origin and a scope, separated by colons */ -export type Scoped = Any & - `${O}${ColonsSeparator}${S}`; +export type Scoped = Any & + `${TOrigin}${ColonsSeparator}${TScope}`; /** * Extract the scope from the given scoped namespace */ -export type ExtractScope = T extends `${string}${ColonsSeparator}${infer S}` ? S : never; +export type ExtractScope = + TNamespace extends `${string}${ColonsSeparator}${infer TScope}` ? TScope : never; /** * Extract the origin from the given scoped namespace */ -export type ExtractOrigin = T extends `${infer S}${ColonsSeparator}${string}` ? S : never; +export type ExtractOrigin = + TNamespace extends `${infer TOrigin}${ColonsSeparator}${string}` ? TOrigin : never; /** * Separators used to join the different parts of a namespace (e.g. building a uid) diff --git a/packages/core/strapi/lib/types/core/registry.d.ts b/packages/core/strapi/lib/types/core/registry.d.ts index 7efb556a2d..fbc068564c 100644 --- a/packages/core/strapi/lib/types/core/registry.d.ts +++ b/packages/core/strapi/lib/types/core/registry.d.ts @@ -3,7 +3,7 @@ import type * as UID from './uid'; /** * Extract valid keys from a given registry. * - * It looks for {@link UID.Any} by default but the search can be narrowed to any UID subset using the `U` generic. + * It looks for {@link UID.Any} by default but the search can be narrowed to any UID subset using the `TUidFormat` generic. * * @example * interface Registry { @@ -20,14 +20,17 @@ import type * as UID from './uid'; * type T = Keys * // ^ 'api::foo.bar' */ -export type Keys = Extract; +export type Keys = Extract< + keyof TRegistry, + TUidFormat +>; /** - * Performs a `Q` filtering operation on the given `T` registry. + * Performs a `TQuery` filtering operation on the given `TRegistry` registry. * - * `Q` needs to be a partial representation of a {@link UID.Parsed} + * `TQuery` needs to be a partial representation of a {@link UID.Parsed} * - * Note: For additional filtering, the registry keys' type can be passed as the third generic. + * Note: For additional filtering, the registry keys' type can be passed as the third parameter. * * @example * interface Registry { @@ -54,6 +57,12 @@ export type Keys = Extract; * type T = keyof WhereKeys }>; * // ^ "api::foo.bar" | "api::foo.baz" */ -export type WhereKeys, U extends UID.Any = UID.Any> = { - [uid in Keys as UID.Parse extends Q ? uid : never]: T[uid]; +export type WhereKeys< + TRegistry, + TQuery extends Partial, + TUidFormat extends UID.Any = UID.Any +> = { + [uid in Keys as UID.Parse extends TQuery + ? uid + : never]: TRegistry[uid]; }; diff --git a/packages/core/strapi/lib/types/core/strapi/index.d.ts b/packages/core/strapi/lib/types/core/strapi/index.d.ts index 6904ae16a2..241d2f15f6 100644 --- a/packages/core/strapi/lib/types/core/strapi/index.d.ts +++ b/packages/core/strapi/lib/types/core/strapi/index.d.ts @@ -1,4 +1,4 @@ -import { Database } from '@strapi/database'; +import type { Database } from '@strapi/database'; import type { Shared } from '@strapi/strapi'; import type { GenericController } from '../../../core-api/controller'; @@ -73,7 +73,7 @@ export interface Strapi { /** * Find a service using its unique identifier */ - service(uid: string): T | undefined; + service(uid: string): TService | undefined; /** * Getter for the Strapi controllers container diff --git a/packages/core/strapi/lib/types/core/uid.d.ts b/packages/core/strapi/lib/types/core/uid.d.ts index 1dadf79ca8..3e32520e92 100644 --- a/packages/core/strapi/lib/types/core/uid.d.ts +++ b/packages/core/strapi/lib/types/core/uid.d.ts @@ -65,7 +65,10 @@ export type ContentType = StringSuffix< * 'api::foo.bar' extends ContentType => true (N = 'api', S='::', T='foo') * 'api::foo.bar' extends Component => true (T = 'api::foo', N = 'bar') */ -export type Component = `${T}.${N}`; +export type Component< + TCategory extends string = string, + TName extends string = string +> = `${TCategory}.${TName}`; /** * Represents any UID @@ -77,13 +80,16 @@ export type Any = Service | Controller | Policy | Middleware | ContentType | Com * * The separator type is automatically inferred from the given namespace */ -export interface Parsed { - raw: `${N}${Namespace.GetSeparator}${E}`; - namespace: N; - origin: N extends Namespace.Scoped ? Namespace.ExtractOrigin : N; - scope: N extends Namespace.Scoped ? Namespace.ExtractScope : never; - separator: Namespace.GetSeparator; - name: E; +export interface Parsed< + TNamespace extends Namespace.Any = Namespace.Any, + TName extends string = string +> { + raw: `${TNamespace}${Namespace.GetSeparator}${TName}`; + namespace: TNamespace; + origin: TNamespace extends Namespace.Scoped ? Namespace.ExtractOrigin : TNamespace; + scope: TNamespace extends Namespace.Scoped ? Namespace.ExtractScope : never; + separator: Namespace.GetSeparator; + name: TName; } /** @@ -101,18 +107,19 @@ export interface Parsed * // ^ { namespace: 'admin' | 'api::foo' ; separator: '.' | '::'; name: 'foo' | 'bar' | 'foo.bar'; } */ -export type Parse = ExtractNamespace extends infer B extends Namespace.Any - ? Namespace.GetSeparator extends infer S extends Namespace.Separator - ? U extends `${infer N extends B}${S}${infer E extends string}` - ? Parsed +export type Parse = + ExtractNamespace extends infer TExtractedNamespace extends Namespace.Any + ? Namespace.GetSeparator extends infer TSeparator extends Namespace.Separator + ? TUid extends `${infer TInferredNamespace extends TExtractedNamespace}${TSeparator}${infer TName extends string}` + ? Parsed + : never : never - : never - : never; + : never; /** * Determines if the UID's namespace matches the given one. * - * It returns N (the {@link Namespace.Any} literal) if there is a match, never otherwise. + * It returns TNamespace (the {@link Namespace.Any} literal) if there is a match, never otherwise. * * @example * type T = EnsureNamespaceMatches<'admin::foo', Namespace.Admin> @@ -124,21 +131,20 @@ export type Parse = ExtractNamespace extends infer B extends N * type T = EnsureNamespaceMatches<'api::foo.bar', Namespace.Plugin> * // ^ never */ -export type EnsureNamespaceMatches = U extends StringSuffix< - Namespace.WithSeparator -> - ? N - : never; +export type EnsureNamespaceMatches< + TUid extends Any, + TNamespace extends Namespace.Any +> = TUid extends StringSuffix> ? TNamespace : never; /** * Get parsed properties from a given raw UID */ -export type Get = Parse[P]; +export type Get = Parse[TKey]; /** * Pick parsed properties from a given raw UID */ -export type Select> = Pick, P>; +export type Select> = Pick, TKey>; /** * Extract the namespace literal from a given UID. @@ -153,9 +159,9 @@ export type Select> = Pick, P>; * type T = ExtractNamespace<'admin::foo' | 'api::foo.bar'> * // ^ Namespace.Admin | Namespace.API */ -export type ExtractNamespace = - | EnsureNamespaceMatches - | EnsureNamespaceMatches - | EnsureNamespaceMatches - | EnsureNamespaceMatches - | EnsureNamespaceMatches; +export type ExtractNamespace = + | EnsureNamespaceMatches + | EnsureNamespaceMatches + | EnsureNamespaceMatches + | EnsureNamespaceMatches + | EnsureNamespaceMatches; diff --git a/packages/core/strapi/lib/types/utils/array.d.ts b/packages/core/strapi/lib/types/utils/array.d.ts index 05227aac62..9f8efbd602 100644 --- a/packages/core/strapi/lib/types/utils/array.d.ts +++ b/packages/core/strapi/lib/types/utils/array.d.ts @@ -3,4 +3,6 @@ * Extract the array values into an union type * **/ -export type Values> = T extends Array ? U : never; +export type Values> = TCollection extends Array + ? TValues + : never; diff --git a/packages/core/strapi/lib/types/utils/guard.d.ts b/packages/core/strapi/lib/types/utils/guard.d.ts index a2440defee..1872d3500f 100644 --- a/packages/core/strapi/lib/types/utils/guard.d.ts +++ b/packages/core/strapi/lib/types/utils/guard.d.ts @@ -1,5 +1,5 @@ /** - * Assign a default value `U` to `T` if `T` is of type `never` + * Assign a default value `TDefault` to `TValue` if `TValue` is of type `never` * * @example * type X = Never<{ foo: 'bar' }, string> @@ -11,4 +11,4 @@ * type X = Never * // string */ -export type Never = [T] extends [never] ? U : T; +export type Never = [TValue] extends [never] ? TDefault : TValue; diff --git a/packages/core/strapi/lib/types/utils/index.d.ts b/packages/core/strapi/lib/types/utils/index.d.ts index c98b194ada..1c4b8ddb3a 100644 --- a/packages/core/strapi/lib/types/utils/index.d.ts +++ b/packages/core/strapi/lib/types/utils/index.d.ts @@ -5,7 +5,7 @@ export * as String from './string'; export * as Tuple from './tuple'; /** - * Get the type of a specific key `U` in `T` + * Get the type of a specific key `TKey` in `TValue` * * @example * @@ -15,4 +15,4 @@ export * as Tuple from './tuple'; * type X = Get<{ foo: 'bar', 'bar': 'foo' }, 'bar'> * // 'foo' */ -export type Get = T[U]; +export type Get = TValue[TKey]; diff --git a/packages/core/strapi/lib/types/utils/object.d.ts b/packages/core/strapi/lib/types/utils/object.d.ts index a1c43664d2..ba52e33519 100644 --- a/packages/core/strapi/lib/types/utils/object.d.ts +++ b/packages/core/strapi/lib/types/utils/object.d.ts @@ -1,5 +1,5 @@ /** - * Retrieve object's (`T`) keys if they extends the given `U` type. + * Retrieve object's (`TValue`) keys if they extends the given `TTest` type. * * @example * type X = KeysBy<{ foo: 'bar', bar: 'foo', foobar: 2 }, string> @@ -10,12 +10,12 @@ * type X = KeysBy * // 'foo' | 'bar' */ -export type KeysBy = { - [key in keyof T]: T[key] extends U ? key : never; -}[keyof T]; +export type KeysBy = { + [key in keyof TValue]: TValue[key] extends TTest ? key : never; +}[keyof TValue]; /** - * Retrieve object's (`T`) properties if their value extends the given `U` type. + * Retrieve object's (`TValue`) properties if their value extends the given `TTest` type. * * @example * type X = KeysBy<{ foo: 'bar', bar: 'foo', foobar: 2 }, string> @@ -26,4 +26,4 @@ export type KeysBy = { * type X = KeysBy * // { foo: { x: 'foo' }, bar: { x: 'bar' } } */ -export type PickBy = Pick>; +export type PickBy = Pick>; diff --git a/packages/core/strapi/lib/types/utils/string.d.ts b/packages/core/strapi/lib/types/utils/string.d.ts index 3b17f57139..ef8ee9c584 100644 --- a/packages/core/strapi/lib/types/utils/string.d.ts +++ b/packages/core/strapi/lib/types/utils/string.d.ts @@ -6,7 +6,7 @@ export type Literal = string | number | bigint | boolean; /** * Used to check if a string includes a given literal */ -export type Includes = `${string}${S}${string}`; +export type Includes = `${string}${T}${string}`; /** * Used to make sure the given string is not empty @@ -14,23 +14,26 @@ export type Includes = `${string}${S}${string}`; export type NonEmpty = T extends '' ? never : T; /** - * Split the given string into a tuple using the given `S` literal + * Split the given string into a tuple using the given `TSeparator` literal */ -export type Split = T extends `${infer A}${S}${infer B}` - ? [A, ...Split] - : T extends '' +export type Split< + TValue extends string, + TSeparator extends Literal +> = TValue extends `${infer TLeft}${TSeparator}${infer TRight}` + ? [TLeft, ...Split] + : TValue extends '' ? [] - : [T]; + : [TValue]; /** - * Add a literal suffix (`S`) at the end of the given string + * Add a literal suffix (`TSuffix`) at the end of the given string */ -export type Suffix = `${T}${S}`; +export type Suffix = `${TValue}${TSuffix}`; /** - * Add a literal prefix (`S`) at the beginning of the given string + * Add a literal prefix (`TPrefix`) at the beginning of the given string */ -export type Prefix = `${S}${T}`; +export type Prefix = `${TPrefix}${TValue}`; /** * Creates a record where every key is a string and every value is `T` diff --git a/packages/core/strapi/lib/types/utils/tuple.d.ts b/packages/core/strapi/lib/types/utils/tuple.d.ts index 8fdf356b2e..cdcd495239 100644 --- a/packages/core/strapi/lib/types/utils/tuple.d.ts +++ b/packages/core/strapi/lib/types/utils/tuple.d.ts @@ -1,13 +1,13 @@ import type { Literal } from './string'; /** - * Aggregate the given tuple into a string, separated by the given `S` literal + * Aggregate the given tuple into a string, separated by the given `TSeparator` literal */ -export type Join = T extends [ - infer F extends Literal, - ...infer R +export type Join = TCollection extends [ + infer THead extends Literal, + ...infer TTail ] - ? R['length'] extends 0 - ? F - : `${F}${S}${Join}` + ? TTail['length'] extends 0 + ? THead + : `${THead}${TSeparator}${Join}` : never; From dd8f98c5cd45fa172c7ef6155222866772f045bf Mon Sep 17 00:00:00 2001 From: Christian Capeans Date: Tue, 6 Jun 2023 22:23:58 +0200 Subject: [PATCH 109/172] Improve types for controllers, services and routes --- .../strapi/lib/core-api/service/index.d.ts | 23 ------ .../strapi/lib/core/registries/services.d.ts | 7 -- packages/core/strapi/lib/factories.d.ts | 77 ++----------------- .../strapi/lib/types/core-api/controller.d.ts | 19 ++--- .../core/strapi/lib/types/core-api/index.d.ts | 3 + .../strapi/lib/types/core-api/router.d.ts | 63 +++++++++++++++ .../strapi/lib/types/core-api/service.d.ts | 46 +++++++++++ .../strapi/lib/types/core/common/service.d.ts | 1 - .../types/core/common/{uid.d.ts => uid.ts} | 10 +++ .../strapi/lib/types/utils/expression.d.ts | 15 ++++ .../core/strapi/lib/types/utils/index.d.ts | 1 + 11 files changed, 152 insertions(+), 113 deletions(-) delete mode 100644 packages/core/strapi/lib/core-api/service/index.d.ts delete mode 100644 packages/core/strapi/lib/core/registries/services.d.ts create mode 100644 packages/core/strapi/lib/types/core-api/router.d.ts create mode 100644 packages/core/strapi/lib/types/core-api/service.d.ts delete mode 100644 packages/core/strapi/lib/types/core/common/service.d.ts rename packages/core/strapi/lib/types/core/common/{uid.d.ts => uid.ts} (80%) create mode 100644 packages/core/strapi/lib/types/utils/expression.d.ts diff --git a/packages/core/strapi/lib/core-api/service/index.d.ts b/packages/core/strapi/lib/core-api/service/index.d.ts deleted file mode 100644 index 0dcd982ca8..0000000000 --- a/packages/core/strapi/lib/core-api/service/index.d.ts +++ /dev/null @@ -1,23 +0,0 @@ -type Entity = object; - -interface BaseService { - getFetchParams?(params: object): object; -} - -export interface SingleTypeService extends BaseService { - find?(params: object): Promise | Entity; - createOrUpdate?(params: object): Promise | Entity; - delete?(params: object): Promise | Entity; -} - -export interface CollectionTypeService extends BaseService { - find?(params: object): Promise | Entity; - findOne?(entityId: string, params: object): Promise | Entity; - create?(params: object): Promise | Entity; - update?(entityId: string, params: object): Promise | Entity; - delete?(entityId: string, params: object): Promise | Entity; -} - -export type GenericService = { - [method: string | number | symbol]: (...args: any) => any; -}; diff --git a/packages/core/strapi/lib/core/registries/services.d.ts b/packages/core/strapi/lib/core/registries/services.d.ts deleted file mode 100644 index 7a172f927f..0000000000 --- a/packages/core/strapi/lib/core/registries/services.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Strapi } from '../../'; - -export type Service = { - [key: string]: (...args: any) => any; -}; - -export type ServiceFactory = ({ strapi: Strapi }) => Service; diff --git a/packages/core/strapi/lib/factories.d.ts b/packages/core/strapi/lib/factories.d.ts index bd120a50f8..55ca15111a 100644 --- a/packages/core/strapi/lib/factories.d.ts +++ b/packages/core/strapi/lib/factories.d.ts @@ -2,47 +2,10 @@ import type { Common, CoreApi, Strapi } from '@strapi/strapi'; type WithStrapiCallback = (params: S) => T; -// type HandlerConfig = { -// auth?: false | { scope: string[] }; -// policies?: Array; -// middlewares?: Array; -// }; - -// type SingleTypeRouterConfig = { -// find?: HandlerConfig; -// update?: HandlerConfig; -// delete?: HandlerConfig; -// }; - -// type CollectionTypeRouterConfig = { -// find?: HandlerConfig; -// findOne?: HandlerConfig; -// create?: HandlerConfig; -// update?: HandlerConfig; -// delete?: HandlerConfig; -// }; - -// type RouterConfig = { -// prefix?: string; -// // TODO Refactor when we have a controller registry -// only?: string[]; -// except?: string[]; -// config: T; -// }; - -// interface Route { -// method: string; -// path: string; -// } -// interface Router { -// prefix: string; -// routes: Route[]; -// } - -// export declare function createCoreRouter( -// uid: T, -// cfg?: RouterConfig = {} -// ): () => Router; +export declare function createCoreRouter( + uid: T, + cfg?: CoreApi.Router.RouterConfig +): () => CoreApi.Router.Router; export declare function createCoreController< T extends Common.UID.ContentType, @@ -52,31 +15,7 @@ export declare function createCoreController< config?: WithStrapiCallback | S ): () => Required>; -// export declare function createCoreService< -// T extends Common.UID.ContentType, -// S extends Partial> -// >(uid: T, config?: WithStrapiCallback | S): () => Required>; - -// type GetBaseSchemaController = IsCollectionType< -// T, -// CollectionTypeController, -// SingleTypeController -// > & -// GenericController; - -// type GetBaseSchemaService = IsCollectionType< -// T, -// CollectionTypeService, -// SingleTypeService -// > & -// GenericService; - -// type GetBaseConfig = IsCollectionType< -// T, -// CollectionTypeRouterConfig, -// SingleTypeRouterConfig -// >; - -// type IsCollectionType = T extends Strapi.CollectionTypeUIDs -// ? Y -// : N; +export declare function createCoreService< + T extends Common.UID.ContentType, + S extends Partial> +>(uid: T, config?: WithStrapiCallback | S): () => Required>; diff --git a/packages/core/strapi/lib/types/core-api/controller.d.ts b/packages/core/strapi/lib/types/core-api/controller.d.ts index 34775a28ba..ac24efb373 100644 --- a/packages/core/strapi/lib/types/core-api/controller.d.ts +++ b/packages/core/strapi/lib/types/core-api/controller.d.ts @@ -1,4 +1,4 @@ -import type { Common, Schema, Shared } from '@strapi/strapi'; +import type { Common, CoreApi, Utils } from '@strapi/strapi'; import type { ExtendableContext } from 'koa'; /** @@ -41,17 +41,10 @@ export type SingleType = Base & { delete?: Common.ControllerHandler; }; -export type ContentType = - // Checks that the content type exists in the shared registry - Shared.ContentTypes[T] extends infer S extends Schema.Schema - ? S extends Schema.CollectionType - ? CollectionType - : S extends Schema.SingleType - ? SingleType - : // This should never happen. It would mean a schema (other than collection type - // or a single type has been registered to the shared content-type registry) - never - : // If it doesn't exist, return a base controller - Base; +export type ContentType = Utils.Expression.IfElse< + Common.UID.IsCollectionType, + CollectionType, + SingleType +>; export type Extendable = ContentType & Generic; diff --git a/packages/core/strapi/lib/types/core-api/index.d.ts b/packages/core/strapi/lib/types/core-api/index.d.ts index 8213cb2aee..4f187f3307 100644 --- a/packages/core/strapi/lib/types/core-api/index.d.ts +++ b/packages/core/strapi/lib/types/core-api/index.d.ts @@ -1 +1,4 @@ export * as Controller from './controller'; +export * as Service from './service'; +export * as Router from './router'; +export * as Utils from './utils'; diff --git a/packages/core/strapi/lib/types/core-api/router.d.ts b/packages/core/strapi/lib/types/core-api/router.d.ts new file mode 100644 index 0000000000..89de7777d0 --- /dev/null +++ b/packages/core/strapi/lib/types/core-api/router.d.ts @@ -0,0 +1,63 @@ +import type { Common, Strapi, Utils } from '@strapi/strapi'; + +import { ExtendableContext } from 'koa'; +import { Middleware as KoaMiddleware } from 'koa'; + +export type MiddlewareFactory = (config: any, ctx: { strapi: Strapi }) => Middleware | null; + +export type Middleware = KoaMiddleware | MiddlewareFactory; + +export interface PolicyContext extends ExtendableContext { + type: string; +} + +export type PolicyImplementation = ( + ctx: PolicyContext, + cfg: T, + { strapi }: { strapi: Strapi } +) => boolean | undefined; + +type HandlerConfig = { + auth?: false | { scope: string[] }; + policies?: Array; + middlewares?: Array; +}; + +export type Generic = { + [method: string | number | symbol]: HandlerConfig; +}; + +export type SingleTypeRouterConfig = Generic & { + find?: HandlerConfig; + update?: HandlerConfig; + delete?: HandlerConfig; +}; + +export type CollectionTypeRouterConfig = Generic & { + find?: HandlerConfig; + findOne?: HandlerConfig; + create?: HandlerConfig; + update?: HandlerConfig; + delete?: HandlerConfig; +}; + +export type RouterConfig = { + prefix?: string; + // TODO Refactor when we have a controller registry + only?: string[]; + except?: string[]; + config: Utils.Expression.IfElse< + Common.UID.IsCollectionType, + CollectionTypeRouterConfig, + SingleTypeRouterConfig + >; +}; + +export type Route = { + method: string; + path: string; +}; +export type Router = { + prefix: string; + routes: Route[]; +}; diff --git a/packages/core/strapi/lib/types/core-api/service.d.ts b/packages/core/strapi/lib/types/core-api/service.d.ts new file mode 100644 index 0000000000..33844b26c7 --- /dev/null +++ b/packages/core/strapi/lib/types/core-api/service.d.ts @@ -0,0 +1,46 @@ +import type { Common, Utils } from '@strapi/strapi'; + +// TODO Use actual entities instead of regular object +type Entity = object; + +/** + * Base Core-API service type + */ +export interface Base { + getFetchParams?(params: object): object; +} + +/** + * Generic service structure + */ +export type Generic = { + [method: string | number | symbol]: (...args: any) => any; +}; + +/** + * Core-API collection type service + */ +export type CollectionType = Base & { + find?(params: object): Promise | Entity; + findOne?(entityId: string, params: object): Promise | Entity; + create?(params: object): Promise | Entity; + update?(entityId: string, params: object): Promise | Entity; + delete?(entityId: string, params: object): Promise | Entity; +}; + +/** + * Core-API single type service + */ +export type SingleType = Base & { + find?(params: object): Promise | Entity; + createOrUpdate?(params: object): Promise | Entity; + delete?(params: object): Promise | Entity; +}; + +export type ContentType = Utils.Expression.IfElse< + Common.UID.IsCollectionType, + CollectionType, + SingleType +>; + +export type Extendable = ContentType & Generic; diff --git a/packages/core/strapi/lib/types/core/common/service.d.ts b/packages/core/strapi/lib/types/core/common/service.d.ts deleted file mode 100644 index 88cc9a9a5a..0000000000 --- a/packages/core/strapi/lib/types/core/common/service.d.ts +++ /dev/null @@ -1 +0,0 @@ -export type Service = Record; diff --git a/packages/core/strapi/lib/types/core/common/uid.d.ts b/packages/core/strapi/lib/types/core/common/uid.ts similarity index 80% rename from packages/core/strapi/lib/types/core/common/uid.d.ts rename to packages/core/strapi/lib/types/core/common/uid.ts index 35b008b0d3..ead25ac556 100644 --- a/packages/core/strapi/lib/types/core/common/uid.d.ts +++ b/packages/core/strapi/lib/types/core/common/uid.ts @@ -40,3 +40,13 @@ export type Schema = Registry.Keys< Common.Schemas, UID.ContentType | UID.Component >; + +export type IsCollectionType = Utils.Expression.Extends< + Shared.ContentTypes[TContentTypeUID], + SchemaNamespace.CollectionType +>; + +export type IsSingleType = Utils.Expression.Extends< + Shared.ContentTypes[TContentTypeUID], + SchemaNamespace.SingleType +>; diff --git a/packages/core/strapi/lib/types/utils/expression.d.ts b/packages/core/strapi/lib/types/utils/expression.d.ts new file mode 100644 index 0000000000..3ddd1d6f76 --- /dev/null +++ b/packages/core/strapi/lib/types/utils/expression.d.ts @@ -0,0 +1,15 @@ +export type True = true; +export type False = false; +export type TBooleanExpression = True | False; + +export type Extends = [TLeft] extends [TRight] ? True : False; + +export type If = TExpression extends True + ? TOnTrue + : never; + +export type IfElse< + TExpression extends TBooleanExpression, + TOnTrue, + TOnFalse +> = TExpression extends True ? TOnTrue : TOnFalse; diff --git a/packages/core/strapi/lib/types/utils/index.d.ts b/packages/core/strapi/lib/types/utils/index.d.ts index 1c4b8ddb3a..2a636ec0d0 100644 --- a/packages/core/strapi/lib/types/utils/index.d.ts +++ b/packages/core/strapi/lib/types/utils/index.d.ts @@ -3,6 +3,7 @@ export * as Guard from './guard'; export * as Object from './object'; export * as String from './string'; export * as Tuple from './tuple'; +export * as Expression from './expression'; /** * Get the type of a specific key `TKey` in `TValue` From 132ecc5b69c955cd84a0ef80660a13957b82447e Mon Sep 17 00:00:00 2001 From: Convly Date: Wed, 7 Jun 2023 09:54:45 +0200 Subject: [PATCH 110/172] Add more expression types --- .../{controller.d.ts => controller.ts} | 10 +++--- .../strapi/lib/types/core-api/router.d.ts | 2 +- .../strapi/lib/types/core-api/service.d.ts | 2 +- .../core/strapi/lib/types/utils/array.d.ts | 21 +++++++++++-- .../strapi/lib/types/utils/expression.d.ts | 15 --------- .../core/strapi/lib/types/utils/expression.ts | 31 +++++++++++++++++++ 6 files changed, 58 insertions(+), 23 deletions(-) rename packages/core/strapi/lib/types/core-api/{controller.d.ts => controller.ts} (87%) delete mode 100644 packages/core/strapi/lib/types/utils/expression.d.ts create mode 100644 packages/core/strapi/lib/types/utils/expression.ts diff --git a/packages/core/strapi/lib/types/core-api/controller.d.ts b/packages/core/strapi/lib/types/core-api/controller.ts similarity index 87% rename from packages/core/strapi/lib/types/core-api/controller.d.ts rename to packages/core/strapi/lib/types/core-api/controller.ts index ac24efb373..302c501107 100644 --- a/packages/core/strapi/lib/types/core-api/controller.d.ts +++ b/packages/core/strapi/lib/types/core-api/controller.ts @@ -41,10 +41,12 @@ export type SingleType = Base & { delete?: Common.ControllerHandler; }; -export type ContentType = Utils.Expression.IfElse< - Common.UID.IsCollectionType, - CollectionType, - SingleType +export type ContentType = Utils.Expression.MatchFirst< + [ + Utils.Expression.Test, CollectionType>, + Utils.Expression.Test, SingleType> + ], + Base >; export type Extendable = ContentType & Generic; diff --git a/packages/core/strapi/lib/types/core-api/router.d.ts b/packages/core/strapi/lib/types/core-api/router.d.ts index 89de7777d0..b8f51b3a38 100644 --- a/packages/core/strapi/lib/types/core-api/router.d.ts +++ b/packages/core/strapi/lib/types/core-api/router.d.ts @@ -46,7 +46,7 @@ export type RouterConfig = { // TODO Refactor when we have a controller registry only?: string[]; except?: string[]; - config: Utils.Expression.IfElse< + config: Utils.Expression.If< Common.UID.IsCollectionType, CollectionTypeRouterConfig, SingleTypeRouterConfig diff --git a/packages/core/strapi/lib/types/core-api/service.d.ts b/packages/core/strapi/lib/types/core-api/service.d.ts index 33844b26c7..7bb2fc2082 100644 --- a/packages/core/strapi/lib/types/core-api/service.d.ts +++ b/packages/core/strapi/lib/types/core-api/service.d.ts @@ -37,7 +37,7 @@ export type SingleType = Base & { delete?(params: object): Promise | Entity; }; -export type ContentType = Utils.Expression.IfElse< +export type ContentType = Utils.Expression.If< Common.UID.IsCollectionType, CollectionType, SingleType diff --git a/packages/core/strapi/lib/types/utils/array.d.ts b/packages/core/strapi/lib/types/utils/array.d.ts index 9f8efbd602..6dfa04adbb 100644 --- a/packages/core/strapi/lib/types/utils/array.d.ts +++ b/packages/core/strapi/lib/types/utils/array.d.ts @@ -1,8 +1,25 @@ +import type { Utils } from '@strapi/strapi'; + /** - * * Extract the array values into an union type - * **/ export type Values> = TCollection extends Array ? TValues : never; + +/** + * Checks if the size of the given collection equals 0 + */ +export type IsEmpty> = Utils.Expression.Extends< + TCollection['length'], + 0 +>; + +/** + * Checks if the size of the given collection is not 0 + * + * Returns a {@link Utils.Expression.Boolean} expression + */ +export type IsNotEmpty> = Utils.Expression.Not< + IsEmpty +>; diff --git a/packages/core/strapi/lib/types/utils/expression.d.ts b/packages/core/strapi/lib/types/utils/expression.d.ts deleted file mode 100644 index 3ddd1d6f76..0000000000 --- a/packages/core/strapi/lib/types/utils/expression.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -export type True = true; -export type False = false; -export type TBooleanExpression = True | False; - -export type Extends = [TLeft] extends [TRight] ? True : False; - -export type If = TExpression extends True - ? TOnTrue - : never; - -export type IfElse< - TExpression extends TBooleanExpression, - TOnTrue, - TOnFalse -> = TExpression extends True ? TOnTrue : TOnFalse; diff --git a/packages/core/strapi/lib/types/utils/expression.ts b/packages/core/strapi/lib/types/utils/expression.ts new file mode 100644 index 0000000000..8b92a807bb --- /dev/null +++ b/packages/core/strapi/lib/types/utils/expression.ts @@ -0,0 +1,31 @@ +import type { Utils } from '@strapi/strapi'; + +export type True = true; +export type False = false; +export type BooleanValue = True | False; + +export type Extends = [TLeft] extends [TRight] ? True : False; + +export type Not = If; + +export type If = [TExpression] extends [True] + ? TOnTrue + : TOnFalse; + +export type MatchFirst = TTests extends [ + infer THead extends Test, + ...infer TTail extends Test[] +] + ? THead extends Test + ? If< + TExpression, + TValue, + If, MatchFirst, TDefault> + > + : never + : never; + +export type Test = [ + TExpression, + TValue +]; From b85963f549dd7a9fcac939a4f9ab313f95c381c3 Mon Sep 17 00:00:00 2001 From: Christian Capeans Date: Wed, 7 Jun 2023 11:15:27 +0200 Subject: [PATCH 111/172] Update types with new Utils --- .../types/core-api/{controller.ts => controller.d.ts} | 0 packages/core/strapi/lib/types/core-api/router.d.ts | 10 ++++++---- packages/core/strapi/lib/types/core-api/service.d.ts | 10 ++++++---- .../lib/types/utils/{expression.ts => expression.d.ts} | 0 4 files changed, 12 insertions(+), 8 deletions(-) rename packages/core/strapi/lib/types/core-api/{controller.ts => controller.d.ts} (100%) rename packages/core/strapi/lib/types/utils/{expression.ts => expression.d.ts} (100%) diff --git a/packages/core/strapi/lib/types/core-api/controller.ts b/packages/core/strapi/lib/types/core-api/controller.d.ts similarity index 100% rename from packages/core/strapi/lib/types/core-api/controller.ts rename to packages/core/strapi/lib/types/core-api/controller.d.ts diff --git a/packages/core/strapi/lib/types/core-api/router.d.ts b/packages/core/strapi/lib/types/core-api/router.d.ts index b8f51b3a38..2a5a1c7f1b 100644 --- a/packages/core/strapi/lib/types/core-api/router.d.ts +++ b/packages/core/strapi/lib/types/core-api/router.d.ts @@ -46,10 +46,12 @@ export type RouterConfig = { // TODO Refactor when we have a controller registry only?: string[]; except?: string[]; - config: Utils.Expression.If< - Common.UID.IsCollectionType, - CollectionTypeRouterConfig, - SingleTypeRouterConfig + config: Utils.Expression.MatchFirst< + [ + Utils.Expression.Test, CollectionTypeRouterConfig>, + Utils.Expression.Test, SingleTypeRouterConfig> + ], + Generic >; }; diff --git a/packages/core/strapi/lib/types/core-api/service.d.ts b/packages/core/strapi/lib/types/core-api/service.d.ts index 7bb2fc2082..08637c02af 100644 --- a/packages/core/strapi/lib/types/core-api/service.d.ts +++ b/packages/core/strapi/lib/types/core-api/service.d.ts @@ -37,10 +37,12 @@ export type SingleType = Base & { delete?(params: object): Promise | Entity; }; -export type ContentType = Utils.Expression.If< - Common.UID.IsCollectionType, - CollectionType, - SingleType +export type ContentType = Utils.Expression.MatchFirst< + [ + Utils.Expression.Test, CollectionType>, + Utils.Expression.Test, SingleType> + ], + Base >; export type Extendable = ContentType & Generic; diff --git a/packages/core/strapi/lib/types/utils/expression.ts b/packages/core/strapi/lib/types/utils/expression.d.ts similarity index 100% rename from packages/core/strapi/lib/types/utils/expression.ts rename to packages/core/strapi/lib/types/utils/expression.d.ts From 8a5ac95d47e546bab085e177a4fd89b0082486f6 Mon Sep 17 00:00:00 2001 From: Christian Capeans Date: Wed, 7 Jun 2023 11:17:16 +0200 Subject: [PATCH 112/172] Rename uid file --- packages/core/strapi/lib/types/core/common/{uid.ts => uid.d.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename packages/core/strapi/lib/types/core/common/{uid.ts => uid.d.ts} (100%) diff --git a/packages/core/strapi/lib/types/core/common/uid.ts b/packages/core/strapi/lib/types/core/common/uid.d.ts similarity index 100% rename from packages/core/strapi/lib/types/core/common/uid.ts rename to packages/core/strapi/lib/types/core/common/uid.d.ts From 9bb046f3daba375ce91fe0a29a248b9f60732a12 Mon Sep 17 00:00:00 2001 From: Christian Capeans Date: Wed, 7 Jun 2023 11:19:25 +0200 Subject: [PATCH 113/172] Remove unexisting import --- packages/core/strapi/lib/types/core-api/index.d.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/core/strapi/lib/types/core-api/index.d.ts b/packages/core/strapi/lib/types/core-api/index.d.ts index 4f187f3307..5c5204e7bd 100644 --- a/packages/core/strapi/lib/types/core-api/index.d.ts +++ b/packages/core/strapi/lib/types/core-api/index.d.ts @@ -1,4 +1,3 @@ export * as Controller from './controller'; export * as Service from './service'; export * as Router from './router'; -export * as Utils from './utils'; From 98baf796ff8fd07868708ae46966c713d9b91e5f Mon Sep 17 00:00:00 2001 From: Christian Capeans Date: Wed, 7 Jun 2023 11:44:29 +0200 Subject: [PATCH 114/172] Fix controllerhandler --- .../strapi/lib/types/core-api/controller.d.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/core/strapi/lib/types/core-api/controller.d.ts b/packages/core/strapi/lib/types/core-api/controller.d.ts index 302c501107..ae39d81553 100644 --- a/packages/core/strapi/lib/types/core-api/controller.d.ts +++ b/packages/core/strapi/lib/types/core-api/controller.d.ts @@ -18,27 +18,27 @@ export interface Base { * Generic controller structure */ export type Generic = { - [name: string]: Common.ControllerHandler; + [name: string]: Common.ControllerHandler; }; /** * Core-API collection type controller */ export type CollectionType = Base & { - find?: Common.ControllerHandler; - findOne?: Common.ControllerHandler; - create?: Common.ControllerHandler; - update?: Common.ControllerHandler; - delete?: Common.ControllerHandler; + find?: Common.ControllerHandler; + findOne?: Common.ControllerHandler; + create?: Common.ControllerHandler; + update?: Common.ControllerHandler; + delete?: Common.ControllerHandler; }; /** * Core-API single type controller */ export type SingleType = Base & { - find?: Common.ControllerHandler; - update?: Common.ControllerHandler; - delete?: Common.ControllerHandler; + find?: Common.ControllerHandler; + update?: Common.ControllerHandler; + delete?: Common.ControllerHandler; }; export type ContentType = Utils.Expression.MatchFirst< From 02965879f39af3d530c6e1c52ec0f4f43a80bdd3 Mon Sep 17 00:00:00 2001 From: Christian Date: Wed, 7 Jun 2023 16:46:13 +0200 Subject: [PATCH 115/172] Update packages/core/strapi/lib/types/core-api/router.d.ts Co-authored-by: Ben Irvin --- packages/core/strapi/lib/types/core-api/router.d.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/core/strapi/lib/types/core-api/router.d.ts b/packages/core/strapi/lib/types/core-api/router.d.ts index 2a5a1c7f1b..b0ea297e90 100644 --- a/packages/core/strapi/lib/types/core-api/router.d.ts +++ b/packages/core/strapi/lib/types/core-api/router.d.ts @@ -41,15 +41,15 @@ export type CollectionTypeRouterConfig = Generic & { delete?: HandlerConfig; }; -export type RouterConfig = { +export type RouterConfig = { prefix?: string; // TODO Refactor when we have a controller registry only?: string[]; except?: string[]; config: Utils.Expression.MatchFirst< [ - Utils.Expression.Test, CollectionTypeRouterConfig>, - Utils.Expression.Test, SingleTypeRouterConfig> + Utils.Expression.Test, CollectionTypeRouterConfig>, + Utils.Expression.Test, SingleTypeRouterConfig> ], Generic >; From e903193ff0d64c18de92599627dc2eda5b03184f Mon Sep 17 00:00:00 2001 From: Christian Date: Wed, 7 Jun 2023 16:46:23 +0200 Subject: [PATCH 116/172] Update packages/core/strapi/lib/types/core-api/router.d.ts Co-authored-by: Ben Irvin --- packages/core/strapi/lib/types/core-api/router.d.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/strapi/lib/types/core-api/router.d.ts b/packages/core/strapi/lib/types/core-api/router.d.ts index b0ea297e90..981da0e12e 100644 --- a/packages/core/strapi/lib/types/core-api/router.d.ts +++ b/packages/core/strapi/lib/types/core-api/router.d.ts @@ -11,9 +11,9 @@ export interface PolicyContext extends ExtendableContext { type: string; } -export type PolicyImplementation = ( +export type PolicyImplementation = ( ctx: PolicyContext, - cfg: T, + cfg: TCfg, { strapi }: { strapi: Strapi } ) => boolean | undefined; From 4211eca6f354fe7913d25bd3b4cbb0d5c9bb6420 Mon Sep 17 00:00:00 2001 From: Christian Date: Wed, 7 Jun 2023 16:46:31 +0200 Subject: [PATCH 117/172] Update packages/core/strapi/lib/types/core-api/service.d.ts Co-authored-by: Ben Irvin --- packages/core/strapi/lib/types/core-api/service.d.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/core/strapi/lib/types/core-api/service.d.ts b/packages/core/strapi/lib/types/core-api/service.d.ts index 08637c02af..d71236939b 100644 --- a/packages/core/strapi/lib/types/core-api/service.d.ts +++ b/packages/core/strapi/lib/types/core-api/service.d.ts @@ -37,10 +37,10 @@ export type SingleType = Base & { delete?(params: object): Promise | Entity; }; -export type ContentType = Utils.Expression.MatchFirst< +export type ContentType = Utils.Expression.MatchFirst< [ - Utils.Expression.Test, CollectionType>, - Utils.Expression.Test, SingleType> + Utils.Expression.Test, CollectionType>, + Utils.Expression.Test, SingleType> ], Base >; From 4500d4cb7381bbf4ed26634c9a3381067839602e Mon Sep 17 00:00:00 2001 From: Christian Date: Wed, 7 Jun 2023 16:46:41 +0200 Subject: [PATCH 118/172] Update packages/core/strapi/lib/types/core/strapi/index.d.ts Co-authored-by: Ben Irvin --- packages/core/strapi/lib/types/core/strapi/index.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/strapi/lib/types/core/strapi/index.d.ts b/packages/core/strapi/lib/types/core/strapi/index.d.ts index 7976750210..33856e2f2a 100644 --- a/packages/core/strapi/lib/types/core/strapi/index.d.ts +++ b/packages/core/strapi/lib/types/core/strapi/index.d.ts @@ -82,7 +82,7 @@ export interface Strapi { /** * Find a controller using its unique identifier */ - controller(uid: T): Shared.Controllers[T]; + controller(uid: TContentTypeUID): Shared.Controllers[TContentTypeUID]; /** * Getter for the Strapi content types container From 86128b9e129f30f5d0d73e7088fe8f5abb4e5934 Mon Sep 17 00:00:00 2001 From: Christian Date: Wed, 7 Jun 2023 16:46:49 +0200 Subject: [PATCH 119/172] Update packages/core/strapi/lib/types/core-api/service.d.ts Co-authored-by: Ben Irvin --- packages/core/strapi/lib/types/core-api/service.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/strapi/lib/types/core-api/service.d.ts b/packages/core/strapi/lib/types/core-api/service.d.ts index d71236939b..ed79e22c84 100644 --- a/packages/core/strapi/lib/types/core-api/service.d.ts +++ b/packages/core/strapi/lib/types/core-api/service.d.ts @@ -45,4 +45,4 @@ export type ContentType = Utils. Base >; -export type Extendable = ContentType & Generic; +export type Extendable = ContentType & Generic; From 566a0f74ba597d75e0f5cbcd59d94b4094669be1 Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Thu, 8 Jun 2023 10:09:48 +0200 Subject: [PATCH 120/172] test: populate edge case --- .../utils/__tests__/query-populate.test.js | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/packages/core/content-manager/server/services/utils/__tests__/query-populate.test.js b/packages/core/content-manager/server/services/utils/__tests__/query-populate.test.js index efa2c9ae14..66de9eb7e4 100644 --- a/packages/core/content-manager/server/services/utils/__tests__/query-populate.test.js +++ b/packages/core/content-manager/server/services/utils/__tests__/query-populate.test.js @@ -35,6 +35,12 @@ describe('Populate', () => { relation: 'oneToMany', target: 'api::model.model', }, + // Edge case: an attribute named "populate" should be populated + populate: { + type: 'relation', + relation: 'oneToMany', + target: 'api::model.model', + }, component: { type: 'component', component: 'component', @@ -97,6 +103,20 @@ describe('Populate', () => { }); }); + test('one relational field named populate should be populated', async () => { + const query = getFilterQuery([{ populate: { populate: { field: 'value' } } }]); + const result = await getQueryPopulate(uid, query); + + // Populate train! Choo choo! + expect(result).toEqual({ + populate: { + populate: { + populate: {}, + }, + }, + }); + }); + test('relation in component should be populated', async () => { const query = getFilterQuery([{ component: { compoRelation: { field: 'value' } } }]); const result = await getQueryPopulate(uid, query); From af61b69c3e94cb8291d4dbc59c91ba198069544e Mon Sep 17 00:00:00 2001 From: Christian Capeans Date: Thu, 8 Jun 2023 11:53:12 +0200 Subject: [PATCH 121/172] Replace types for interfaces where needed --- packages/core/strapi/lib/types/core-api/controller.d.ts | 8 ++++---- packages/core/strapi/lib/types/core-api/router.d.ts | 8 ++++---- packages/core/strapi/lib/types/core-api/service.d.ts | 8 ++++---- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/core/strapi/lib/types/core-api/controller.d.ts b/packages/core/strapi/lib/types/core-api/controller.d.ts index ae39d81553..a07a73170f 100644 --- a/packages/core/strapi/lib/types/core-api/controller.d.ts +++ b/packages/core/strapi/lib/types/core-api/controller.d.ts @@ -24,22 +24,22 @@ export type Generic = { /** * Core-API collection type controller */ -export type CollectionType = Base & { +export interface CollectionType extends Base { find?: Common.ControllerHandler; findOne?: Common.ControllerHandler; create?: Common.ControllerHandler; update?: Common.ControllerHandler; delete?: Common.ControllerHandler; -}; +} /** * Core-API single type controller */ -export type SingleType = Base & { +export interface SingleType extends Base { find?: Common.ControllerHandler; update?: Common.ControllerHandler; delete?: Common.ControllerHandler; -}; +} export type ContentType = Utils.Expression.MatchFirst< [ diff --git a/packages/core/strapi/lib/types/core-api/router.d.ts b/packages/core/strapi/lib/types/core-api/router.d.ts index 2a5a1c7f1b..7cd28f9b8e 100644 --- a/packages/core/strapi/lib/types/core-api/router.d.ts +++ b/packages/core/strapi/lib/types/core-api/router.d.ts @@ -27,19 +27,19 @@ export type Generic = { [method: string | number | symbol]: HandlerConfig; }; -export type SingleTypeRouterConfig = Generic & { +export interface SingleTypeRouterConfig extends Generic { find?: HandlerConfig; update?: HandlerConfig; delete?: HandlerConfig; -}; +} -export type CollectionTypeRouterConfig = Generic & { +export interface CollectionTypeRouterConfig extends Generic { find?: HandlerConfig; findOne?: HandlerConfig; create?: HandlerConfig; update?: HandlerConfig; delete?: HandlerConfig; -}; +} export type RouterConfig = { prefix?: string; diff --git a/packages/core/strapi/lib/types/core-api/service.d.ts b/packages/core/strapi/lib/types/core-api/service.d.ts index 08637c02af..146143ce16 100644 --- a/packages/core/strapi/lib/types/core-api/service.d.ts +++ b/packages/core/strapi/lib/types/core-api/service.d.ts @@ -20,22 +20,22 @@ export type Generic = { /** * Core-API collection type service */ -export type CollectionType = Base & { +export interface CollectionType extends Base { find?(params: object): Promise | Entity; findOne?(entityId: string, params: object): Promise | Entity; create?(params: object): Promise | Entity; update?(entityId: string, params: object): Promise | Entity; delete?(entityId: string, params: object): Promise | Entity; -}; +} /** * Core-API single type service */ -export type SingleType = Base & { +export interface SingleType extends Base { find?(params: object): Promise | Entity; createOrUpdate?(params: object): Promise | Entity; delete?(params: object): Promise | Entity; -}; +} export type ContentType = Utils.Expression.MatchFirst< [ From 6494068ba1c709e880fb9eba69d030cee5f2eae0 Mon Sep 17 00:00:00 2001 From: Christian Date: Thu, 8 Jun 2023 12:02:20 +0200 Subject: [PATCH 122/172] Update packages/core/strapi/lib/types/core-api/controller.d.ts Co-authored-by: Ben Irvin --- packages/core/strapi/lib/types/core-api/controller.d.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/core/strapi/lib/types/core-api/controller.d.ts b/packages/core/strapi/lib/types/core-api/controller.d.ts index a07a73170f..1687486095 100644 --- a/packages/core/strapi/lib/types/core-api/controller.d.ts +++ b/packages/core/strapi/lib/types/core-api/controller.d.ts @@ -8,10 +8,10 @@ import type { ExtendableContext } from 'koa'; */ export interface Base { // TODO: Use actual entities instead of regular object - transformResponse(data: U, meta: object): P; - sanitizeOutput(data: U, ctx: ExtendableContext): Promise; - sanitizeInput(data: U, ctx: ExtendableContext): Promise; - sanitizeQuery(data: U, ctx: ExtendableContext): Promise; + transformResponse(data: TData, meta: object): TResponse; + sanitizeOutput(data: TData, ctx: ExtendableContext): Promise; + sanitizeInput(data: TData, ctx: ExtendableContext): Promise; + sanitizeQuery(data: TData, ctx: ExtendableContext): Promise; } /** From 0f15960636fa26c723e6ef7a3e1e9696c20dcc5d Mon Sep 17 00:00:00 2001 From: Jamie Howard Date: Thu, 8 Jun 2023 12:39:52 +0100 Subject: [PATCH 123/172] feature(ee): emit workflow stage change webhook event --- .../admin/ee/server/constants/webhookEvents.js | 5 +++++ .../review-workflows/entity-service-decorator.js | 14 +++++++++++++- .../services/review-workflows/review-workflows.js | 5 ++++- 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 packages/core/admin/ee/server/constants/webhookEvents.js diff --git a/packages/core/admin/ee/server/constants/webhookEvents.js b/packages/core/admin/ee/server/constants/webhookEvents.js new file mode 100644 index 0000000000..69e2acd231 --- /dev/null +++ b/packages/core/admin/ee/server/constants/webhookEvents.js @@ -0,0 +1,5 @@ +'use strict'; + +module.exports = { + WORKFLOW_UPDATE_STAGE: 'workflow.updateEntryStage', +}; diff --git a/packages/core/admin/ee/server/services/review-workflows/entity-service-decorator.js b/packages/core/admin/ee/server/services/review-workflows/entity-service-decorator.js index 3fd52fe4e1..660cdaf760 100644 --- a/packages/core/admin/ee/server/services/review-workflows/entity-service-decorator.js +++ b/packages/core/admin/ee/server/services/review-workflows/entity-service-decorator.js @@ -2,6 +2,7 @@ const { isNil, isNull } = require('lodash/fp'); const { ENTITY_STAGE_ATTRIBUTE } = require('../../constants/workflows'); +const { WORKFLOW_UPDATE_STAGE } = require('../../constants/webhookEvents'); const { hasReviewWorkflow, getDefaultWorkflow } = require('../../utils/review-workflows'); /** @@ -45,7 +46,18 @@ const decorator = (service) => ({ delete data[ENTITY_STAGE_ATTRIBUTE]; } - return service.update.call(this, uid, entityId, { ...opts, data }); + const entity = await service.findOne.call(this, uid, entityId, { + populate: [ENTITY_STAGE_ATTRIBUTE], + }); + const previousStageId = entity?.[ENTITY_STAGE_ATTRIBUTE]?.id ?? null; + + const updatedEntity = await service.update.call(this, uid, entityId, { ...opts, data }); + + if (previousStageId && previousStageId !== data[ENTITY_STAGE_ATTRIBUTE]) { + await service.emitEvent.call(this, uid, WORKFLOW_UPDATE_STAGE, updatedEntity); + } + + return updatedEntity; }, }); diff --git a/packages/core/admin/ee/server/services/review-workflows/review-workflows.js b/packages/core/admin/ee/server/services/review-workflows/review-workflows.js index 15b1913e5f..7a6304bfb5 100644 --- a/packages/core/admin/ee/server/services/review-workflows/review-workflows.js +++ b/packages/core/admin/ee/server/services/review-workflows/review-workflows.js @@ -11,6 +11,7 @@ const { ENTITY_STAGE_ATTRIBUTE } = require('../../constants/workflows'); const { getDefaultWorkflow } = require('../../utils/review-workflows'); const { persistTables, removePersistedTablesWithSuffix } = require('../../utils/persisted-tables'); +const webhookEvents = require('../../constants/webhookEvents'); async function initDefaultWorkflow({ workflowsService, stagesService, strapi }) { const wfCount = await workflowsService.count(); @@ -109,7 +110,9 @@ function persistStagesJoinTables({ strapi }) { } const registerWebhookEvents = async ({ strapi }) => - strapi.webhookStore.addAllowedEvent('WORKFLOW_UPDATE_STAGE', 'workflow.updateEntryStage'); + Object.entries(webhookEvents).forEach(([eventKey, event]) => + strapi.webhookStore.addAllowedEvent(eventKey, event) + ); module.exports = ({ strapi }) => { const workflowsService = getService('workflows', { strapi }); From ccde1a44668b405e45cdb315f65c2050b28bccf7 Mon Sep 17 00:00:00 2001 From: Jamie Howard Date: Thu, 8 Jun 2023 15:34:25 +0100 Subject: [PATCH 124/172] feature(ee): add review workflow stage change event to webhook form --- .../components/EventTable/EventTableEE.js | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/Webhooks/EditView/components/EventTable/EventTableEE.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/Webhooks/EditView/components/EventTable/EventTableEE.js index e569b218db..40b27fa90f 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/Webhooks/EditView/components/EventTable/EventTableEE.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/Webhooks/EditView/components/EventTable/EventTableEE.js @@ -2,22 +2,21 @@ import React from 'react'; import EventTable from '../../../../../../../../../admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/Events'; -// const events = { -// 'review-workflows': ['workflows.updateEntryStage'], -// }; +const events = { + 'review-workflows': ['review-workflows.updateEntryStage'], +}; -// TODO: extend this to support review workflow events once the BE logic is ready -// const getHeaders = () => { -// return [{ id: 'review-workflows.updateEntryStage', defaultMessage: 'Stage Change' }]; -// }; +const getHeaders = () => { + return [{ id: 'review-workflows.updateEntryStage', defaultMessage: 'Stage Change' }]; +}; export function EventTableEE() { return ( - {/* - */} + + ); } From 78e6952af9d2d3f8913e905a56b29795d84e1d50 Mon Sep 17 00:00:00 2001 From: Convly Date: Fri, 9 Jun 2023 09:57:21 +0200 Subject: [PATCH 125/172] Fix relation attribute type, add back relation and target properties --- .../core/strapi/lib/types/core/attributes/relation.d.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/core/strapi/lib/types/core/attributes/relation.d.ts b/packages/core/strapi/lib/types/core/attributes/relation.d.ts index 79f5d5d39d..3304d9f276 100644 --- a/packages/core/strapi/lib/types/core/attributes/relation.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/relation.d.ts @@ -7,6 +7,10 @@ export type BasicRelationType = | 'manyToMany' | 'morphOne' | 'morphMany'; +export type BasicMorphRelationType = Extract< + BasicRelationType, + Utils.String.Prefix +>; export type PolymorphicRelationType = 'morphToOne' | 'morphToMany'; export type RelationType = BasicRelationType | PolymorphicRelationType; @@ -17,7 +21,7 @@ export type BasicRelationProperties< > = { relation: TRelationType; target: TTarget; -} & TRelationType extends Utils.String.Suffix<'morph', 'One' | 'Many'> +} & (TRelationType extends BasicMorphRelationType ? { morphBy?: Utils.Object.KeysBy< Common.Schemas[TTarget]['attributes'], @@ -27,7 +31,7 @@ export type BasicRelationProperties< : { inversedBy?: RelationsKeysFromTo; mappedBy?: RelationsKeysFromTo; - }; + }); export interface PolymorphicRelationProperties { relation: TRelationType; From 4726734b521c7f8e2c6c0501477fb371c8e82a19 Mon Sep 17 00:00:00 2001 From: Convly Date: Fri, 9 Jun 2023 10:00:12 +0200 Subject: [PATCH 126/172] Add back the common service type --- packages/core/strapi/lib/types/core/common/service.d.ts | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 packages/core/strapi/lib/types/core/common/service.d.ts diff --git a/packages/core/strapi/lib/types/core/common/service.d.ts b/packages/core/strapi/lib/types/core/common/service.d.ts new file mode 100644 index 0000000000..8bcf454022 --- /dev/null +++ b/packages/core/strapi/lib/types/core/common/service.d.ts @@ -0,0 +1,3 @@ +export type Service = { + [key: keyof any]: unknown; +}; From 0bba0878f4fcb07d560c77cf0cee19768bac5acf Mon Sep 17 00:00:00 2001 From: Jamie Howard Date: Fri, 9 Jun 2023 14:23:57 +0100 Subject: [PATCH 127/172] chore: rename webhook event --- packages/core/admin/ee/server/constants/webhookEvents.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/admin/ee/server/constants/webhookEvents.js b/packages/core/admin/ee/server/constants/webhookEvents.js index 69e2acd231..538a7ec6be 100644 --- a/packages/core/admin/ee/server/constants/webhookEvents.js +++ b/packages/core/admin/ee/server/constants/webhookEvents.js @@ -1,5 +1,5 @@ 'use strict'; module.exports = { - WORKFLOW_UPDATE_STAGE: 'workflow.updateEntryStage', + WORKFLOW_UPDATE_STAGE: 'review-workflows.updateEntryStage', }; From ed5fe3766d15cb1c869fe916731682f57039c39a Mon Sep 17 00:00:00 2001 From: Jamie Howard Date: Fri, 9 Jun 2023 14:25:19 +0100 Subject: [PATCH 128/172] fix(ee): entity service decorator tests --- .../entity-service-decorator.test.js | 19 +++++++++++++++---- .../entity-service-decorator.js | 5 +++-- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/packages/core/admin/ee/server/services/review-workflows/__tests__/entity-service-decorator.test.js b/packages/core/admin/ee/server/services/review-workflows/__tests__/entity-service-decorator.test.js index 1b8d4b2bdf..07445a79ef 100644 --- a/packages/core/admin/ee/server/services/review-workflows/__tests__/entity-service-decorator.test.js +++ b/packages/core/admin/ee/server/services/review-workflows/__tests__/entity-service-decorator.test.js @@ -1,6 +1,7 @@ 'use strict'; const { omit } = require('lodash/fp'); +const { WORKFLOW_UPDATE_STAGE } = require('../../../constants/webhookEvents'); const { decorator } = require('../entity-service-decorator')(); jest.mock('../../../utils'); @@ -80,6 +81,8 @@ describe('Entity service decorator', () => { }); describe('Update', () => { + const uid = 'test-model'; + test('Calls original update for non review workflow content types', async () => { const entry = { id: 1, @@ -105,15 +108,23 @@ describe('Entity service decorator', () => { const defaultService = { update: jest.fn(() => Promise.resolve(entry)), + findOne: jest.fn(() => { + return { strapi_reviewWorkflows_stage: { id: 2 } }; + }), + emitEvent: jest.fn(), }; const service = decorator(defaultService); const id = 1; const input = { data: { title: 'title ', strapi_reviewWorkflows_stage: 1 } }; - await service.update('test-model', id, input); + await service.update(uid, id, input); - expect(defaultService.update).toHaveBeenCalledWith('test-model', id, { + expect(defaultService.emitEvent).toHaveBeenCalledWith(uid, WORKFLOW_UPDATE_STAGE, { + id, + }); + + expect(defaultService.update).toHaveBeenCalledWith(uid, id, { ...input, data: { ...input.data, @@ -135,9 +146,9 @@ describe('Entity service decorator', () => { const id = 1; const input = { data: { title: 'title ', strapi_reviewWorkflows_stage: null } }; - await service.update('test-model', id, input); + await service.update(uid, id, input); - expect(defaultService.update).toHaveBeenCalledWith('test-model', id, { + expect(defaultService.update).toHaveBeenCalledWith(uid, id, { ...input, data: { ...omit('strapi_reviewWorkflows_stage', input.data), diff --git a/packages/core/admin/ee/server/services/review-workflows/entity-service-decorator.js b/packages/core/admin/ee/server/services/review-workflows/entity-service-decorator.js index 660cdaf760..b9fc75366a 100644 --- a/packages/core/admin/ee/server/services/review-workflows/entity-service-decorator.js +++ b/packages/core/admin/ee/server/services/review-workflows/entity-service-decorator.js @@ -44,15 +44,16 @@ const decorator = (service) => ({ const data = { ...opts.data }; if (isNull(data[ENTITY_STAGE_ATTRIBUTE])) { delete data[ENTITY_STAGE_ATTRIBUTE]; + return service.update.call(this, uid, entityId, { ...opts, data }); } + const updatedEntity = await service.update.call(this, uid, entityId, { ...opts, data }); + const entity = await service.findOne.call(this, uid, entityId, { populate: [ENTITY_STAGE_ATTRIBUTE], }); const previousStageId = entity?.[ENTITY_STAGE_ATTRIBUTE]?.id ?? null; - const updatedEntity = await service.update.call(this, uid, entityId, { ...opts, data }); - if (previousStageId && previousStageId !== data[ENTITY_STAGE_ATTRIBUTE]) { await service.emitEvent.call(this, uid, WORKFLOW_UPDATE_STAGE, updatedEntity); } From 9e4bf7f97b381f27e7d25e7da16f63e192db5809 Mon Sep 17 00:00:00 2001 From: Jamie Howard Date: Fri, 9 Jun 2023 14:33:27 +0100 Subject: [PATCH 129/172] fix(ee): update order mistake --- .../services/review-workflows/entity-service-decorator.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/core/admin/ee/server/services/review-workflows/entity-service-decorator.js b/packages/core/admin/ee/server/services/review-workflows/entity-service-decorator.js index b9fc75366a..9b8900246a 100644 --- a/packages/core/admin/ee/server/services/review-workflows/entity-service-decorator.js +++ b/packages/core/admin/ee/server/services/review-workflows/entity-service-decorator.js @@ -47,13 +47,12 @@ const decorator = (service) => ({ return service.update.call(this, uid, entityId, { ...opts, data }); } - const updatedEntity = await service.update.call(this, uid, entityId, { ...opts, data }); - const entity = await service.findOne.call(this, uid, entityId, { populate: [ENTITY_STAGE_ATTRIBUTE], }); const previousStageId = entity?.[ENTITY_STAGE_ATTRIBUTE]?.id ?? null; + const updatedEntity = await service.update.call(this, uid, entityId, { ...opts, data }); if (previousStageId && previousStageId !== data[ENTITY_STAGE_ATTRIBUTE]) { await service.emitEvent.call(this, uid, WORKFLOW_UPDATE_STAGE, updatedEntity); } From f05762e2e86f36384d78deb48ec6244bc14ef987 Mon Sep 17 00:00:00 2001 From: Jamie Howard Date: Fri, 9 Jun 2023 14:41:22 +0100 Subject: [PATCH 130/172] feature(ee): modify webhook payload --- .../review-workflows/entity-service-decorator.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/core/admin/ee/server/services/review-workflows/entity-service-decorator.js b/packages/core/admin/ee/server/services/review-workflows/entity-service-decorator.js index 9b8900246a..640edc984c 100644 --- a/packages/core/admin/ee/server/services/review-workflows/entity-service-decorator.js +++ b/packages/core/admin/ee/server/services/review-workflows/entity-service-decorator.js @@ -54,7 +54,16 @@ const decorator = (service) => ({ const updatedEntity = await service.update.call(this, uid, entityId, { ...opts, data }); if (previousStageId && previousStageId !== data[ENTITY_STAGE_ATTRIBUTE]) { - await service.emitEvent.call(this, uid, WORKFLOW_UPDATE_STAGE, updatedEntity); + const webhookPayload = { + entityId, + workflow: { + stages: { + from: previousStageId, + to: data[ENTITY_STAGE_ATTRIBUTE], + }, + }, + }; + await service.emitEvent.call(this, uid, WORKFLOW_UPDATE_STAGE, webhookPayload); } return updatedEntity; From 47a020ef726eb63b10f5ec2f5537e759c9824c47 Mon Sep 17 00:00:00 2001 From: Jamie Howard Date: Fri, 9 Jun 2023 14:43:28 +0100 Subject: [PATCH 131/172] test(ee) --- .../__tests__/entity-service-decorator.test.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/core/admin/ee/server/services/review-workflows/__tests__/entity-service-decorator.test.js b/packages/core/admin/ee/server/services/review-workflows/__tests__/entity-service-decorator.test.js index 07445a79ef..c73a44fddb 100644 --- a/packages/core/admin/ee/server/services/review-workflows/__tests__/entity-service-decorator.test.js +++ b/packages/core/admin/ee/server/services/review-workflows/__tests__/entity-service-decorator.test.js @@ -121,7 +121,13 @@ describe('Entity service decorator', () => { await service.update(uid, id, input); expect(defaultService.emitEvent).toHaveBeenCalledWith(uid, WORKFLOW_UPDATE_STAGE, { - id, + entityId: 1, + workflow: { + stages: { + from: 2, + to: 1, + }, + }, }); expect(defaultService.update).toHaveBeenCalledWith(uid, id, { From 820da82762e8bd05c37568e74af735116c3c41a3 Mon Sep 17 00:00:00 2001 From: Convly Date: Fri, 9 Jun 2023 16:07:34 +0200 Subject: [PATCH 132/172] Fix relation attribute type (mappedBy and inversedBy), make it compatible with Attribute.Any --- .../data-transfer/types/common-entities.d.ts | 2 +- .../lib/types/core/attributes/base.d.ts | 3 + .../lib/types/core/attributes/common.d.ts | 11 +- .../lib/types/core/attributes/component.d.ts | 12 +- .../lib/types/core/attributes/media.d.ts | 9 +- .../lib/types/core/attributes/relation.d.ts | 141 +++++++++++------- .../strapi/lib/types/utils/expression.d.ts | 4 +- 7 files changed, 117 insertions(+), 65 deletions(-) diff --git a/packages/core/data-transfer/types/common-entities.d.ts b/packages/core/data-transfer/types/common-entities.d.ts index c2cbed0624..772e067eb0 100644 --- a/packages/core/data-transfer/types/common-entities.d.ts +++ b/packages/core/data-transfer/types/common-entities.d.ts @@ -49,7 +49,7 @@ interface IDefaultLink { /** * The relation type */ - relation: Attribute.RelationType; + relation: Attribute.RelationKind.Any; /** * Left side of the link diff --git a/packages/core/strapi/lib/types/core/attributes/base.d.ts b/packages/core/strapi/lib/types/core/attributes/base.d.ts index a53ce51928..71e964fcb9 100644 --- a/packages/core/strapi/lib/types/core/attributes/base.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/base.d.ts @@ -39,6 +39,9 @@ export interface Attribute { pluginOptions?: object; } +/** + * Creates a basic Attribute of type T + */ export type OfType = Attribute; // Common attributes Options diff --git a/packages/core/strapi/lib/types/core/attributes/common.d.ts b/packages/core/strapi/lib/types/core/attributes/common.d.ts index 2b67aa42f7..39ab454cd9 100644 --- a/packages/core/strapi/lib/types/core/attributes/common.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/common.d.ts @@ -2,7 +2,7 @@ * Strapi custom scalar types */ -import type { Attribute, Common } from '@strapi/strapi'; +import { Attribute, Common } from '@strapi/strapi'; /** * Setters for the attributes options @@ -58,7 +58,14 @@ export type Any = | Attribute.JSON | Attribute.Media | Attribute.Password - | Attribute.Relation + | ( + | Attribute.Relation< + Common.UID.Schema, + Attribute.RelationKind.BiDirectional, + Common.UID.Schema + > + | Attribute.Relation + ) | Attribute.RichText | Attribute.String | Attribute.Text diff --git a/packages/core/strapi/lib/types/core/attributes/component.d.ts b/packages/core/strapi/lib/types/core/attributes/component.d.ts index 7c5e6d95c8..8fb759d849 100644 --- a/packages/core/strapi/lib/types/core/attributes/component.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/component.d.ts @@ -1,8 +1,8 @@ -import type { Common, Attribute } from '@strapi/strapi'; +import type { Common, Attribute, Utils } from '@strapi/strapi'; export interface ComponentProperties< TComponentUID extends Common.UID.Component, - TRepeatable extends boolean = false + TRepeatable extends Utils.Expression.BooleanValue = Utils.Expression.False > { component: TComponentUID; repeatable?: TRepeatable; @@ -10,7 +10,7 @@ export interface ComponentProperties< export type Component< TComponentUID extends Common.UID.Component = Common.UID.Component, - TRepeatable extends boolean = false + TRepeatable extends Utils.Expression.BooleanValue = Utils.Expression.False > = Attribute.OfType<'component'> & // Component Properties ComponentProperties & @@ -22,11 +22,9 @@ export type Component< export type ComponentValue< TComponentUID extends Common.UID.Component, - TRepeatable extends boolean + TRepeatable extends Utils.Expression.BooleanValue > = Attribute.GetValues extends infer TValues - ? TRepeatable extends true - ? TValues[] - : TValues + ? Utils.Expression.If : never; export type GetComponentValue = diff --git a/packages/core/strapi/lib/types/core/attributes/media.d.ts b/packages/core/strapi/lib/types/core/attributes/media.d.ts index 09a38a73c1..ee91f22a2d 100644 --- a/packages/core/strapi/lib/types/core/attributes/media.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/media.d.ts @@ -1,10 +1,10 @@ -import type { Attribute } from '@strapi/strapi'; +import type { Attribute, Utils } from '@strapi/strapi'; export type MediaKind = 'images' | 'videos' | 'files' | 'audios'; export interface MediaProperties< TKind extends MediaKind | undefined = undefined, - TMultiple extends boolean = false + TMultiple extends Utils.Expression.BooleanValue = Utils.Expression.False > { allowedTypes?: TKind; multiple?: TMultiple; @@ -12,7 +12,7 @@ export interface MediaProperties< export type Media< TKind extends MediaKind | undefined = undefined, - TMultiple extends boolean = false + TMultiple extends Utils.Expression.BooleanValue = Utils.Expression.False > = Attribute.OfType<'media'> & // Properties MediaProperties & @@ -22,7 +22,8 @@ export type Media< Attribute.PrivateOption; // TODO: Introduce a real type for the media values -export type MediaValue = TMultiple extends true ? any[] : any; +export type MediaValue = + Utils.Expression.If; export type GetMediaValue = TAttribute extends Media< // Unused as long as the media value is any diff --git a/packages/core/strapi/lib/types/core/attributes/relation.d.ts b/packages/core/strapi/lib/types/core/attributes/relation.d.ts index 3304d9f276..2aa8c16382 100644 --- a/packages/core/strapi/lib/types/core/attributes/relation.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/relation.d.ts @@ -1,57 +1,64 @@ import type { Attribute, Common, Utils } from '@strapi/strapi'; -export type BasicRelationType = - | 'oneToOne' - | 'oneToMany' - | 'manyToOne' - | 'manyToMany' - | 'morphOne' - | 'morphMany'; -export type BasicMorphRelationType = Extract< - BasicRelationType, - Utils.String.Prefix ->; -export type PolymorphicRelationType = 'morphToOne' | 'morphToMany'; -export type RelationType = BasicRelationType | PolymorphicRelationType; - -export type BasicRelationProperties< - TOrigin extends Common.UID.Schema, - TRelationType extends BasicRelationType, - TTarget extends Common.UID.Schema -> = { - relation: TRelationType; - target: TTarget; -} & (TRelationType extends BasicMorphRelationType - ? { - morphBy?: Utils.Object.KeysBy< - Common.Schemas[TTarget]['attributes'], - Attribute.Relation - >; - } - : { - inversedBy?: RelationsKeysFromTo; - mappedBy?: RelationsKeysFromTo; - }); - -export interface PolymorphicRelationProperties { - relation: TRelationType; -} - export type Relation< TOrigin extends Common.UID.Schema = Common.UID.Schema, - TRelationType extends RelationType = RelationType, - TTarget extends TRelationType extends PolymorphicRelationType ? never : Common.UID.Schema = never + TRelationKind extends RelationKind.Any = RelationKind.Any, + TTarget extends Common.UID.Schema = never > = Attribute.OfType<'relation'> & // Properties - (TRelationType extends BasicRelationType - ? BasicRelationProperties - : TRelationType extends PolymorphicRelationType - ? PolymorphicRelationProperties - : {}) & + RelationProperties & // Options Attribute.ConfigurableOption & Attribute.PrivateOption; +export type RelationProperties< + TOrigin extends Common.UID.Schema, + TRelationKind extends RelationKind.Any, + TTarget extends Common.UID.Schema +> = Utils.Expression.MatchFirst< + [ + Utils.Expression.Test< + Utils.Expression.Extends, + { + relation: TRelationKind; + target: TTarget; + mappedBy?: Utils.Guard.Never< + Attribute.GetKeysByType< + TTarget, + 'relation', + { target: TOrigin; relation: RelationKind.Reverse } + >, + string + >; + inversedBy?: Utils.Guard.Never< + Attribute.GetKeysByType< + TTarget, + 'relation', + { target: TOrigin; relation: RelationKind.Reverse } + >, + string + >; + } + >, + Utils.Expression.Test< + Utils.Expression.Extends, + { relation: TRelationKind } + >, + Utils.Expression.Test< + Utils.Expression.Extends, + { + relation: TRelationKind; + target: TTarget; + morphBy?: Attribute.GetKeysByType< + TTarget, + 'relation', + { relation: RelationKind.MorphOwner } + >; + } + > + ] +>; + export type RelationsKeysFromTo< TTarget extends Common.UID.Schema, TOrigin extends Common.UID.Schema @@ -63,19 +70,53 @@ export type PickRelationsFromTo< > = Attribute.GetByType; export type RelationPluralityModifier< - TRelationType extends RelationType, + TRelationKind extends RelationKind.Any, TValue -> = TRelationType extends Utils.String.Suffix ? TValue[] : TValue; +> = TRelationKind extends Utils.String.Suffix ? TValue[] : TValue; export type RelationValue< - TRelationType extends RelationType, + TRelationKind extends RelationKind.Any, TTarget extends Common.UID.Schema -> = RelationPluralityModifier>; +> = RelationPluralityModifier>; export type GetRelationValue = TAttribute extends Relation< infer _TOrigin, - infer TRelationType, + infer TRelationKind, infer TTarget > - ? RelationValue + ? RelationValue : never; + +export module RelationKind { + type GetOppositePlurality = { + one: 'one'; + One: 'Many'; + many: 'one'; + Many: 'One'; + }[TPlurality]; + + export type Plurality = 'one' | 'many'; + + export type Left = Lowercase; + export type Right = Capitalize; + + export type MorphOwner = `morphTo${RelationKind.Right}`; + export type MorphReference = `morph${RelationKind.Right}`; + export type Morph = RelationKind.MorphOwner | RelationKind.MorphReference; + + export type XWay = `${RelationKind.Left}Way`; + + export type BiDirectional = `${RelationKind.Left}To${RelationKind.Right}`; + export type UniDirectional = RelationKind.Morph | RelationKind.XWay; + + export type Any = RelationKind.BiDirectional | RelationKind.UniDirectional; + + export type Reverse = + TRelationKind extends `${infer TLeft extends RelationKind.Left}To${infer TRight extends RelationKind.Right}` + ? Utils.Expression.If< + Utils.Expression.Extends, Uppercase>, + TRelationKind, + `${GetOppositePlurality}To${GetOppositePlurality}` + > + : TRelationKind; +} diff --git a/packages/core/strapi/lib/types/utils/expression.d.ts b/packages/core/strapi/lib/types/utils/expression.d.ts index 8b92a807bb..ab5b8632fa 100644 --- a/packages/core/strapi/lib/types/utils/expression.d.ts +++ b/packages/core/strapi/lib/types/utils/expression.d.ts @@ -8,7 +8,9 @@ export type Extends = [TLeft] extends [TRight] ? True : False; export type Not = If; -export type If = [TExpression] extends [True] +export type If = [ + TExpression +] extends [True] ? TOnTrue : TOnFalse; From 7e901ba08d38ce50d1ec14d8877060a158b61267 Mon Sep 17 00:00:00 2001 From: Convly Date: Fri, 9 Jun 2023 18:57:10 +0200 Subject: [PATCH 133/172] Update app & types generation for javascript projects, fix empty augmentation --- packages/generators/app/src/create-project.ts | 12 ++++++ .../app/src/resources/json/js/.gitkeep | 0 .../src/resources/json/js/jsconfig.json.ts | 6 +++ .../lib/generators/components/index.js | 8 +--- .../typescript/lib/generators/constants.js | 8 ++-- .../lib/generators/content-types/index.js | 8 +--- .../utils/typescript/lib/generators/index.js | 4 +- .../utils/typescript/lib/generators/utils.js | 37 +++++++------------ 8 files changed, 38 insertions(+), 45 deletions(-) delete mode 100644 packages/generators/app/src/resources/json/js/.gitkeep create mode 100644 packages/generators/app/src/resources/json/js/jsconfig.json.ts diff --git a/packages/generators/app/src/create-project.ts b/packages/generators/app/src/create-project.ts index dfd1c0638a..bd0e3f35c7 100644 --- a/packages/generators/app/src/create-project.ts +++ b/packages/generators/app/src/create-project.ts @@ -91,6 +91,18 @@ export default async function createProject( const json = require(srcPath).default(); + await fse.writeJSON(destPath, json, { spaces: 2 }); + } + } else { + const jsJSONDir = join(__dirname, 'resources/json/js'); + const filesMap = { 'jsconfig.json.js': '.' }; + + for (const [fileName, path] of Object.entries(filesMap)) { + const srcPath = join(jsJSONDir, fileName); + const destPath = join(rootPath, path, 'jsconfig.json'); + + const json = require(srcPath).default(); + await fse.writeJSON(destPath, json, { spaces: 2 }); } } diff --git a/packages/generators/app/src/resources/json/js/.gitkeep b/packages/generators/app/src/resources/json/js/.gitkeep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/packages/generators/app/src/resources/json/js/jsconfig.json.ts b/packages/generators/app/src/resources/json/js/jsconfig.json.ts new file mode 100644 index 0000000000..e5a02a78e9 --- /dev/null +++ b/packages/generators/app/src/resources/json/js/jsconfig.json.ts @@ -0,0 +1,6 @@ +export default () => ({ + compilerOptions: { + allowJs: true, + checkJs: true, + }, +}); diff --git a/packages/utils/typescript/lib/generators/components/index.js b/packages/utils/typescript/lib/generators/components/index.js index b6941f84f4..d83698991a 100644 --- a/packages/utils/typescript/lib/generators/components/index.js +++ b/packages/utils/typescript/lib/generators/components/index.js @@ -3,12 +3,7 @@ const { factory } = require('typescript'); const { models } = require('../common'); -const { - emitDefinitions, - format, - generateSharedExtensionDefinition, - generateLocalDirectoryImportDefinition, -} = require('../utils'); +const { emitDefinitions, format, generateSharedExtensionDefinition } = require('../utils'); /** * Generate type definitions for Strapi Components @@ -43,7 +38,6 @@ const generateComponentsDefinitions = async (options = {}) => { const allDefinitions = [ // Imports ...models.imports.generateImportDefinition(), - generateLocalDirectoryImportDefinition(), // Add a newline after the import statement factory.createIdentifier('\n'), diff --git a/packages/utils/typescript/lib/generators/constants.js b/packages/utils/typescript/lib/generators/constants.js index ef5897b7f9..af7ac33eb6 100644 --- a/packages/utils/typescript/lib/generators/constants.js +++ b/packages/utils/typescript/lib/generators/constants.js @@ -1,8 +1,6 @@ 'use strict'; -const path = require('path'); +const TYPES_ROOT_DIR = 'typings'; +const GENERATED_OUT_DIR = 'generated'; -const TYPES_ROOT_DIR = 'types'; -const REGISTRIES_OUT_DIR = path.join('shared', 'registries'); - -module.exports = { REGISTRIES_OUT_DIR, TYPES_ROOT_DIR }; +module.exports = { GENERATED_OUT_DIR, TYPES_ROOT_DIR }; diff --git a/packages/utils/typescript/lib/generators/content-types/index.js b/packages/utils/typescript/lib/generators/content-types/index.js index f6f7e836e6..9fb6e82302 100644 --- a/packages/utils/typescript/lib/generators/content-types/index.js +++ b/packages/utils/typescript/lib/generators/content-types/index.js @@ -3,12 +3,7 @@ const { factory } = require('typescript'); const { models } = require('../common'); -const { - emitDefinitions, - format, - generateSharedExtensionDefinition, - generateLocalDirectoryImportDefinition, -} = require('../utils'); +const { emitDefinitions, format, generateSharedExtensionDefinition } = require('../utils'); /** * Generate type definitions for Strapi Content-Types @@ -43,7 +38,6 @@ const generateContentTypesDefinitions = async (options = {}) => { const allDefinitions = [ // Imports ...models.imports.generateImportDefinition(), - generateLocalDirectoryImportDefinition(), // Add a newline after the import statement factory.createIdentifier('\n'), diff --git a/packages/utils/typescript/lib/generators/index.js b/packages/utils/typescript/lib/generators/index.js index 4785686ec8..ce9ed5de75 100644 --- a/packages/utils/typescript/lib/generators/index.js +++ b/packages/utils/typescript/lib/generators/index.js @@ -3,7 +3,7 @@ const path = require('path'); const chalk = require('chalk'); -const { TYPES_ROOT_DIR, REGISTRIES_OUT_DIR } = require('./constants'); +const { TYPES_ROOT_DIR, GENERATED_OUT_DIR } = require('./constants'); const { saveDefinitionToFileSystem, createLogger, timer } = require('./utils'); const generateContentTypesDefinitions = require('./content-types'); const generateComponentsDefinitions = require('./components'); @@ -42,7 +42,7 @@ const generate = async (config = {}) => { const logger = createLogger(loggerConfig); const psTimer = timer().start(); - const registryPwd = path.join(pwd, rootDir, REGISTRIES_OUT_DIR); + const registryPwd = path.join(pwd, rootDir, GENERATED_OUT_DIR); const generatorConfig = { strapi, pwd: registryPwd, logger }; const returnWithMessage = () => { diff --git a/packages/utils/typescript/lib/generators/utils.js b/packages/utils/typescript/lib/generators/utils.js index f4fc637578..33383efc0e 100644 --- a/packages/utils/typescript/lib/generators/utils.js +++ b/packages/utils/typescript/lib/generators/utils.js @@ -73,20 +73,6 @@ const format = async (content) => { return prettier.format(content, config); }; -/** - * Generate the import declaration for local directory - * - * @returns {ts.ImportDeclaration} - */ -const generateLocalDirectoryImportDefinition = () => { - return factory.createImportDeclaration( - undefined, - undefined, - factory.createStringLiteral('.'), - undefined - ); -}; - /** * Generate the extension block for a shared component from strapi/strapi * @@ -111,15 +97,19 @@ const generateSharedExtensionDefinition = (registry, definitions) => { factory.createModuleDeclaration( [factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createIdentifier('Shared'), - factory.createModuleBlock([ - factory.createInterfaceDeclaration( - [factory.createModifier(ts.SyntaxKind.ExportKeyword)], - factory.createIdentifier(registry), - undefined, - undefined, - properties - ), - ]) + factory.createModuleBlock( + properties.length > 0 + ? [ + factory.createInterfaceDeclaration( + [factory.createModifier(ts.SyntaxKind.ExportKeyword)], + factory.createIdentifier(registry), + undefined, + undefined, + properties + ), + ] + : [] + ) ), ]), ts.NodeFlags.ExportContext @@ -216,7 +206,6 @@ module.exports = { saveDefinitionToFileSystem, format, generateSharedExtensionDefinition, - generateLocalDirectoryImportDefinition, createLogger, timer, }; From a238c9705dcfc0a6a08e58c3c5b238c5dcb16cb9 Mon Sep 17 00:00:00 2001 From: Convly Date: Mon, 12 Jun 2023 09:26:00 +0200 Subject: [PATCH 134/172] Fix js support --- .../lib/types/core/attributes/relation.d.ts | 33 ++++++----------- .../strapi/lib/types/core/common/uid.d.ts | 10 ++++++ .../strapi/lib/types/utils/expression.d.ts | 35 +++++++++++++++++++ .../src/resources/json/js/jsconfig.json.ts | 1 - 4 files changed, 56 insertions(+), 23 deletions(-) diff --git a/packages/core/strapi/lib/types/core/attributes/relation.d.ts b/packages/core/strapi/lib/types/core/attributes/relation.d.ts index 2aa8c16382..2a81d78381 100644 --- a/packages/core/strapi/lib/types/core/attributes/relation.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/relation.d.ts @@ -1,6 +1,10 @@ import type { Attribute, Common, Utils } from '@strapi/strapi'; export type Relation< + // TODO: TOrigin was originally needed to infer precise attribute literal types by doing a reverse lookup + // on TTarget -> TOrigin relations. Due to errors because of Attribute.Any [relation] very generic + // representation, type mismatches were encountered and mappedBy/inversedBy are now regular strings. + // It is kept to allow for future iterations without breaking the current type API TOrigin extends Common.UID.Schema = Common.UID.Schema, TRelationKind extends RelationKind.Any = RelationKind.Any, TTarget extends Common.UID.Schema = never @@ -12,7 +16,7 @@ export type Relation< Attribute.PrivateOption; export type RelationProperties< - TOrigin extends Common.UID.Schema, + _TOrigin extends Common.UID.Schema, TRelationKind extends RelationKind.Any, TTarget extends Common.UID.Schema > = Utils.Expression.MatchFirst< @@ -22,22 +26,8 @@ export type RelationProperties< { relation: TRelationKind; target: TTarget; - mappedBy?: Utils.Guard.Never< - Attribute.GetKeysByType< - TTarget, - 'relation', - { target: TOrigin; relation: RelationKind.Reverse } - >, - string - >; - inversedBy?: Utils.Guard.Never< - Attribute.GetKeysByType< - TTarget, - 'relation', - { target: TOrigin; relation: RelationKind.Reverse } - >, - string - >; + inversedBy?: string; + mappedBy?: string; } >, Utils.Expression.Test< @@ -49,10 +39,9 @@ export type RelationProperties< { relation: TRelationKind; target: TTarget; - morphBy?: Attribute.GetKeysByType< - TTarget, - 'relation', - { relation: RelationKind.MorphOwner } + morphBy?: Utils.Guard.Never< + Attribute.GetKeysByType, + string >; } > @@ -89,7 +78,7 @@ export type GetRelationValue = TAttribut export module RelationKind { type GetOppositePlurality = { - one: 'one'; + one: 'many'; One: 'Many'; many: 'one'; Many: 'One'; diff --git a/packages/core/strapi/lib/types/core/common/uid.d.ts b/packages/core/strapi/lib/types/core/common/uid.d.ts index ead25ac556..51ae5f9158 100644 --- a/packages/core/strapi/lib/types/core/common/uid.d.ts +++ b/packages/core/strapi/lib/types/core/common/uid.d.ts @@ -50,3 +50,13 @@ export type IsSingleType = Utils.Expression Shared.ContentTypes[TContentTypeUID], SchemaNamespace.SingleType >; + +export type IsComponent = Utils.Expression.Extends< + Shared.Components[TComponentUID], + SchemaNamespace.Component +>; + +export type IsContentType = Utils.Expression.Or< + IsCollectionType, + IsSingleType +>; diff --git a/packages/core/strapi/lib/types/utils/expression.d.ts b/packages/core/strapi/lib/types/utils/expression.d.ts index ab5b8632fa..df78bdec23 100644 --- a/packages/core/strapi/lib/types/utils/expression.d.ts +++ b/packages/core/strapi/lib/types/utils/expression.d.ts @@ -27,7 +27,42 @@ export type MatchFirst = TTests extends : never : never; +export type MatchAll = TTests extends [ + infer THead extends Test, + ...infer TTail extends Test[] +] + ? THead extends Test + ? Utils.Guard.Never< + If | If, MatchAll>, + TDefault + > + : never + : never; + export type Test = [ TExpression, TValue ]; + +export type Some = TExpressions extends [ + infer THead extends BooleanValue, + ...infer TTail extends BooleanValue[] +] + ? If, Or>, Or> + : never; + +export type Every = TExpressions extends [ + infer THead extends BooleanValue, + ...infer TTail extends BooleanValue[] +] + ? If, And>, And> + : never; + +export type And = Extends< + Extends | Extends, + true +>; + +export type Or = Not< + Extends | Extends, false> +>; diff --git a/packages/generators/app/src/resources/json/js/jsconfig.json.ts b/packages/generators/app/src/resources/json/js/jsconfig.json.ts index e5a02a78e9..bf3e9eeebc 100644 --- a/packages/generators/app/src/resources/json/js/jsconfig.json.ts +++ b/packages/generators/app/src/resources/json/js/jsconfig.json.ts @@ -1,6 +1,5 @@ export default () => ({ compilerOptions: { - allowJs: true, checkJs: true, }, }); From 72d87345b4f96c6551a3ef442a50744cebc7bac2 Mon Sep 17 00:00:00 2001 From: Convly Date: Mon, 12 Jun 2023 09:32:46 +0200 Subject: [PATCH 135/172] Use types instead of scalar for boolean values --- packages/core/strapi/lib/types/utils/expression.d.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/core/strapi/lib/types/utils/expression.d.ts b/packages/core/strapi/lib/types/utils/expression.d.ts index df78bdec23..eceebf2e00 100644 --- a/packages/core/strapi/lib/types/utils/expression.d.ts +++ b/packages/core/strapi/lib/types/utils/expression.d.ts @@ -55,14 +55,14 @@ export type Every = TExpressions extends [ infer THead extends BooleanValue, ...infer TTail extends BooleanValue[] ] - ? If, And>, And> + ? If, And>, And> : never; export type And = Extends< - Extends | Extends, - true + Extends | Extends, + True >; export type Or = Not< - Extends | Extends, false> + Extends | Extends, False> >; From 1e91d9b4981b75065fe13815a6722fbae7df52de Mon Sep 17 00:00:00 2001 From: Convly Date: Mon, 12 Jun 2023 10:51:45 +0200 Subject: [PATCH 136/172] Review comments --- packages/core/data-transfer/src/engine/index.ts | 3 ++- packages/core/strapi/lib/commands/actions/develop/action.js | 2 -- packages/utils/typescript/lib/generators/constants.js | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/core/data-transfer/src/engine/index.ts b/packages/core/data-transfer/src/engine/index.ts index f88f41adbf..9c101c02d1 100644 --- a/packages/core/data-transfer/src/engine/index.ts +++ b/packages/core/data-transfer/src/engine/index.ts @@ -1,7 +1,8 @@ +import type Chain from 'stream-chain'; import { PassThrough, Transform, Readable, Writable } from 'stream'; -import Chain, { chain } from 'stream-chain'; import { extname } from 'path'; import { EOL } from 'os'; +import { chain } from 'stream-chain'; import { isEmpty, uniq, last, isNumber, difference, set, omit } from 'lodash/fp'; import { diff as semverDiff } from 'semver'; diff --git a/packages/core/strapi/lib/commands/actions/develop/action.js b/packages/core/strapi/lib/commands/actions/develop/action.js index 4d933c6bf2..2b8e74f457 100644 --- a/packages/core/strapi/lib/commands/actions/develop/action.js +++ b/packages/core/strapi/lib/commands/actions/develop/action.js @@ -121,8 +121,6 @@ const workerProcess = async ({ appDir, distDir, watchAdmin, polling, isTSProject const shouldGenerateTypeScriptTypes = strapiInstance.config.get('typescript.autogenerate', false); if (shouldGenerateTypeScriptTypes) { - // This is run in an uncaught promise on purpose so that it doesn't block Strapi startup - // NOTE: We should probably add some configuration options to manage the file structure output or the verbosity level await tsUtils.generators.generate({ strapi: strapiInstance, pwd: appDir, diff --git a/packages/utils/typescript/lib/generators/constants.js b/packages/utils/typescript/lib/generators/constants.js index af7ac33eb6..3bdfa9ebd3 100644 --- a/packages/utils/typescript/lib/generators/constants.js +++ b/packages/utils/typescript/lib/generators/constants.js @@ -1,6 +1,6 @@ 'use strict'; -const TYPES_ROOT_DIR = 'typings'; +const TYPES_ROOT_DIR = 'types'; const GENERATED_OUT_DIR = 'generated'; module.exports = { GENERATED_OUT_DIR, TYPES_ROOT_DIR }; From 5b3cbdce9da06dfc0c4ddf81c4d90e5d6d913b27 Mon Sep 17 00:00:00 2001 From: Convly Date: Mon, 12 Jun 2023 12:35:50 +0200 Subject: [PATCH 137/172] Fix type for the core api service --- .../strapi/lib/types/core-api/service.d.ts | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/packages/core/strapi/lib/types/core-api/service.d.ts b/packages/core/strapi/lib/types/core-api/service.d.ts index ec59215e39..314e69cfed 100644 --- a/packages/core/strapi/lib/types/core-api/service.d.ts +++ b/packages/core/strapi/lib/types/core-api/service.d.ts @@ -1,7 +1,7 @@ import type { Common, Utils } from '@strapi/strapi'; // TODO Use actual entities instead of regular object -type Entity = object; +type Entity = unknown; /** * Base Core-API service type @@ -11,7 +11,7 @@ export interface Base { } /** - * Generic service structure + * Generic core api service structure */ export type Generic = { [method: string | number | symbol]: (...args: any) => any; @@ -21,7 +21,7 @@ export type Generic = { * Core-API collection type service */ export interface CollectionType extends Base { - find?(params: object): Promise | Entity; + find?(params: object): Promise | Entity[]; findOne?(entityId: string, params: object): Promise | Entity; create?(params: object): Promise | Entity; update?(entityId: string, params: object): Promise | Entity; @@ -37,12 +37,14 @@ export interface SingleType extends Base { delete?(params: object): Promise | Entity; } -export type ContentType = Utils.Expression.MatchFirst< - [ - Utils.Expression.Test, CollectionType>, - Utils.Expression.Test, SingleType> - ], - Base ->; +export type ContentType = + Utils.Expression.MatchFirst< + [ + Utils.Expression.Test, CollectionType>, + Utils.Expression.Test, SingleType> + ], + Base + >; -export type Extendable = ContentType & Generic; +export type Extendable = + ContentType & Generic; From 5b4c13c99ac9689d004dd1e2f24688ffa8b846c4 Mon Sep 17 00:00:00 2001 From: Gustav Hansen Date: Wed, 31 May 2023 14:14:15 +0200 Subject: [PATCH 138/172] Enhancement: Ass userEnterprise() hook --- .../admin/src/hooks/useEnterprise/index.js | 1 + .../src/hooks/useEnterprise/useEnterprise.js | 36 +++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 packages/core/admin/admin/src/hooks/useEnterprise/index.js create mode 100644 packages/core/admin/admin/src/hooks/useEnterprise/useEnterprise.js diff --git a/packages/core/admin/admin/src/hooks/useEnterprise/index.js b/packages/core/admin/admin/src/hooks/useEnterprise/index.js new file mode 100644 index 0000000000..72bb02a9a4 --- /dev/null +++ b/packages/core/admin/admin/src/hooks/useEnterprise/index.js @@ -0,0 +1 @@ +export * from './useEnterprise'; diff --git a/packages/core/admin/admin/src/hooks/useEnterprise/useEnterprise.js b/packages/core/admin/admin/src/hooks/useEnterprise/useEnterprise.js new file mode 100644 index 0000000000..97688cd872 --- /dev/null +++ b/packages/core/admin/admin/src/hooks/useEnterprise/useEnterprise.js @@ -0,0 +1,36 @@ +import * as React from 'react'; + +import { useCallbackRef } from '@strapi/helper-plugin'; + +function isEnterprise() { + return window.strapi.isEE; +} + +export function useEnterprise( + ceData, + eeCallback, + { defaultValue = null, combine = (ceData, eeData) => eeData } = {} +) { + const eeCallbackRef = useCallbackRef(eeCallback); + const combineCallbackRef = useCallbackRef(combine); + + // We have to use a nested object here, because functions (e.g. Components) + // can not be stored as value directly + const [{ data }, setData] = React.useState({ + data: isEnterprise() ? defaultValue : ceData, + }); + + React.useEffect(() => { + async function importEE() { + const eeData = await eeCallbackRef(); + + setData({ data: combineCallbackRef(ceData, eeData) }); + } + + if (isEnterprise()) { + importEE(); + } + }, [ceData, eeCallbackRef, combineCallbackRef]); + + return data; +} From f60ef2c0a81750e1a72c78618a818449c952326c Mon Sep 17 00:00:00 2001 From: Gustav Hansen Date: Wed, 31 May 2023 17:34:26 +0200 Subject: [PATCH 139/172] Chore: Start using useEnterprise to load the settings router --- .../src/hooks/useSettingsMenu/constants.js | 52 ++++++++ .../admin/src/hooks/useSettingsMenu/index.js | 109 ++++++++++------ .../admin/src/hooks/useSettingsMenu/init.js | 34 ----- .../src/hooks/useSettingsMenu/reducer.js | 41 ------- .../useSettingsMenu/tests/reducer.test.js | 116 ------------------ .../hooks/useSettingsMenu/utils/adminLinks.js | 4 - .../useSettingsMenu/utils/customAdminLinks.js | 1 - .../utils/customGlobalLinks.js | 1 - .../utils/defaultAdminLinks.js | 21 ---- .../utils/defaultGlobalLinks.js | 34 ----- .../useSettingsMenu/utils/globalLinks.js | 4 - .../{utils/defaultRoutes.js => constants.js} | 34 +++-- .../admin/src/pages/SettingsPage/index.js | 18 ++- .../pages/SettingsPage/utils/customRoutes.js | 3 - .../src/pages/SettingsPage/utils/index.js | 2 - .../src/pages/SettingsPage/utils/routes.js | 5 - .../admin/hooks/useSettingsMenu/constants.js | 46 +++++++ .../useSettingsMenu/utils/customAdminLinks.js | 17 --- .../utils/customGlobalLinks.js | 25 ---- .../ee/admin/pages/SettingsPage/constants.js | 49 ++++++++ .../pages/SettingsPage/utils/customRoutes.js | 45 ------- 21 files changed, 253 insertions(+), 408 deletions(-) create mode 100644 packages/core/admin/admin/src/hooks/useSettingsMenu/constants.js delete mode 100644 packages/core/admin/admin/src/hooks/useSettingsMenu/init.js delete mode 100644 packages/core/admin/admin/src/hooks/useSettingsMenu/reducer.js delete mode 100644 packages/core/admin/admin/src/hooks/useSettingsMenu/tests/reducer.test.js delete mode 100644 packages/core/admin/admin/src/hooks/useSettingsMenu/utils/adminLinks.js delete mode 100644 packages/core/admin/admin/src/hooks/useSettingsMenu/utils/customAdminLinks.js delete mode 100644 packages/core/admin/admin/src/hooks/useSettingsMenu/utils/customGlobalLinks.js delete mode 100644 packages/core/admin/admin/src/hooks/useSettingsMenu/utils/defaultAdminLinks.js delete mode 100644 packages/core/admin/admin/src/hooks/useSettingsMenu/utils/defaultGlobalLinks.js delete mode 100644 packages/core/admin/admin/src/hooks/useSettingsMenu/utils/globalLinks.js rename packages/core/admin/admin/src/pages/SettingsPage/{utils/defaultRoutes.js => constants.js} (64%) delete mode 100644 packages/core/admin/admin/src/pages/SettingsPage/utils/customRoutes.js delete mode 100644 packages/core/admin/admin/src/pages/SettingsPage/utils/routes.js create mode 100644 packages/core/admin/ee/admin/hooks/useSettingsMenu/constants.js delete mode 100644 packages/core/admin/ee/admin/hooks/useSettingsMenu/utils/customAdminLinks.js delete mode 100644 packages/core/admin/ee/admin/hooks/useSettingsMenu/utils/customGlobalLinks.js create mode 100644 packages/core/admin/ee/admin/pages/SettingsPage/constants.js delete mode 100644 packages/core/admin/ee/admin/pages/SettingsPage/utils/customRoutes.js diff --git a/packages/core/admin/admin/src/hooks/useSettingsMenu/constants.js b/packages/core/admin/admin/src/hooks/useSettingsMenu/constants.js new file mode 100644 index 0000000000..6eae1c1d39 --- /dev/null +++ b/packages/core/admin/admin/src/hooks/useSettingsMenu/constants.js @@ -0,0 +1,52 @@ +import adminPermissions from '../../permissions'; + +export const LINKS_CE = { + global: [ + { + intlLabel: { id: 'Settings.application.title', defaultMessage: 'Overview' }, + to: '/settings/application-infos', + id: '000-application-infos', + isDisplayed: false, + permissions: [], + }, + { + intlLabel: { id: 'Settings.webhooks.title', defaultMessage: 'Webhooks' }, + to: '/settings/webhooks', + id: 'webhooks', + isDisplayed: false, + permissions: adminPermissions.settings.webhooks.main, + }, + { + intlLabel: { id: 'Settings.apiTokens.title', defaultMessage: 'API Tokens' }, + to: '/settings/api-tokens?sort=name:ASC', + id: 'api-tokens', + isDisplayed: false, + permissions: adminPermissions.settings['api-tokens'].main, + }, + { + intlLabel: { id: 'Settings.transferTokens.title', defaultMessage: 'Transfer Tokens' }, + to: '/settings/transfer-tokens?sort=name:ASC', + id: 'transfer-tokens', + isDisplayed: false, + permissions: adminPermissions.settings['transfer-tokens'].main, + }, + ], + + admin: [ + { + intlLabel: { id: 'global.roles', defaultMessage: 'Roles' }, + to: '/settings/roles', + id: 'roles', + isDisplayed: false, + permissions: adminPermissions.settings.roles.main, + }, + { + intlLabel: { id: 'global.users' }, + // Init the search params directly + to: '/settings/users?pageSize=10&page=1&sort=firstname', + id: 'users', + isDisplayed: false, + permissions: adminPermissions.settings.users.main, + }, + ], +}; diff --git a/packages/core/admin/admin/src/hooks/useSettingsMenu/index.js b/packages/core/admin/admin/src/hooks/useSettingsMenu/index.js index 442eadecbc..45ca2f4756 100644 --- a/packages/core/admin/admin/src/hooks/useSettingsMenu/index.js +++ b/packages/core/admin/admin/src/hooks/useSettingsMenu/index.js @@ -1,55 +1,94 @@ -import { useEffect, useReducer } from 'react'; +import { useState, useEffect } from 'react'; import { hasPermissions, useRBACProvider, useStrapiApp, useAppInfo } from '@strapi/helper-plugin'; -import reducer, { initialState } from './reducer'; -import init from './init'; +import sortLinks from './utils/sortLinks'; +import formatLinks from './utils/formatLinks'; +import { useEnterprise } from '../useEnterprise'; -const useSettingsMenu = (noCheck = false) => { +import { LINKS_CE } from './constants'; + +const useSettingsMenu = () => { + const [{ isLoading, menu }, setData] = useState({ + isLoading: true, + menu: [], + }); const { allPermissions: permissions } = useRBACProvider(); const { shouldUpdateStrapi } = useAppInfo(); const { settings } = useStrapiApp(); - - const [{ isLoading, menu }, dispatch] = useReducer(reducer, initialState, () => - init(initialState, { settings, shouldUpdateStrapi }) + const { global: globalLinks, admin: adminLinks } = useEnterprise( + LINKS_CE, + async () => (await import('../../../../ee/admin/hooks/useSettingsMenu/constants')).LINKS_EE, + { + combine(ceLinks, eeLinks) { + return { + admin: [...eeLinks.admin, ...ceLinks.admin], + global: [...ceLinks.global, ...eeLinks.global], + }; + }, + defaultValue: { + admin: [], + global: [], + }, + } ); useEffect(() => { const getData = async () => { - const checkPermissions = async (permissionsToCheck, path) => { - const hasPermission = await hasPermissions(permissions, permissionsToCheck); + const buildMenuPermissions = (sections) => + Promise.all( + sections.reduce((acc, section, sectionIndex) => { + const buildMenuPermissions = (links) => + links.map(async (link, linkIndex) => ({ + hasPermission: await hasPermissions(permissions, link.permissions), + sectionIndex, + linkIndex, + })); - return { hasPermission, path }; - }; + return [...acc, ...buildMenuPermissions(section.links)]; + }, []) + ); - const generateArrayOfPromises = (array) => { - return array.reduce((acc, current, sectionIndex) => { - const generateArrayOfPromises = (array) => - array.map((link, index) => - checkPermissions(array[index].permissions, `${sectionIndex}.links.${index}`) + const menuPermissions = await buildMenuPermissions(sections); + + setData((prev) => ({ + ...prev, + isLoading: false, + menu: sections.map((section, sectionIndex) => ({ + ...section, + links: section.links.map((link, linkIndex) => { + const permission = menuPermissions.find( + (permission) => + permission.sectionIndex === sectionIndex && permission.linkIndex === linkIndex ); - return [...acc, ...generateArrayOfPromises(current.links)]; - }, []); - }; - - const generalSectionLinksArrayOfPromises = generateArrayOfPromises(menu); - - const data = await Promise.all(generalSectionLinksArrayOfPromises); - - dispatch({ - type: 'CHECK_PERMISSIONS_SUCCEEDED', - data, - }); + return { + ...link, + isDisplayed: Boolean(permission.hasPermission), + }; + }), + })), + })); }; - // This hook is also used by the main LeftMenu component in order to know which sections it needs to display/hide - // Therefore, we don't need to make the checking all the times when the hook is used. - if (!noCheck) { - getData(); - } + const { global, ...otherSections } = settings; + const sections = formatLinks([ + { + ...settings.global, + links: sortLinks([...settings.global.links, ...globalLinks]).map((link) => ({ + ...link, + hasNotification: link.id === '000-application-infos' && shouldUpdateStrapi, + })), + }, + { + id: 'permissions', + intlLabel: { id: 'Settings.permissions', defaultMessage: 'Administration Panel' }, + links: adminLinks, + }, + ...Object.values(otherSections), + ]); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [permissions, noCheck]); + getData(); + }, [adminLinks, globalLinks, permissions, settings, shouldUpdateStrapi]); return { isLoading, menu }; }; diff --git a/packages/core/admin/admin/src/hooks/useSettingsMenu/init.js b/packages/core/admin/admin/src/hooks/useSettingsMenu/init.js deleted file mode 100644 index a017f6d7c3..0000000000 --- a/packages/core/admin/admin/src/hooks/useSettingsMenu/init.js +++ /dev/null @@ -1,34 +0,0 @@ -import omit from 'lodash/omit'; -import sortLinks from './utils/sortLinks'; -import formatLinks from './utils/formatLinks'; -import adminLinks from './utils/adminLinks'; -import globalLinks from './utils/globalLinks'; - -const init = (initialState, { settings, shouldUpdateStrapi }) => { - // Retrieve the links that will be injected into the global section - const pluginsGlobalLinks = settings.global.links; - // Sort the links by name - const sortedGlobalLinks = sortLinks([...pluginsGlobalLinks, ...globalLinks]).map((link) => ({ - ...link, - hasNotification: link.id === '000-application-infos' && shouldUpdateStrapi, - })); - - const otherSections = Object.values(omit(settings, 'global')); - - const menu = [ - { - ...settings.global, - links: sortedGlobalLinks, - }, - { - id: 'permissions', - intlLabel: { id: 'Settings.permissions', defaultMessage: 'Administration Panel' }, - links: adminLinks, - }, - ...otherSections, - ]; - - return { ...initialState, menu: formatLinks(menu) }; -}; - -export default init; diff --git a/packages/core/admin/admin/src/hooks/useSettingsMenu/reducer.js b/packages/core/admin/admin/src/hooks/useSettingsMenu/reducer.js deleted file mode 100644 index 9da7aba16f..0000000000 --- a/packages/core/admin/admin/src/hooks/useSettingsMenu/reducer.js +++ /dev/null @@ -1,41 +0,0 @@ -import produce from 'immer'; -import set from 'lodash/set'; - -const initialState = { - menu: [], - isLoading: true, -}; - -const reducer = (state, action) => - // eslint-disable-next-line consistent-return - produce(state, (draftState) => { - switch (action.type) { - case 'CHECK_PERMISSIONS_SUCCEEDED': { - action.data.forEach((checkedPermissions) => { - if (checkedPermissions.hasPermission) { - set( - draftState, - ['menu', ...checkedPermissions.path.split('.'), 'isDisplayed'], - checkedPermissions.hasPermission - ); - } - }); - - // Remove the not needed links in each section - draftState.menu.forEach((section, sectionIndex) => { - draftState.menu[sectionIndex].links = section.links.filter( - (link) => link.isDisplayed === true - ); - }); - - draftState.isLoading = false; - break; - } - - default: - return draftState; - } - }); - -export default reducer; -export { initialState }; diff --git a/packages/core/admin/admin/src/hooks/useSettingsMenu/tests/reducer.test.js b/packages/core/admin/admin/src/hooks/useSettingsMenu/tests/reducer.test.js deleted file mode 100644 index 5f5ca4328e..0000000000 --- a/packages/core/admin/admin/src/hooks/useSettingsMenu/tests/reducer.test.js +++ /dev/null @@ -1,116 +0,0 @@ -import reducer from '../reducer'; - -describe('ADMIN | hooks | useSettingsMenu | reducer', () => { - describe('DEFAULT_ACTION', () => { - it('should return the state', () => { - const initialState = { - ok: true, - }; - const expected = { - ok: true, - }; - - expect(reducer(initialState, {})).toEqual(expected); - }); - }); - - describe('CHECK_PERMISSIONS_SUCCEEDED', () => { - it('should set the permissions correctly', () => { - const initialState = { - isLoading: true, - menu: [ - { - id: 'global', - links: [ - { - to: 'global.test', - isDisplayed: false, - }, - { - to: 'global.test2', - isDisplayed: false, - }, - ], - }, - { - id: 'test', - links: [ - { - to: 'test.test', - isDisplayed: false, - }, - { - to: 'test.test2', - isDisplayed: false, - }, - { - to: 'test.test3', - isDisplayed: false, - }, - ], - }, - { - id: 'test1', - links: [ - { - to: 'test1.test', - isDisplayed: false, - }, - { - to: 'test1.test2', - isDisplayed: false, - }, - { - to: 'test1.test3', - isDisplayed: false, - }, - ], - }, - ], - }; - const action = { - type: 'CHECK_PERMISSIONS_SUCCEEDED', - data: [ - { hasPermission: true, path: '1.links.0' }, - { hasPermission: true, path: '1.links.1' }, - { hasPermission: true, path: '0.links.1' }, - { hasPermission: undefined, path: '2.links.0' }, - ], - }; - - const expected = { - isLoading: false, - menu: [ - { - id: 'global', - links: [ - { - to: 'global.test2', - isDisplayed: true, - }, - ], - }, - { - id: 'test', - links: [ - { - to: 'test.test', - isDisplayed: true, - }, - { - to: 'test.test2', - isDisplayed: true, - }, - ], - }, - { - id: 'test1', - links: [], - }, - ], - }; - - expect(reducer(initialState, action)).toEqual(expected); - }); - }); -}); diff --git a/packages/core/admin/admin/src/hooks/useSettingsMenu/utils/adminLinks.js b/packages/core/admin/admin/src/hooks/useSettingsMenu/utils/adminLinks.js deleted file mode 100644 index b4a2b02cf1..0000000000 --- a/packages/core/admin/admin/src/hooks/useSettingsMenu/utils/adminLinks.js +++ /dev/null @@ -1,4 +0,0 @@ -import customAdminLinks from 'ee_else_ce/hooks/useSettingsMenu/utils/customAdminLinks'; -import defaultAdminLinks from './defaultAdminLinks'; - -export default [...customAdminLinks, ...defaultAdminLinks]; diff --git a/packages/core/admin/admin/src/hooks/useSettingsMenu/utils/customAdminLinks.js b/packages/core/admin/admin/src/hooks/useSettingsMenu/utils/customAdminLinks.js deleted file mode 100644 index d6d1738de6..0000000000 --- a/packages/core/admin/admin/src/hooks/useSettingsMenu/utils/customAdminLinks.js +++ /dev/null @@ -1 +0,0 @@ -export default []; diff --git a/packages/core/admin/admin/src/hooks/useSettingsMenu/utils/customGlobalLinks.js b/packages/core/admin/admin/src/hooks/useSettingsMenu/utils/customGlobalLinks.js deleted file mode 100644 index d6d1738de6..0000000000 --- a/packages/core/admin/admin/src/hooks/useSettingsMenu/utils/customGlobalLinks.js +++ /dev/null @@ -1 +0,0 @@ -export default []; diff --git a/packages/core/admin/admin/src/hooks/useSettingsMenu/utils/defaultAdminLinks.js b/packages/core/admin/admin/src/hooks/useSettingsMenu/utils/defaultAdminLinks.js deleted file mode 100644 index 28d0644fb0..0000000000 --- a/packages/core/admin/admin/src/hooks/useSettingsMenu/utils/defaultAdminLinks.js +++ /dev/null @@ -1,21 +0,0 @@ -import adminPermissions from '../../../permissions'; - -const defaultAdminLinks = [ - { - intlLabel: { id: 'global.roles', defaultMessage: 'Roles' }, - to: '/settings/roles', - id: 'roles', - isDisplayed: false, - permissions: adminPermissions.settings.roles.main, - }, - { - intlLabel: { id: 'global.users' }, - // Init the search params directly - to: '/settings/users?pageSize=10&page=1&sort=firstname', - id: 'users', - isDisplayed: false, - permissions: adminPermissions.settings.users.main, - }, -]; - -export default defaultAdminLinks; diff --git a/packages/core/admin/admin/src/hooks/useSettingsMenu/utils/defaultGlobalLinks.js b/packages/core/admin/admin/src/hooks/useSettingsMenu/utils/defaultGlobalLinks.js deleted file mode 100644 index fee1aedc0b..0000000000 --- a/packages/core/admin/admin/src/hooks/useSettingsMenu/utils/defaultGlobalLinks.js +++ /dev/null @@ -1,34 +0,0 @@ -import adminPermissions from '../../../permissions'; - -const defaultGlobalLinks = [ - { - intlLabel: { id: 'Settings.application.title', defaultMessage: 'Overview' }, - to: '/settings/application-infos', - id: '000-application-infos', - isDisplayed: false, - permissions: [], - }, - { - intlLabel: { id: 'Settings.webhooks.title', defaultMessage: 'Webhooks' }, - to: '/settings/webhooks', - id: 'webhooks', - isDisplayed: false, - permissions: adminPermissions.settings.webhooks.main, - }, - { - intlLabel: { id: 'Settings.apiTokens.title', defaultMessage: 'API Tokens' }, - to: '/settings/api-tokens?sort=name:ASC', - id: 'api-tokens', - isDisplayed: false, - permissions: adminPermissions.settings['api-tokens'].main, - }, - { - intlLabel: { id: 'Settings.transferTokens.title', defaultMessage: 'Transfer Tokens' }, - to: '/settings/transfer-tokens?sort=name:ASC', - id: 'transfer-tokens', - isDisplayed: false, - permissions: adminPermissions.settings['transfer-tokens'].main, - }, -]; - -export default defaultGlobalLinks; diff --git a/packages/core/admin/admin/src/hooks/useSettingsMenu/utils/globalLinks.js b/packages/core/admin/admin/src/hooks/useSettingsMenu/utils/globalLinks.js deleted file mode 100644 index 32c1aef5cd..0000000000 --- a/packages/core/admin/admin/src/hooks/useSettingsMenu/utils/globalLinks.js +++ /dev/null @@ -1,4 +0,0 @@ -import customGlobalLinks from 'ee_else_ce/hooks/useSettingsMenu/utils/customGlobalLinks'; -import defaultGlobalLinks from './defaultGlobalLinks'; - -export default [...defaultGlobalLinks, ...customGlobalLinks]; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/utils/defaultRoutes.js b/packages/core/admin/admin/src/pages/SettingsPage/constants.js similarity index 64% rename from packages/core/admin/admin/src/pages/SettingsPage/utils/defaultRoutes.js rename to packages/core/admin/admin/src/pages/SettingsPage/constants.js index 4e07a98a7d..8c9c255bc6 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/utils/defaultRoutes.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/constants.js @@ -1,8 +1,8 @@ -const defaultRoutes = [ +export const ROUTES_CE = [ { async Component() { const component = await import( - /* webpackChunkName: "admin-roles-list" */ '../pages/Roles/ProtectedListPage' + /* webpackChunkName: "admin-roles-list" */ './pages/Roles/ProtectedListPage' ); return component; @@ -13,7 +13,7 @@ const defaultRoutes = [ { async Component() { const component = await import( - /* webpackChunkName: "admin-edit-roles-page" */ '../pages/Roles/CreatePage' + /* webpackChunkName: "admin-edit-roles-page" */ './pages/Roles/CreatePage' ); return component; @@ -24,7 +24,7 @@ const defaultRoutes = [ { async Component() { const component = await import( - /* webpackChunkName: "admin-edit-roles-page" */ '../pages/Roles/CreatePage' + /* webpackChunkName: "admin-edit-roles-page" */ './pages/Roles/CreatePage' ); return component; @@ -35,7 +35,7 @@ const defaultRoutes = [ { async Component() { const component = await import( - /* webpackChunkName: "admin-edit-roles-page" */ '../pages/Roles/ProtectedEditPage' + /* webpackChunkName: "admin-edit-roles-page" */ './pages/Roles/ProtectedEditPage' ); return component; @@ -46,7 +46,7 @@ const defaultRoutes = [ { async Component() { const component = await import( - /* webpackChunkName: "admin-users" */ '../pages/Users/ProtectedListPage' + /* webpackChunkName: "admin-users" */ './pages/Users/ProtectedListPage' ); return component; @@ -57,7 +57,7 @@ const defaultRoutes = [ { async Component() { const component = await import( - /* webpackChunkName: "admin-edit-users" */ '../pages/Users/ProtectedEditPage' + /* webpackChunkName: "admin-edit-users" */ './pages/Users/ProtectedEditPage' ); return component; @@ -68,7 +68,7 @@ const defaultRoutes = [ { async Component() { const component = await import( - /* webpackChunkName: "webhook-edit-page" */ '../pages/Webhooks/ProtectedCreateView' + /* webpackChunkName: "webhook-edit-page" */ './pages/Webhooks/ProtectedCreateView' ); return component; @@ -79,7 +79,7 @@ const defaultRoutes = [ { async Component() { const component = await import( - /* webpackChunkName: "webhook-edit-page" */ '../pages/Webhooks/ProtectedEditView' + /* webpackChunkName: "webhook-edit-page" */ './pages/Webhooks/ProtectedEditView' ); return component; @@ -90,7 +90,7 @@ const defaultRoutes = [ { async Component() { const component = await import( - /* webpackChunkName: "webhook-list-page" */ '../pages/Webhooks/ProtectedListView' + /* webpackChunkName: "webhook-list-page" */ './pages/Webhooks/ProtectedListView' ); return component; @@ -101,7 +101,7 @@ const defaultRoutes = [ { async Component() { const component = await import( - /* webpackChunkName: "api-tokens-list-page" */ '../pages/ApiTokens/ProtectedListView' + /* webpackChunkName: "api-tokens-list-page" */ './pages/ApiTokens/ProtectedListView' ); return component; @@ -112,7 +112,7 @@ const defaultRoutes = [ { async Component() { const component = await import( - /* webpackChunkName: "api-tokens-create-page" */ '../pages/ApiTokens/ProtectedCreateView' + /* webpackChunkName: "api-tokens-create-page" */ './pages/ApiTokens/ProtectedCreateView' ); return component; @@ -123,7 +123,7 @@ const defaultRoutes = [ { async Component() { const component = await import( - /* webpackChunkName: "api-tokens-edit-page" */ '../pages/ApiTokens/ProtectedEditView' + /* webpackChunkName: "api-tokens-edit-page" */ './pages/ApiTokens/ProtectedEditView' ); return component; @@ -134,7 +134,7 @@ const defaultRoutes = [ { async Component() { const component = await import( - /* webpackChunkName: "transfer-tokens-create-page" */ '../pages/TransferTokens/ProtectedCreateView' + /* webpackChunkName: "transfer-tokens-create-page" */ './pages/TransferTokens/ProtectedCreateView' ); return component; @@ -145,7 +145,7 @@ const defaultRoutes = [ { async Component() { const component = await import( - /* webpackChunkName: "transfer-tokens-list-page" */ '../pages/TransferTokens/ProtectedListView' + /* webpackChunkName: "transfer-tokens-list-page" */ './pages/TransferTokens/ProtectedListView' ); return component; @@ -156,7 +156,7 @@ const defaultRoutes = [ { async Component() { const component = await import( - /* webpackChunkName: "transfer-tokens-edit-page" */ '../pages/TransferTokens/ProtectedEditView' + /* webpackChunkName: "transfer-tokens-edit-page" */ './pages/TransferTokens/ProtectedEditView' ); return component; @@ -165,5 +165,3 @@ const defaultRoutes = [ exact: true, }, ]; - -export default defaultRoutes; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/index.js b/packages/core/admin/admin/src/pages/SettingsPage/index.js index 4c01daca6a..067bf6f82d 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/index.js @@ -15,24 +15,38 @@ import { Switch, Redirect, Route, useParams } from 'react-router-dom'; import { Layout } from '@strapi/design-system'; import { useIntl } from 'react-intl'; import { Helmet } from 'react-helmet'; + import { useSettingsMenu } from '../../hooks'; import { createRoute, makeUniqueRoutes } from '../../utils'; import ApplicationInfosPage from './pages/ApplicationInfosPage'; -import { createSectionsRoutes, routes } from './utils'; +import { createSectionsRoutes } from './utils'; import SettingsNav from './components/SettingsNav'; +import { ROUTES_CE } from './constants'; +import { useEnterprise } from '../../hooks/useEnterprise'; + function SettingsPage() { const { settingId } = useParams(); const { settings } = useStrapiApp(); const { formatMessage } = useIntl(); const { isLoading, menu } = useSettingsMenu(); + const routes = useEnterprise( + ROUTES_CE, + async () => (await import('../../../../ee/admin/pages/SettingsPage/constants')).ROUTES_EE, + { + combine(ceRoutes, eeRoutes) { + return [...ceRoutes, ...eeRoutes]; + }, + defaultValue: [], + } + ); // Creates the admin routes const adminRoutes = useMemo(() => { return makeUniqueRoutes( routes.map(({ to, Component, exact }) => createRoute(Component, to, exact)) ); - }, []); + }, [routes]); const pluginsRoutes = createSectionsRoutes(settings); diff --git a/packages/core/admin/admin/src/pages/SettingsPage/utils/customRoutes.js b/packages/core/admin/admin/src/pages/SettingsPage/utils/customRoutes.js deleted file mode 100644 index 090dc83436..0000000000 --- a/packages/core/admin/admin/src/pages/SettingsPage/utils/customRoutes.js +++ /dev/null @@ -1,3 +0,0 @@ -const customRoutes = []; - -export default customRoutes; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/utils/index.js b/packages/core/admin/admin/src/pages/SettingsPage/utils/index.js index 3ea369d8c3..3b1fbde662 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/utils/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/utils/index.js @@ -1,4 +1,2 @@ export { default as createSectionsRoutes } from './createSectionsRoutes'; export { default as getSectionsToDisplay } from './getSectionsToDisplay'; - -export { default as routes } from './routes'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/utils/routes.js b/packages/core/admin/admin/src/pages/SettingsPage/utils/routes.js deleted file mode 100644 index 856e205ae9..0000000000 --- a/packages/core/admin/admin/src/pages/SettingsPage/utils/routes.js +++ /dev/null @@ -1,5 +0,0 @@ -// This file makes it easier to make the difference between the ee and ce version -import customRoutes from 'ee_else_ce/pages/SettingsPage/utils/customRoutes'; -import defaultRoutes from './defaultRoutes'; - -export default [...customRoutes, ...defaultRoutes]; diff --git a/packages/core/admin/ee/admin/hooks/useSettingsMenu/constants.js b/packages/core/admin/ee/admin/hooks/useSettingsMenu/constants.js new file mode 100644 index 0000000000..70badd7c1f --- /dev/null +++ b/packages/core/admin/ee/admin/hooks/useSettingsMenu/constants.js @@ -0,0 +1,46 @@ +import adminPermissions from '../../../../admin/src/permissions'; + +export const LINKS_EE = { + global: [ + ...(window.strapi.features.isEnabled(window.strapi.features.SSO) + ? [ + { + intlLabel: { id: 'Settings.sso.title', defaultMessage: 'Single Sign-On' }, + to: '/settings/single-sign-on', + id: 'sso', + isDisplayed: false, + permissions: adminPermissions.settings.sso.main, + }, + ] + : []), + + ...(window.strapi.features.isEnabled(window.strapi.features.REVIEW_WORKFLOWS) + ? [ + { + intlLabel: { + id: 'Settings.review-workflows.page.title', + defaultMessage: 'Review Workflows', + }, + to: '/settings/review-workflows', + id: 'review-workflows', + isDisplayed: false, + permissions: adminPermissions.settings['review-workflows'].main, + }, + ] + : []), + ], + + admin: [ + ...(window.strapi.features.isEnabled(window.strapi.features.AUDIT_LOGS) + ? [ + { + intlLabel: { id: 'global.auditLogs', defaultMessage: 'Audit Logs' }, + to: '/settings/audit-logs?pageSize=50&page=1&sort=date:DESC', + id: 'auditLogs', + isDisplayed: false, + permissions: adminPermissions.settings.auditLogs.main, + }, + ] + : []), + ], +}; diff --git a/packages/core/admin/ee/admin/hooks/useSettingsMenu/utils/customAdminLinks.js b/packages/core/admin/ee/admin/hooks/useSettingsMenu/utils/customAdminLinks.js deleted file mode 100644 index d4785e2f7a..0000000000 --- a/packages/core/admin/ee/admin/hooks/useSettingsMenu/utils/customAdminLinks.js +++ /dev/null @@ -1,17 +0,0 @@ -import adminPermissions from '../../../../../admin/src/permissions'; - -const items = []; - -if (window.strapi.features.isEnabled(window.strapi.features.AUDIT_LOGS)) { - items.push({ - intlLabel: { id: 'global.auditLogs', defaultMessage: 'Audit Logs' }, - to: '/settings/audit-logs?pageSize=50&page=1&sort=date:DESC', - id: 'auditLogs', - isDisplayed: false, - permissions: adminPermissions.settings.auditLogs.main, - }); -} - -const customAdminLinks = items; - -export default customAdminLinks; diff --git a/packages/core/admin/ee/admin/hooks/useSettingsMenu/utils/customGlobalLinks.js b/packages/core/admin/ee/admin/hooks/useSettingsMenu/utils/customGlobalLinks.js deleted file mode 100644 index fea5e63dc7..0000000000 --- a/packages/core/admin/ee/admin/hooks/useSettingsMenu/utils/customGlobalLinks.js +++ /dev/null @@ -1,25 +0,0 @@ -import adminPermissions from '../../../../../admin/src/permissions'; - -const items = []; - -if (window.strapi.features.isEnabled(window.strapi.features.SSO)) { - items.push({ - intlLabel: { id: 'Settings.sso.title', defaultMessage: 'Single Sign-On' }, - to: '/settings/single-sign-on', - id: 'sso', - isDisplayed: false, - permissions: adminPermissions.settings.sso.main, - }); -} - -if (window.strapi.features.isEnabled(window.strapi.features.REVIEW_WORKFLOWS)) { - items.push({ - intlLabel: { id: 'Settings.review-workflows.page.title', defaultMessage: 'Review Workflows' }, - to: '/settings/review-workflows', - id: 'review-workflows', - isDisplayed: false, - permissions: adminPermissions.settings['review-workflows'].main, - }); -} - -export default items; diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/constants.js b/packages/core/admin/ee/admin/pages/SettingsPage/constants.js new file mode 100644 index 0000000000..9918695c3c --- /dev/null +++ b/packages/core/admin/ee/admin/pages/SettingsPage/constants.js @@ -0,0 +1,49 @@ +export const ROUTES_EE = [ + ...(window.strapi.features.isEnabled(window.strapi.features.AUDIT_LOGS) + ? [ + { + async Component() { + const component = await import( + /* webpackChunkName: "audit-logs-settings-page" */ './pages/AuditLogs/ProtectedListPage' + ); + + return component; + }, + to: '/settings/audit-logs', + exact: true, + }, + ] + : []), + + ...(window.strapi.features.isEnabled(window.strapi.features.REVIEW_WORKFLOWS) + ? [ + { + async Component() { + const component = await import( + /* webpackChunkName: "review-workflows-settings" */ './pages/ReviewWorkflows' + ); + + return component; + }, + to: '/settings/review-workflows', + exact: true, + }, + ] + : []), + + ...(window.strapi.features.isEnabled(window.strapi.features.SSO) + ? [ + { + async Component() { + const component = await import( + /* webpackChunkName: "sso-settings-page" */ './pages/SingleSignOn' + ); + + return component; + }, + to: '/settings/single-sign-on', + exact: true, + }, + ] + : []), +]; diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/utils/customRoutes.js b/packages/core/admin/ee/admin/pages/SettingsPage/utils/customRoutes.js deleted file mode 100644 index dd800e6ad2..0000000000 --- a/packages/core/admin/ee/admin/pages/SettingsPage/utils/customRoutes.js +++ /dev/null @@ -1,45 +0,0 @@ -const routes = []; - -if (window.strapi.features.isEnabled(window.strapi.features.SSO)) { - routes.push({ - async Component() { - const component = await import( - /* webpackChunkName: "sso-settings-page" */ '../pages/SingleSignOn' - ); - - return component; - }, - to: '/settings/single-sign-on', - exact: true, - }); -} - -if (window.strapi.features.isEnabled(window.strapi.features.REVIEW_WORKFLOWS)) { - routes.push({ - async Component() { - const component = await import( - /* webpackChunkName: "review-workflows-settings" */ '../pages/ReviewWorkflows' - ); - - return component; - }, - to: '/settings/review-workflows', - exact: true, - }); -} - -if (window.strapi.features.isEnabled(window.strapi.features.AUDIT_LOGS)) { - routes.push({ - async Component() { - const component = await import( - /* webpackChunkName: "audit-logs-settings-page" */ '../pages/AuditLogs/ProtectedListPage' - ); - - return component; - }, - to: '/settings/audit-logs', - exact: true, - }); -} - -export default routes; From 49629b147babb5bde01e1df09bf2b969148ae700 Mon Sep 17 00:00:00 2001 From: Gustav Hansen Date: Wed, 31 May 2023 17:49:15 +0200 Subject: [PATCH 140/172] Chore: Replace ee_else_ce babel plugin for auth router --- .../core/admin/admin/src/pages/App/constants.js | 2 ++ packages/core/admin/admin/src/pages/App/index.js | 13 +++++++++++-- .../admin/admin/src/pages/App/utils/customRoutes.js | 3 --- .../admin/src/pages/App/utils/defaultRoutes.js | 3 --- .../core/admin/admin/src/pages/App/utils/index.js | 1 - .../core/admin/admin/src/pages/App/utils/routes.js | 4 ---- .../App/{utils/customRoutes.js => constants.js} | 6 ++---- .../core/admin/ee/admin/pages/AuthResponse/index.js | 2 +- 8 files changed, 16 insertions(+), 18 deletions(-) delete mode 100644 packages/core/admin/admin/src/pages/App/utils/customRoutes.js delete mode 100644 packages/core/admin/admin/src/pages/App/utils/defaultRoutes.js delete mode 100644 packages/core/admin/admin/src/pages/App/utils/routes.js rename packages/core/admin/ee/admin/pages/App/{utils/customRoutes.js => constants.js} (53%) diff --git a/packages/core/admin/admin/src/pages/App/constants.js b/packages/core/admin/admin/src/pages/App/constants.js index c714ab8592..863003a1b9 100644 --- a/packages/core/admin/admin/src/pages/App/constants.js +++ b/packages/core/admin/admin/src/pages/App/constants.js @@ -1 +1,3 @@ export const SET_APP_RUNTIME_STATUS = 'StrapiAdmin/APP/SET_APP_RUNTIME_STATUS'; + +export const ROUTES_CE = []; diff --git a/packages/core/admin/admin/src/pages/App/index.js b/packages/core/admin/admin/src/pages/App/index.js index 438c3d800a..4ad71a8478 100644 --- a/packages/core/admin/admin/src/pages/App/index.js +++ b/packages/core/admin/admin/src/pages/App/index.js @@ -17,20 +17,29 @@ import { } from '@strapi/helper-plugin'; import { SkipToContent } from '@strapi/design-system'; import { useIntl } from 'react-intl'; + import PrivateRoute from '../../components/PrivateRoute'; import { createRoute, makeUniqueRoutes } from '../../utils'; import AuthPage from '../AuthPage'; import NotFoundPage from '../NotFoundPage'; import UseCasePage from '../UseCasePage'; import { getUID } from './utils'; -import routes from './utils/routes'; import { useConfigurations } from '../../hooks'; +import { useEnterprise } from '../../hooks/useEnterprise'; +import { ROUTES_CE } from './constants'; const AuthenticatedApp = lazy(() => import(/* webpackChunkName: "Admin-authenticatedApp" */ '../../components/AuthenticatedApp') ); function App() { + const routes = useEnterprise( + ROUTES_CE, + async () => (await import('../../../../ee/admin/pages/App/constants')).ROUTES_EE, + { + defaultValue: [], + } + ); const toggleNotification = useNotification(); const { updateProjectSettings } = useConfigurations(); const { formatMessage } = useIntl(); @@ -45,7 +54,7 @@ function App() { return makeUniqueRoutes( routes.map(({ to, Component, exact }) => createRoute(Component, to, exact)) ); - }, []); + }, [routes]); const [telemetryProperties, setTelemetryProperties] = useState(null); diff --git a/packages/core/admin/admin/src/pages/App/utils/customRoutes.js b/packages/core/admin/admin/src/pages/App/utils/customRoutes.js deleted file mode 100644 index 090dc83436..0000000000 --- a/packages/core/admin/admin/src/pages/App/utils/customRoutes.js +++ /dev/null @@ -1,3 +0,0 @@ -const customRoutes = []; - -export default customRoutes; diff --git a/packages/core/admin/admin/src/pages/App/utils/defaultRoutes.js b/packages/core/admin/admin/src/pages/App/utils/defaultRoutes.js deleted file mode 100644 index a8ac1b41be..0000000000 --- a/packages/core/admin/admin/src/pages/App/utils/defaultRoutes.js +++ /dev/null @@ -1,3 +0,0 @@ -const defaultRoutes = []; - -export default defaultRoutes; diff --git a/packages/core/admin/admin/src/pages/App/utils/index.js b/packages/core/admin/admin/src/pages/App/utils/index.js index e554a192a4..f02e7bddc4 100644 --- a/packages/core/admin/admin/src/pages/App/utils/index.js +++ b/packages/core/admin/admin/src/pages/App/utils/index.js @@ -1,3 +1,2 @@ /* eslint-disable import/prefer-default-export */ export { default as getUID } from './unique-identifier'; -export { default as routes } from './routes'; diff --git a/packages/core/admin/admin/src/pages/App/utils/routes.js b/packages/core/admin/admin/src/pages/App/utils/routes.js deleted file mode 100644 index 11d425c416..0000000000 --- a/packages/core/admin/admin/src/pages/App/utils/routes.js +++ /dev/null @@ -1,4 +0,0 @@ -import customRoutes from 'ee_else_ce/pages/App/utils/customRoutes'; -import defaultRoutes from './defaultRoutes'; - -export default [...customRoutes, ...defaultRoutes]; diff --git a/packages/core/admin/ee/admin/pages/App/utils/customRoutes.js b/packages/core/admin/ee/admin/pages/App/constants.js similarity index 53% rename from packages/core/admin/ee/admin/pages/App/utils/customRoutes.js rename to packages/core/admin/ee/admin/pages/App/constants.js index 785f7758dc..ee674703a7 100644 --- a/packages/core/admin/ee/admin/pages/App/utils/customRoutes.js +++ b/packages/core/admin/ee/admin/pages/App/constants.js @@ -1,11 +1,9 @@ -import AuthResponse from '../../AuthResponse'; +import { AuthResponse } from '../AuthResponse'; -const customRoutes = [ +export const ROUTES_EE = [ { Component: () => ({ default: AuthResponse }), to: '/auth/login/:authResponse', exact: true, }, ]; - -export default customRoutes; diff --git a/packages/core/admin/ee/admin/pages/AuthResponse/index.js b/packages/core/admin/ee/admin/pages/AuthResponse/index.js index dc1b8a7108..8910d99549 100644 --- a/packages/core/admin/ee/admin/pages/AuthResponse/index.js +++ b/packages/core/admin/ee/admin/pages/AuthResponse/index.js @@ -5,7 +5,7 @@ import Cookies from 'js-cookie'; import { auth, LoadingIndicatorPage, useFetchClient } from '@strapi/helper-plugin'; import { getRequestUrl } from '../../../../admin/src/utils'; -const AuthResponse = () => { +export const AuthResponse = () => { const { params: { authResponse }, } = useRouteMatch('/auth/login/:authResponse'); From 588b9cc81645e8fc31f92199d7e3379caa24d531 Mon Sep 17 00:00:00 2001 From: Gustav Hansen Date: Mon, 12 Jun 2023 13:30:21 +0200 Subject: [PATCH 141/172] Chore: Add tests for useEnterprise() hook --- .../useEnterprise/tests/useEnterprise.test.js | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 packages/core/admin/admin/src/hooks/useEnterprise/tests/useEnterprise.test.js diff --git a/packages/core/admin/admin/src/hooks/useEnterprise/tests/useEnterprise.test.js b/packages/core/admin/admin/src/hooks/useEnterprise/tests/useEnterprise.test.js new file mode 100644 index 0000000000..027a1dc660 --- /dev/null +++ b/packages/core/admin/admin/src/hooks/useEnterprise/tests/useEnterprise.test.js @@ -0,0 +1,72 @@ +import { act, renderHook } from '@testing-library/react'; + +import { useEnterprise } from '../useEnterprise'; + +const CE_DATA_FIXTURE = ['CE']; +const EE_DATA_FIXTURE = ['EE']; + +function setup(...args) { + return renderHook(() => useEnterprise(...args)); +} + +describe('useEnterprise (CE)', () => { + test('Returns CE data', async () => { + const { result } = setup(CE_DATA_FIXTURE, async () => EE_DATA_FIXTURE); + + expect(result.current).toBe(CE_DATA_FIXTURE); + }); +}); + +describe('useEnterprise (EE)', () => { + beforeAll(() => { + window.strapi.isEE = true; + }); + + afterAll(() => { + window.strapi.isEE = false; + }); + + test('Returns default data on first render and EE data on second', async () => { + const { result } = setup(CE_DATA_FIXTURE, async () => EE_DATA_FIXTURE); + + await act(async () => { + expect(result.current).toBe(null); + }); + + expect(result.current).toBe(EE_DATA_FIXTURE); + }); + + test('Combines CE and EE data', async () => { + const { result } = setup(CE_DATA_FIXTURE, async () => EE_DATA_FIXTURE, { + combine(ceData, eeData) { + return [...ceData, ...eeData]; + }, + }); + + await act(async () => { + expect(result.current).toBe(null); + }); + + expect(result.current).toStrictEqual([...CE_DATA_FIXTURE, ...EE_DATA_FIXTURE]); + }); + + test('Returns EE data without custom combine', async () => { + const { result } = setup(CE_DATA_FIXTURE, async () => EE_DATA_FIXTURE); + + await act(async () => {}); + + await act(async () => { + expect(result.current).toStrictEqual(EE_DATA_FIXTURE); + }); + }); + + test('Returns a custom defaultValue on first render', async () => { + const { result } = setup(CE_DATA_FIXTURE, async () => EE_DATA_FIXTURE, { + defaultValue: false, + }); + + await act(async () => { + expect(result.current).toBe(false); + }); + }); +}); From 0f7ea4398575caf76c5d11a567c05f3fb7f1d95a Mon Sep 17 00:00:00 2001 From: Gustav Hansen Date: Mon, 12 Jun 2023 13:33:13 +0200 Subject: [PATCH 142/172] Chore: Simplify settings router defaults --- .../core/admin/admin/src/hooks/useSettingsMenu/constants.js | 6 ------ .../core/admin/ee/admin/hooks/useSettingsMenu/constants.js | 3 --- 2 files changed, 9 deletions(-) diff --git a/packages/core/admin/admin/src/hooks/useSettingsMenu/constants.js b/packages/core/admin/admin/src/hooks/useSettingsMenu/constants.js index 6eae1c1d39..6f3af0ed3c 100644 --- a/packages/core/admin/admin/src/hooks/useSettingsMenu/constants.js +++ b/packages/core/admin/admin/src/hooks/useSettingsMenu/constants.js @@ -6,28 +6,24 @@ export const LINKS_CE = { intlLabel: { id: 'Settings.application.title', defaultMessage: 'Overview' }, to: '/settings/application-infos', id: '000-application-infos', - isDisplayed: false, permissions: [], }, { intlLabel: { id: 'Settings.webhooks.title', defaultMessage: 'Webhooks' }, to: '/settings/webhooks', id: 'webhooks', - isDisplayed: false, permissions: adminPermissions.settings.webhooks.main, }, { intlLabel: { id: 'Settings.apiTokens.title', defaultMessage: 'API Tokens' }, to: '/settings/api-tokens?sort=name:ASC', id: 'api-tokens', - isDisplayed: false, permissions: adminPermissions.settings['api-tokens'].main, }, { intlLabel: { id: 'Settings.transferTokens.title', defaultMessage: 'Transfer Tokens' }, to: '/settings/transfer-tokens?sort=name:ASC', id: 'transfer-tokens', - isDisplayed: false, permissions: adminPermissions.settings['transfer-tokens'].main, }, ], @@ -37,7 +33,6 @@ export const LINKS_CE = { intlLabel: { id: 'global.roles', defaultMessage: 'Roles' }, to: '/settings/roles', id: 'roles', - isDisplayed: false, permissions: adminPermissions.settings.roles.main, }, { @@ -45,7 +40,6 @@ export const LINKS_CE = { // Init the search params directly to: '/settings/users?pageSize=10&page=1&sort=firstname', id: 'users', - isDisplayed: false, permissions: adminPermissions.settings.users.main, }, ], diff --git a/packages/core/admin/ee/admin/hooks/useSettingsMenu/constants.js b/packages/core/admin/ee/admin/hooks/useSettingsMenu/constants.js index 70badd7c1f..d009de996a 100644 --- a/packages/core/admin/ee/admin/hooks/useSettingsMenu/constants.js +++ b/packages/core/admin/ee/admin/hooks/useSettingsMenu/constants.js @@ -8,7 +8,6 @@ export const LINKS_EE = { intlLabel: { id: 'Settings.sso.title', defaultMessage: 'Single Sign-On' }, to: '/settings/single-sign-on', id: 'sso', - isDisplayed: false, permissions: adminPermissions.settings.sso.main, }, ] @@ -23,7 +22,6 @@ export const LINKS_EE = { }, to: '/settings/review-workflows', id: 'review-workflows', - isDisplayed: false, permissions: adminPermissions.settings['review-workflows'].main, }, ] @@ -37,7 +35,6 @@ export const LINKS_EE = { intlLabel: { id: 'global.auditLogs', defaultMessage: 'Audit Logs' }, to: '/settings/audit-logs?pageSize=50&page=1&sort=date:DESC', id: 'auditLogs', - isDisplayed: false, permissions: adminPermissions.settings.auditLogs.main, }, ] From 0b01fbf9cc6729527d823c9c36c0065d660965c1 Mon Sep 17 00:00:00 2001 From: Convly Date: Mon, 12 Jun 2023 15:08:53 +0200 Subject: [PATCH 143/172] Fix type for the generic core api service --- packages/core/strapi/lib/types/core-api/service.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/strapi/lib/types/core-api/service.d.ts b/packages/core/strapi/lib/types/core-api/service.d.ts index 314e69cfed..3f502b192c 100644 --- a/packages/core/strapi/lib/types/core-api/service.d.ts +++ b/packages/core/strapi/lib/types/core-api/service.d.ts @@ -14,7 +14,7 @@ export interface Base { * Generic core api service structure */ export type Generic = { - [method: string | number | symbol]: (...args: any) => any; + [key: keyof any]: unknown; }; /** From f5a9528422f5a67526a47fbdaaa5e3ef128f59b8 Mon Sep 17 00:00:00 2001 From: Josh <37798644+joshuaellis@users.noreply.github.com> Date: Mon, 12 Jun 2023 14:55:22 +0100 Subject: [PATCH 144/172] test: update to remove `act` calls --- .../useEnterprise/tests/useEnterprise.test.js | 30 ++++++++----------- 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/packages/core/admin/admin/src/hooks/useEnterprise/tests/useEnterprise.test.js b/packages/core/admin/admin/src/hooks/useEnterprise/tests/useEnterprise.test.js index 027a1dc660..47a8d20824 100644 --- a/packages/core/admin/admin/src/hooks/useEnterprise/tests/useEnterprise.test.js +++ b/packages/core/admin/admin/src/hooks/useEnterprise/tests/useEnterprise.test.js @@ -1,4 +1,4 @@ -import { act, renderHook } from '@testing-library/react'; +import { renderHook, waitFor } from '@testing-library/react'; import { useEnterprise } from '../useEnterprise'; @@ -29,11 +29,9 @@ describe('useEnterprise (EE)', () => { test('Returns default data on first render and EE data on second', async () => { const { result } = setup(CE_DATA_FIXTURE, async () => EE_DATA_FIXTURE); - await act(async () => { - expect(result.current).toBe(null); - }); + expect(result.current).toBe(null); - expect(result.current).toBe(EE_DATA_FIXTURE); + await waitFor(() => expect(result.current).toBe(EE_DATA_FIXTURE)); }); test('Combines CE and EE data', async () => { @@ -43,30 +41,26 @@ describe('useEnterprise (EE)', () => { }, }); - await act(async () => { - expect(result.current).toBe(null); - }); + expect(result.current).toBe(null); - expect(result.current).toStrictEqual([...CE_DATA_FIXTURE, ...EE_DATA_FIXTURE]); + await waitFor(() => + expect(result.current).toStrictEqual([...CE_DATA_FIXTURE, ...EE_DATA_FIXTURE]) + ); }); test('Returns EE data without custom combine', async () => { const { result } = setup(CE_DATA_FIXTURE, async () => EE_DATA_FIXTURE); - await act(async () => {}); - - await act(async () => { - expect(result.current).toStrictEqual(EE_DATA_FIXTURE); - }); + await waitFor(() => expect(result.current).toStrictEqual(EE_DATA_FIXTURE)); }); - test('Returns a custom defaultValue on first render', async () => { + test('Returns a custom defaultValue on first render followed by the EE data', async () => { const { result } = setup(CE_DATA_FIXTURE, async () => EE_DATA_FIXTURE, { defaultValue: false, }); - await act(async () => { - expect(result.current).toBe(false); - }); + expect(result.current).toBe(false); + + await waitFor(() => expect(result.current).toStrictEqual(EE_DATA_FIXTURE)); }); }); From 6cdb5a7737495ca0c7179076ade5361e182ea169 Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Mon, 12 Jun 2023 17:10:44 +0200 Subject: [PATCH 145/172] v4.11.1 --- .github/actions/check-pr-status/package.json | 2 +- examples/getstarted/package.json | 22 +++++++-------- examples/kitchensink-ts/package.json | 8 +++--- examples/kitchensink/package.json | 10 +++---- lerna.json | 2 +- packages/admin-test-utils/package.json | 6 ++-- packages/cli/create-strapi-app/package.json | 8 +++--- .../cli/create-strapi-starter/package.json | 8 +++--- packages/core/admin/package.json | 16 +++++------ packages/core/content-manager/package.json | 4 +-- .../core/content-type-builder/package.json | 10 +++---- packages/core/data-transfer/package.json | 6 ++-- packages/core/database/package.json | 4 +-- packages/core/email/package.json | 8 +++--- packages/core/helper-plugin/package.json | 2 +- packages/core/permissions/package.json | 4 +-- packages/core/strapi/package.json | 28 +++++++++---------- packages/core/upload/package.json | 8 +++--- packages/core/utils/package.json | 2 +- packages/generators/app/package.json | 2 +- packages/generators/generators/package.json | 10 +++---- packages/plugins/color-picker/package.json | 4 +-- packages/plugins/documentation/package.json | 6 ++-- packages/plugins/graphql/package.json | 6 ++-- packages/plugins/i18n/package.json | 6 ++-- packages/plugins/sentry/package.json | 4 +-- .../plugins/users-permissions/package.json | 6 ++-- .../providers/audit-logs-local/package.json | 6 ++-- .../providers/email-amazon-ses/package.json | 8 +++--- packages/providers/email-mailgun/package.json | 8 +++--- .../providers/email-nodemailer/package.json | 6 ++-- .../providers/email-sendgrid/package.json | 8 +++--- .../providers/email-sendmail/package.json | 8 +++--- packages/providers/upload-aws-s3/package.json | 6 ++-- .../providers/upload-cloudinary/package.json | 8 +++--- packages/providers/upload-local/package.json | 8 +++--- packages/utils/api-tests/package.json | 2 +- .../babel-plugin-switch-ee-ce/package.json | 2 +- .../utils/eslint-config-custom/package.json | 2 +- packages/utils/logger/package.json | 6 ++-- packages/utils/tsconfig/package.json | 2 +- packages/utils/typescript/package.json | 2 +- scripts/front/package.json | 2 +- 43 files changed, 143 insertions(+), 143 deletions(-) diff --git a/.github/actions/check-pr-status/package.json b/.github/actions/check-pr-status/package.json index 0f9f8a7956..fd39aabb5c 100644 --- a/.github/actions/check-pr-status/package.json +++ b/.github/actions/check-pr-status/package.json @@ -1,6 +1,6 @@ { "name": "check-pr-status", - "version": "4.11.0", + "version": "4.11.1", "main": "dist/index.js", "license": "MIT", "private": true, diff --git a/examples/getstarted/package.json b/examples/getstarted/package.json index 2fa8f80e9f..6b6be5153d 100644 --- a/examples/getstarted/package.json +++ b/examples/getstarted/package.json @@ -1,7 +1,7 @@ { "name": "getstarted", "private": true, - "version": "4.11.0", + "version": "4.11.1", "description": "A Strapi application.", "scripts": { "develop": "strapi develop", @@ -13,16 +13,16 @@ }, "dependencies": { "@strapi/icons": "1.8.0", - "@strapi/plugin-color-picker": "4.11.0", - "@strapi/plugin-documentation": "4.11.0", - "@strapi/plugin-graphql": "4.11.0", - "@strapi/plugin-i18n": "4.11.0", - "@strapi/plugin-sentry": "4.11.0", - "@strapi/plugin-users-permissions": "4.11.0", - "@strapi/provider-email-mailgun": "4.11.0", - "@strapi/provider-upload-aws-s3": "4.11.0", - "@strapi/provider-upload-cloudinary": "4.11.0", - "@strapi/strapi": "4.11.0", + "@strapi/plugin-color-picker": "4.11.1", + "@strapi/plugin-documentation": "4.11.1", + "@strapi/plugin-graphql": "4.11.1", + "@strapi/plugin-i18n": "4.11.1", + "@strapi/plugin-sentry": "4.11.1", + "@strapi/plugin-users-permissions": "4.11.1", + "@strapi/provider-email-mailgun": "4.11.1", + "@strapi/provider-upload-aws-s3": "4.11.1", + "@strapi/provider-upload-cloudinary": "4.11.1", + "@strapi/strapi": "4.11.1", "better-sqlite3": "8.3.0", "lodash": "4.17.21", "mysql": "2.18.1", diff --git a/examples/kitchensink-ts/package.json b/examples/kitchensink-ts/package.json index 1d2e35b39a..95d82ff0ba 100644 --- a/examples/kitchensink-ts/package.json +++ b/examples/kitchensink-ts/package.json @@ -1,7 +1,7 @@ { "name": "kitchensink-ts", "private": true, - "version": "4.11.0", + "version": "4.11.1", "description": "A Strapi application", "scripts": { "develop": "strapi develop", @@ -10,9 +10,9 @@ "strapi": "strapi" }, "dependencies": { - "@strapi/plugin-i18n": "4.11.0", - "@strapi/plugin-users-permissions": "4.11.0", - "@strapi/strapi": "4.11.0", + "@strapi/plugin-i18n": "4.11.1", + "@strapi/plugin-users-permissions": "4.11.1", + "@strapi/strapi": "4.11.1", "better-sqlite3": "8.3.0", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/examples/kitchensink/package.json b/examples/kitchensink/package.json index 0c4d303c1e..040c1f3500 100644 --- a/examples/kitchensink/package.json +++ b/examples/kitchensink/package.json @@ -1,7 +1,7 @@ { "name": "kitchensink", "private": true, - "version": "4.11.0", + "version": "4.11.1", "description": "A Strapi application.", "scripts": { "develop": "strapi develop", @@ -12,10 +12,10 @@ "strapi": "strapi" }, "dependencies": { - "@strapi/provider-email-mailgun": "4.11.0", - "@strapi/provider-upload-aws-s3": "4.11.0", - "@strapi/provider-upload-cloudinary": "4.11.0", - "@strapi/strapi": "4.11.0", + "@strapi/provider-email-mailgun": "4.11.1", + "@strapi/provider-upload-aws-s3": "4.11.1", + "@strapi/provider-upload-cloudinary": "4.11.1", + "@strapi/strapi": "4.11.1", "lodash": "4.17.21", "mysql": "2.18.1", "passport-google-oauth2": "0.2.0", diff --git a/lerna.json b/lerna.json index 436a6d5afb..64fe4509cd 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "4.11.0", + "version": "4.11.1", "packages": ["packages/*", "examples/*"], "npmClient": "yarn", "useWorkspaces": true, diff --git a/packages/admin-test-utils/package.json b/packages/admin-test-utils/package.json index b34da39c22..634fea66d6 100644 --- a/packages/admin-test-utils/package.json +++ b/packages/admin-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/admin-test-utils", - "version": "4.11.0", + "version": "4.11.1", "private": true, "description": "Test utilities for the Strapi administration panel", "license": "MIT", @@ -42,9 +42,9 @@ "whatwg-fetch": "3.6.2" }, "devDependencies": { - "eslint-config-custom": "4.11.0", + "eslint-config-custom": "4.11.1", "redux": "^4.2.1", - "tsconfig": "4.11.0" + "tsconfig": "4.11.1" }, "peerDependencies": { "redux": "^4.2.1" diff --git a/packages/cli/create-strapi-app/package.json b/packages/cli/create-strapi-app/package.json index 15f17e21e6..f1fb293a26 100644 --- a/packages/cli/create-strapi-app/package.json +++ b/packages/cli/create-strapi-app/package.json @@ -1,9 +1,9 @@ { "name": "create-strapi-app", - "version": "4.11.0", + "version": "4.11.1", "description": "Generate a new Strapi application.", "dependencies": { - "@strapi/generate-new": "4.11.0", + "@strapi/generate-new": "4.11.1", "commander": "8.3.0", "inquirer": "8.2.5" }, @@ -49,8 +49,8 @@ "lint": "run -T eslint ." }, "devDependencies": { - "eslint-config-custom": "4.11.0", - "tsconfig": "4.11.0" + "eslint-config-custom": "4.11.1", + "tsconfig": "4.11.1" }, "engines": { "node": ">=14.19.1 <=18.x.x", diff --git a/packages/cli/create-strapi-starter/package.json b/packages/cli/create-strapi-starter/package.json index 8445a5c87e..e50518e2a3 100644 --- a/packages/cli/create-strapi-starter/package.json +++ b/packages/cli/create-strapi-starter/package.json @@ -1,6 +1,6 @@ { "name": "create-strapi-starter", - "version": "4.11.0", + "version": "4.11.1", "description": "Generate a new Strapi application.", "keywords": [ "create-strapi-starter", @@ -44,7 +44,7 @@ "lint": "run -T eslint ." }, "dependencies": { - "@strapi/generate-new": "4.11.0", + "@strapi/generate-new": "4.11.1", "chalk": "4.1.2", "ci-info": "3.8.0", "commander": "8.3.0", @@ -54,8 +54,8 @@ "ora": "5.4.1" }, "devDependencies": { - "eslint-config-custom": "4.11.0", - "tsconfig": "4.11.0" + "eslint-config-custom": "4.11.1", + "tsconfig": "4.11.1" }, "engines": { "node": ">=14.19.1 <=18.x.x", diff --git a/packages/core/admin/package.json b/packages/core/admin/package.json index 32aee15cc1..f19a0a719b 100644 --- a/packages/core/admin/package.json +++ b/packages/core/admin/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/admin", - "version": "4.11.0", + "version": "4.11.1", "description": "Strapi Admin", "repository": { "type": "git", @@ -48,15 +48,15 @@ "@casl/ability": "^5.4.3", "@fingerprintjs/fingerprintjs": "3.4.1", "@pmmmwh/react-refresh-webpack-plugin": "0.5.10", - "@strapi/babel-plugin-switch-ee-ce": "4.11.0", - "@strapi/data-transfer": "4.11.0", + "@strapi/babel-plugin-switch-ee-ce": "4.11.1", + "@strapi/data-transfer": "4.11.1", "@strapi/design-system": "1.8.0", - "@strapi/helper-plugin": "4.11.0", + "@strapi/helper-plugin": "4.11.1", "@strapi/icons": "1.8.0", - "@strapi/permissions": "4.11.0", - "@strapi/provider-audit-logs-local": "4.11.0", - "@strapi/typescript-utils": "4.11.0", - "@strapi/utils": "4.11.0", + "@strapi/permissions": "4.11.1", + "@strapi/provider-audit-logs-local": "4.11.1", + "@strapi/typescript-utils": "4.11.1", + "@strapi/utils": "4.11.1", "axios": "1.4.0", "babel-loader": "^9.1.2", "babel-plugin-styled-components": "2.1.1", diff --git a/packages/core/content-manager/package.json b/packages/core/content-manager/package.json index 385223c07d..b54cd35c5a 100644 --- a/packages/core/content-manager/package.json +++ b/packages/core/content-manager/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/plugin-content-manager", - "version": "4.11.0", + "version": "4.11.1", "description": "A powerful UI to easily manage your data.", "repository": { "type": "git", @@ -26,7 +26,7 @@ }, "dependencies": { "@sindresorhus/slugify": "1.1.0", - "@strapi/utils": "4.11.0", + "@strapi/utils": "4.11.1", "lodash": "4.17.21" }, "engines": { diff --git a/packages/core/content-type-builder/package.json b/packages/core/content-type-builder/package.json index 30145aa2ca..829e96d7ed 100644 --- a/packages/core/content-type-builder/package.json +++ b/packages/core/content-type-builder/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/plugin-content-type-builder", - "version": "4.11.0", + "version": "4.11.1", "description": "Strapi plugin to create content type", "repository": { "type": "git", @@ -31,10 +31,10 @@ "dependencies": { "@sindresorhus/slugify": "1.1.0", "@strapi/design-system": "1.8.0", - "@strapi/generators": "4.11.0", - "@strapi/helper-plugin": "4.11.0", + "@strapi/generators": "4.11.1", + "@strapi/helper-plugin": "4.11.1", "@strapi/icons": "1.8.0", - "@strapi/utils": "4.11.0", + "@strapi/utils": "4.11.1", "fs-extra": "10.0.0", "immer": "9.0.19", "lodash": "4.17.21", @@ -49,7 +49,7 @@ "yup": "^0.32.9" }, "devDependencies": { - "@strapi/admin": "4.11.0", + "@strapi/admin": "4.11.1", "@testing-library/react": "14.0.0", "@testing-library/react-hooks": "8.0.1", "history": "^4.9.0", diff --git a/packages/core/data-transfer/package.json b/packages/core/data-transfer/package.json index 15e2b5f6c3..757b5b72a6 100644 --- a/packages/core/data-transfer/package.json +++ b/packages/core/data-transfer/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/data-transfer", - "version": "4.11.0", + "version": "4.11.1", "description": "Data transfer capabilities for Strapi", "keywords": [ "strapi", @@ -40,8 +40,8 @@ "./dist" ], "dependencies": { - "@strapi/logger": "4.11.0", - "@strapi/strapi": "4.11.0", + "@strapi/logger": "4.11.1", + "@strapi/strapi": "4.11.1", "chalk": "4.1.2", "fs-extra": "10.0.0", "lodash": "4.17.21", diff --git a/packages/core/database/package.json b/packages/core/database/package.json index 0bebe12058..07123dd385 100644 --- a/packages/core/database/package.json +++ b/packages/core/database/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/database", - "version": "4.11.0", + "version": "4.11.1", "description": "Strapi's database layer", "homepage": "https://strapi.io", "bugs": { @@ -33,7 +33,7 @@ "lint": "run -T eslint ." }, "dependencies": { - "@strapi/utils": "4.11.0", + "@strapi/utils": "4.11.1", "date-fns": "2.30.0", "debug": "4.3.4", "fs-extra": "10.0.0", diff --git a/packages/core/email/package.json b/packages/core/email/package.json index 584f8bd3aa..5ff1a60042 100644 --- a/packages/core/email/package.json +++ b/packages/core/email/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/plugin-email", - "version": "4.11.0", + "version": "4.11.1", "description": "Easily configure your Strapi application to send emails.", "repository": { "type": "git", @@ -29,15 +29,15 @@ "dependencies": { "@strapi/design-system": "1.8.0", "@strapi/icons": "1.8.0", - "@strapi/provider-email-sendmail": "4.11.0", - "@strapi/utils": "4.11.0", + "@strapi/provider-email-sendmail": "4.11.1", + "@strapi/utils": "4.11.1", "lodash": "4.17.21", "prop-types": "^15.8.1", "react-intl": "6.4.1", "yup": "^0.32.9" }, "devDependencies": { - "@strapi/helper-plugin": "4.11.0", + "@strapi/helper-plugin": "4.11.1", "@testing-library/react": "14.0.0", "msw": "1.2.1", "react": "^18.2.0", diff --git a/packages/core/helper-plugin/package.json b/packages/core/helper-plugin/package.json index 899141897e..20295dcfdc 100644 --- a/packages/core/helper-plugin/package.json +++ b/packages/core/helper-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/helper-plugin", - "version": "4.11.0", + "version": "4.11.1", "description": "Helper for Strapi plugins development", "repository": { "type": "git", diff --git a/packages/core/permissions/package.json b/packages/core/permissions/package.json index d6464cf715..0e51f7dc39 100644 --- a/packages/core/permissions/package.json +++ b/packages/core/permissions/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/permissions", - "version": "4.11.0", + "version": "4.11.1", "description": "Strapi's permission layer.", "repository": { "type": "git", @@ -27,7 +27,7 @@ }, "dependencies": { "@casl/ability": "5.4.4", - "@strapi/utils": "4.11.0", + "@strapi/utils": "4.11.1", "lodash": "4.17.21", "sift": "16.0.1" }, diff --git a/packages/core/strapi/package.json b/packages/core/strapi/package.json index 534d8d7d4f..3ce2458a42 100644 --- a/packages/core/strapi/package.json +++ b/packages/core/strapi/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/strapi", - "version": "4.11.0", + "version": "4.11.1", "description": "An open source headless CMS solution to create and manage your own API. It provides a powerful dashboard and features to make your life easier. Databases supported: MySQL, MariaDB, PostgreSQL, SQLite", "keywords": [ "strapi", @@ -81,19 +81,19 @@ "dependencies": { "@koa/cors": "3.4.3", "@koa/router": "10.1.1", - "@strapi/admin": "4.11.0", - "@strapi/data-transfer": "4.11.0", - "@strapi/database": "4.11.0", - "@strapi/generate-new": "4.11.0", - "@strapi/generators": "4.11.0", - "@strapi/logger": "4.11.0", - "@strapi/permissions": "4.11.0", - "@strapi/plugin-content-manager": "4.11.0", - "@strapi/plugin-content-type-builder": "4.11.0", - "@strapi/plugin-email": "4.11.0", - "@strapi/plugin-upload": "4.11.0", - "@strapi/typescript-utils": "4.11.0", - "@strapi/utils": "4.11.0", + "@strapi/admin": "4.11.1", + "@strapi/data-transfer": "4.11.1", + "@strapi/database": "4.11.1", + "@strapi/generate-new": "4.11.1", + "@strapi/generators": "4.11.1", + "@strapi/logger": "4.11.1", + "@strapi/permissions": "4.11.1", + "@strapi/plugin-content-manager": "4.11.1", + "@strapi/plugin-content-type-builder": "4.11.1", + "@strapi/plugin-email": "4.11.1", + "@strapi/plugin-upload": "4.11.1", + "@strapi/typescript-utils": "4.11.1", + "@strapi/utils": "4.11.1", "bcryptjs": "2.4.3", "boxen": "5.1.2", "chalk": "4.1.2", diff --git a/packages/core/upload/package.json b/packages/core/upload/package.json index 7484eb34ef..507e3bda2a 100644 --- a/packages/core/upload/package.json +++ b/packages/core/upload/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/plugin-upload", - "version": "4.11.0", + "version": "4.11.1", "description": "Makes it easy to upload images and files to your Strapi Application.", "license": "SEE LICENSE IN LICENSE", "author": { @@ -26,10 +26,10 @@ }, "dependencies": { "@strapi/design-system": "1.8.0", - "@strapi/helper-plugin": "4.11.0", + "@strapi/helper-plugin": "4.11.1", "@strapi/icons": "1.8.0", - "@strapi/provider-upload-local": "4.11.0", - "@strapi/utils": "4.11.0", + "@strapi/provider-upload-local": "4.11.1", + "@strapi/utils": "4.11.1", "axios": "1.4.0", "byte-size": "7.0.1", "cropperjs": "1.5.12", diff --git a/packages/core/utils/package.json b/packages/core/utils/package.json index c3fa7d4c88..dc20acc008 100644 --- a/packages/core/utils/package.json +++ b/packages/core/utils/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/utils", - "version": "4.11.0", + "version": "4.11.1", "description": "Shared utilities for the Strapi packages", "keywords": [ "strapi", diff --git a/packages/generators/app/package.json b/packages/generators/app/package.json index b7091d22e3..bcd23aeaea 100644 --- a/packages/generators/app/package.json +++ b/packages/generators/app/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/generate-new", - "version": "4.11.0", + "version": "4.11.1", "description": "Generate a new Strapi application.", "keywords": [ "generate", diff --git a/packages/generators/generators/package.json b/packages/generators/generators/package.json index 43cc79a43a..69e36ec109 100644 --- a/packages/generators/generators/package.json +++ b/packages/generators/generators/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/generators", - "version": "4.11.0", + "version": "4.11.1", "description": "Interactive API generator.", "keywords": [ "strapi", @@ -45,8 +45,8 @@ }, "dependencies": { "@sindresorhus/slugify": "1.1.0", - "@strapi/typescript-utils": "4.11.0", - "@strapi/utils": "4.11.0", + "@strapi/typescript-utils": "4.11.1", + "@strapi/utils": "4.11.1", "chalk": "4.1.2", "copyfiles": "2.4.1", "fs-extra": "10.0.0", @@ -55,8 +55,8 @@ "pluralize": "8.0.0" }, "devDependencies": { - "eslint-config-custom": "4.11.0", - "tsconfig": "4.11.0" + "eslint-config-custom": "4.11.1", + "tsconfig": "4.11.1" }, "engines": { "node": ">=14.19.1 <=18.x.x", diff --git a/packages/plugins/color-picker/package.json b/packages/plugins/color-picker/package.json index eae049f8b0..82007d1958 100644 --- a/packages/plugins/color-picker/package.json +++ b/packages/plugins/color-picker/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/plugin-color-picker", - "version": "4.11.0", + "version": "4.11.1", "description": "Strapi maintained Custom Fields", "strapi": { "name": "color-picker", @@ -10,7 +10,7 @@ }, "dependencies": { "@strapi/design-system": "1.8.0", - "@strapi/helper-plugin": "4.11.0", + "@strapi/helper-plugin": "4.11.1", "@strapi/icons": "1.8.0", "prop-types": "^15.8.1", "react-colorful": "5.6.1", diff --git a/packages/plugins/documentation/package.json b/packages/plugins/documentation/package.json index b8f475a18b..110d099d12 100644 --- a/packages/plugins/documentation/package.json +++ b/packages/plugins/documentation/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/plugin-documentation", - "version": "4.11.0", + "version": "4.11.1", "description": "Create an OpenAPI Document and visualize your API with SWAGGER UI.", "repository": { "type": "git", @@ -31,9 +31,9 @@ }, "dependencies": { "@strapi/design-system": "1.8.0", - "@strapi/helper-plugin": "4.11.0", + "@strapi/helper-plugin": "4.11.1", "@strapi/icons": "1.8.0", - "@strapi/utils": "4.11.0", + "@strapi/utils": "4.11.1", "bcryptjs": "2.4.3", "cheerio": "^1.0.0-rc.12", "formik": "2.4.0", diff --git a/packages/plugins/graphql/package.json b/packages/plugins/graphql/package.json index 8185b56b69..dcfad30fb2 100644 --- a/packages/plugins/graphql/package.json +++ b/packages/plugins/graphql/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/plugin-graphql", - "version": "4.11.0", + "version": "4.11.1", "description": "Adds GraphQL endpoint with default API methods.", "repository": { "type": "git", @@ -27,9 +27,9 @@ "@graphql-tools/schema": "8.5.1", "@graphql-tools/utils": "^8.13.1", "@strapi/design-system": "1.8.0", - "@strapi/helper-plugin": "4.11.0", + "@strapi/helper-plugin": "4.11.1", "@strapi/icons": "1.8.0", - "@strapi/utils": "4.11.0", + "@strapi/utils": "4.11.1", "apollo-server-core": "3.12.0", "apollo-server-koa": "3.10.0", "glob": "^7.1.7", diff --git a/packages/plugins/i18n/package.json b/packages/plugins/i18n/package.json index d3e5fc5a93..b47c8762f6 100644 --- a/packages/plugins/i18n/package.json +++ b/packages/plugins/i18n/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/plugin-i18n", - "version": "4.11.0", + "version": "4.11.1", "description": "This plugin enables to create, to read and to update content in different languages, both from the Admin Panel and from the API", "repository": { "type": "git", @@ -31,9 +31,9 @@ }, "dependencies": { "@strapi/design-system": "1.8.0", - "@strapi/helper-plugin": "4.11.0", + "@strapi/helper-plugin": "4.11.1", "@strapi/icons": "1.8.0", - "@strapi/utils": "4.11.0", + "@strapi/utils": "4.11.1", "formik": "2.4.0", "immer": "9.0.19", "lodash": "4.17.21", diff --git a/packages/plugins/sentry/package.json b/packages/plugins/sentry/package.json index 036fc68e26..f820149b93 100644 --- a/packages/plugins/sentry/package.json +++ b/packages/plugins/sentry/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/plugin-sentry", - "version": "4.11.0", + "version": "4.11.1", "description": "Send Strapi error events to Sentry", "repository": { "type": "git", @@ -28,7 +28,7 @@ "dependencies": { "@sentry/node": "6.19.7", "@strapi/design-system": "1.8.0", - "@strapi/helper-plugin": "4.11.0", + "@strapi/helper-plugin": "4.11.1", "@strapi/icons": "1.8.0" }, "devDependencies": { diff --git a/packages/plugins/users-permissions/package.json b/packages/plugins/users-permissions/package.json index 25a3241f15..31643adacd 100644 --- a/packages/plugins/users-permissions/package.json +++ b/packages/plugins/users-permissions/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/plugin-users-permissions", - "version": "4.11.0", + "version": "4.11.1", "description": "Protect your API with a full-authentication process based on JWT", "repository": { "type": "git", @@ -30,9 +30,9 @@ }, "dependencies": { "@strapi/design-system": "1.8.0", - "@strapi/helper-plugin": "4.11.0", + "@strapi/helper-plugin": "4.11.1", "@strapi/icons": "1.8.0", - "@strapi/utils": "4.11.0", + "@strapi/utils": "4.11.1", "bcryptjs": "2.4.3", "formik": "2.4.0", "grant-koa": "5.4.8", diff --git a/packages/providers/audit-logs-local/package.json b/packages/providers/audit-logs-local/package.json index aefeff3b2f..01a4b34c51 100644 --- a/packages/providers/audit-logs-local/package.json +++ b/packages/providers/audit-logs-local/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/provider-audit-logs-local", - "version": "4.11.0", + "version": "4.11.1", "description": "Local provider for strapi audit logs", "keywords": [ "audit-logs", @@ -41,8 +41,8 @@ "lint": "run -T eslint ." }, "devDependencies": { - "eslint-config-custom": "4.11.0", - "tsconfig": "4.11.0" + "eslint-config-custom": "4.11.1", + "tsconfig": "4.11.1" }, "peerDependencies": { "@strapi/strapi": "^4.9.0" diff --git a/packages/providers/email-amazon-ses/package.json b/packages/providers/email-amazon-ses/package.json index 1534c792cb..081c6b9e5b 100644 --- a/packages/providers/email-amazon-ses/package.json +++ b/packages/providers/email-amazon-ses/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/provider-email-amazon-ses", - "version": "4.11.0", + "version": "4.11.1", "description": "Amazon SES provider for strapi email", "keywords": [ "email", @@ -42,12 +42,12 @@ "lint": "run -T eslint ." }, "dependencies": { - "@strapi/utils": "4.11.0", + "@strapi/utils": "4.11.1", "node-ses": "^3.0.3" }, "devDependencies": { - "eslint-config-custom": "4.11.0", - "tsconfig": "4.11.0" + "eslint-config-custom": "4.11.1", + "tsconfig": "4.11.1" }, "engines": { "node": ">=14.19.1 <=18.x.x", diff --git a/packages/providers/email-mailgun/package.json b/packages/providers/email-mailgun/package.json index ac1ea40fa2..10aaeea475 100644 --- a/packages/providers/email-mailgun/package.json +++ b/packages/providers/email-mailgun/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/provider-email-mailgun", - "version": "4.11.0", + "version": "4.11.1", "description": "Mailgun provider for strapi email plugin", "keywords": [ "email", @@ -44,13 +44,13 @@ "lint": "run -T eslint ." }, "dependencies": { - "@strapi/utils": "4.11.0", + "@strapi/utils": "4.11.1", "form-data": "^4.0.0", "mailgun.js": "8.2.1" }, "devDependencies": { - "eslint-config-custom": "4.11.0", - "tsconfig": "4.11.0" + "eslint-config-custom": "4.11.1", + "tsconfig": "4.11.1" }, "engines": { "node": ">=14.19.1 <=18.x.x", diff --git a/packages/providers/email-nodemailer/package.json b/packages/providers/email-nodemailer/package.json index 4e6b4b9470..5636058fc5 100644 --- a/packages/providers/email-nodemailer/package.json +++ b/packages/providers/email-nodemailer/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/provider-email-nodemailer", - "version": "4.11.0", + "version": "4.11.1", "description": "Nodemailer provider for Strapi 3", "keywords": [ "strapi", @@ -60,8 +60,8 @@ }, "devDependencies": { "@types/nodemailer": "6.4.7", - "eslint-config-custom": "4.11.0", - "tsconfig": "4.11.0" + "eslint-config-custom": "4.11.1", + "tsconfig": "4.11.1" }, "engines": { "node": ">=14.19.1 <=18.x.x", diff --git a/packages/providers/email-sendgrid/package.json b/packages/providers/email-sendgrid/package.json index 9e8f50fb64..750ebd615a 100644 --- a/packages/providers/email-sendgrid/package.json +++ b/packages/providers/email-sendgrid/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/provider-email-sendgrid", - "version": "4.11.0", + "version": "4.11.1", "description": "Sendgrid provider for strapi email", "keywords": [ "email", @@ -43,11 +43,11 @@ }, "dependencies": { "@sendgrid/mail": "7.7.0", - "@strapi/utils": "4.11.0" + "@strapi/utils": "4.11.1" }, "devDependencies": { - "eslint-config-custom": "4.11.0", - "tsconfig": "4.11.0" + "eslint-config-custom": "4.11.1", + "tsconfig": "4.11.1" }, "engines": { "node": ">=14.19.1 <=18.x.x", diff --git a/packages/providers/email-sendmail/package.json b/packages/providers/email-sendmail/package.json index 6d06dd7823..470a33590a 100644 --- a/packages/providers/email-sendmail/package.json +++ b/packages/providers/email-sendmail/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/provider-email-sendmail", - "version": "4.11.0", + "version": "4.11.1", "description": "Sendmail provider for strapi email", "keywords": [ "email", @@ -41,13 +41,13 @@ "lint": "run -T eslint ." }, "dependencies": { - "@strapi/utils": "4.11.0", + "@strapi/utils": "4.11.1", "sendmail": "^1.6.1" }, "devDependencies": { "@types/sendmail": "1.4.4", - "eslint-config-custom": "4.11.0", - "tsconfig": "4.11.0" + "eslint-config-custom": "4.11.1", + "tsconfig": "4.11.1" }, "engines": { "node": ">=14.19.1 <=18.x.x", diff --git a/packages/providers/upload-aws-s3/package.json b/packages/providers/upload-aws-s3/package.json index 891d6db78e..2740a4b759 100644 --- a/packages/providers/upload-aws-s3/package.json +++ b/packages/providers/upload-aws-s3/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/provider-upload-aws-s3", - "version": "4.11.0", + "version": "4.11.1", "description": "AWS S3 provider for strapi upload", "keywords": [ "upload", @@ -50,8 +50,8 @@ }, "devDependencies": { "@types/jest": "29.2.0", - "eslint-config-custom": "4.11.0", - "tsconfig": "4.11.0" + "eslint-config-custom": "4.11.1", + "tsconfig": "4.11.1" }, "engines": { "node": ">=14.19.1 <=18.x.x", diff --git a/packages/providers/upload-cloudinary/package.json b/packages/providers/upload-cloudinary/package.json index f54f47ed61..2cd1bee81c 100644 --- a/packages/providers/upload-cloudinary/package.json +++ b/packages/providers/upload-cloudinary/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/provider-upload-cloudinary", - "version": "4.11.0", + "version": "4.11.1", "description": "Cloudinary provider for strapi upload", "keywords": [ "upload", @@ -42,13 +42,13 @@ "lint": "run -T eslint ." }, "dependencies": { - "@strapi/utils": "4.11.0", + "@strapi/utils": "4.11.1", "cloudinary": "^1.37.0", "into-stream": "^5.1.0" }, "devDependencies": { - "eslint-config-custom": "4.11.0", - "tsconfig": "4.11.0" + "eslint-config-custom": "4.11.1", + "tsconfig": "4.11.1" }, "engines": { "node": ">=14.19.1 <=18.x.x", diff --git a/packages/providers/upload-local/package.json b/packages/providers/upload-local/package.json index 29e2059e2e..1c9f9eabfc 100644 --- a/packages/providers/upload-local/package.json +++ b/packages/providers/upload-local/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/provider-upload-local", - "version": "4.11.0", + "version": "4.11.1", "description": "Local provider for strapi upload", "keywords": [ "upload", @@ -43,13 +43,13 @@ "lint": "run -T eslint ." }, "dependencies": { - "@strapi/utils": "4.11.0", + "@strapi/utils": "4.11.1", "fs-extra": "10.0.0" }, "devDependencies": { "@types/jest": "29.2.0", - "eslint-config-custom": "4.11.0", - "tsconfig": "4.11.0" + "eslint-config-custom": "4.11.1", + "tsconfig": "4.11.1" }, "engines": { "node": ">=14.19.1 <=18.x.x", diff --git a/packages/utils/api-tests/package.json b/packages/utils/api-tests/package.json index b2183db5e0..b34b468916 100644 --- a/packages/utils/api-tests/package.json +++ b/packages/utils/api-tests/package.json @@ -1,6 +1,6 @@ { "name": "api-tests", - "version": "4.11.0", + "version": "4.11.1", "private": true, "dependencies": { "dotenv": "14.2.0", diff --git a/packages/utils/babel-plugin-switch-ee-ce/package.json b/packages/utils/babel-plugin-switch-ee-ce/package.json index 011ba6cecd..e3c8a5e259 100644 --- a/packages/utils/babel-plugin-switch-ee-ce/package.json +++ b/packages/utils/babel-plugin-switch-ee-ce/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/babel-plugin-switch-ee-ce", - "version": "4.11.0", + "version": "4.11.1", "description": "Babel plugin to switch from CE to EE at runtime", "repository": "git://github.com/strapi/strapi.git", "license": "SEE LICENSE IN LICENSE", diff --git a/packages/utils/eslint-config-custom/package.json b/packages/utils/eslint-config-custom/package.json index 7b1d239770..9853acc6a4 100644 --- a/packages/utils/eslint-config-custom/package.json +++ b/packages/utils/eslint-config-custom/package.json @@ -1,6 +1,6 @@ { "name": "eslint-config-custom", "main": "index.js", - "version": "4.11.0", + "version": "4.11.1", "private": true } diff --git a/packages/utils/logger/package.json b/packages/utils/logger/package.json index 444010f3c2..b588c90074 100644 --- a/packages/utils/logger/package.json +++ b/packages/utils/logger/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/logger", - "version": "4.11.0", + "version": "4.11.1", "description": "Strapi's logger", "homepage": "https://strapi.io", "bugs": { @@ -41,8 +41,8 @@ "winston": "3.3.3" }, "devDependencies": { - "eslint-config-custom": "4.11.0", - "tsconfig": "4.11.0" + "eslint-config-custom": "4.11.1", + "tsconfig": "4.11.1" }, "engines": { "node": ">=14.19.1 <=18.x.x", diff --git a/packages/utils/tsconfig/package.json b/packages/utils/tsconfig/package.json index eace498e2c..75c925e4c8 100644 --- a/packages/utils/tsconfig/package.json +++ b/packages/utils/tsconfig/package.json @@ -1,5 +1,5 @@ { "name": "tsconfig", - "version": "4.11.0", + "version": "4.11.1", "private": true } diff --git a/packages/utils/typescript/package.json b/packages/utils/typescript/package.json index 942f18f591..1561f57e48 100644 --- a/packages/utils/typescript/package.json +++ b/packages/utils/typescript/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/typescript-utils", - "version": "4.11.0", + "version": "4.11.1", "description": "Typescript support for Strapi", "keywords": [ "strapi", diff --git a/scripts/front/package.json b/scripts/front/package.json index 7e3faf3ff5..bef096ecd5 100644 --- a/scripts/front/package.json +++ b/scripts/front/package.json @@ -1,7 +1,7 @@ { "name": "scripts-front", "private": true, - "version": "4.11.0", + "version": "4.11.1", "scripts": { "test:front": "jest --config jest.config.front.js" } From ae3463646df0af56066ae8738372a837c9aba773 Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Mon, 12 Jun 2023 17:14:00 +0200 Subject: [PATCH 146/172] update: yarn lock --- yarn.lock | 260 +++++++++++++++++++++++++++--------------------------- 1 file changed, 130 insertions(+), 130 deletions(-) diff --git a/yarn.lock b/yarn.lock index 921c14f8e9..62efac18fe 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7867,17 +7867,17 @@ __metadata: dependencies: "@juggle/resize-observer": 3.4.0 "@testing-library/jest-dom": 5.16.5 - eslint-config-custom: 4.11.0 + eslint-config-custom: 4.11.1 jest-styled-components: 7.1.1 redux: ^4.2.1 - tsconfig: 4.11.0 + tsconfig: 4.11.1 whatwg-fetch: 3.6.2 peerDependencies: redux: ^4.2.1 languageName: unknown linkType: soft -"@strapi/admin@4.11.0, @strapi/admin@workspace:packages/core/admin": +"@strapi/admin@4.11.1, @strapi/admin@workspace:packages/core/admin": version: 0.0.0-use.local resolution: "@strapi/admin@workspace:packages/core/admin" dependencies: @@ -7889,15 +7889,15 @@ __metadata: "@casl/ability": ^5.4.3 "@fingerprintjs/fingerprintjs": 3.4.1 "@pmmmwh/react-refresh-webpack-plugin": 0.5.10 - "@strapi/babel-plugin-switch-ee-ce": 4.11.0 - "@strapi/data-transfer": 4.11.0 + "@strapi/babel-plugin-switch-ee-ce": 4.11.1 + "@strapi/data-transfer": 4.11.1 "@strapi/design-system": 1.8.0 - "@strapi/helper-plugin": 4.11.0 + "@strapi/helper-plugin": 4.11.1 "@strapi/icons": 1.8.0 - "@strapi/permissions": 4.11.0 - "@strapi/provider-audit-logs-local": 4.11.0 - "@strapi/typescript-utils": 4.11.0 - "@strapi/utils": 4.11.0 + "@strapi/permissions": 4.11.1 + "@strapi/provider-audit-logs-local": 4.11.1 + "@strapi/typescript-utils": 4.11.1 + "@strapi/utils": 4.11.1 "@testing-library/dom": 9.2.0 "@testing-library/react": 14.0.0 "@testing-library/user-event": 14.4.3 @@ -7990,7 +7990,7 @@ __metadata: languageName: unknown linkType: soft -"@strapi/babel-plugin-switch-ee-ce@4.11.0, @strapi/babel-plugin-switch-ee-ce@workspace:packages/utils/babel-plugin-switch-ee-ce": +"@strapi/babel-plugin-switch-ee-ce@4.11.1, @strapi/babel-plugin-switch-ee-ce@workspace:packages/utils/babel-plugin-switch-ee-ce": version: 0.0.0-use.local resolution: "@strapi/babel-plugin-switch-ee-ce@workspace:packages/utils/babel-plugin-switch-ee-ce" dependencies: @@ -8008,12 +8008,12 @@ __metadata: languageName: unknown linkType: soft -"@strapi/data-transfer@4.11.0, @strapi/data-transfer@workspace:packages/core/data-transfer": +"@strapi/data-transfer@4.11.1, @strapi/data-transfer@workspace:packages/core/data-transfer": version: 0.0.0-use.local resolution: "@strapi/data-transfer@workspace:packages/core/data-transfer" dependencies: - "@strapi/logger": 4.11.0 - "@strapi/strapi": 4.11.0 + "@strapi/logger": 4.11.1 + "@strapi/strapi": 4.11.1 "@tsconfig/node16": 1.0.3 "@types/fs-extra": 9.0.13 "@types/jest": 29.2.0 @@ -8041,11 +8041,11 @@ __metadata: languageName: unknown linkType: soft -"@strapi/database@4.11.0, @strapi/database@workspace:packages/core/database": +"@strapi/database@4.11.1, @strapi/database@workspace:packages/core/database": version: 0.0.0-use.local resolution: "@strapi/database@workspace:packages/core/database" dependencies: - "@strapi/utils": 4.11.0 + "@strapi/utils": 4.11.1 date-fns: 2.30.0 debug: 4.3.4 fs-extra: 10.0.0 @@ -8109,7 +8109,7 @@ __metadata: languageName: node linkType: hard -"@strapi/generate-new@4.11.0, @strapi/generate-new@workspace:packages/generators/app": +"@strapi/generate-new@4.11.1, @strapi/generate-new@workspace:packages/generators/app": version: 0.0.0-use.local resolution: "@strapi/generate-new@workspace:packages/generators/app" dependencies: @@ -8128,25 +8128,25 @@ __metadata: languageName: unknown linkType: soft -"@strapi/generators@4.11.0, @strapi/generators@workspace:packages/generators/generators": +"@strapi/generators@4.11.1, @strapi/generators@workspace:packages/generators/generators": version: 0.0.0-use.local resolution: "@strapi/generators@workspace:packages/generators/generators" dependencies: "@sindresorhus/slugify": 1.1.0 - "@strapi/typescript-utils": 4.11.0 - "@strapi/utils": 4.11.0 + "@strapi/typescript-utils": 4.11.1 + "@strapi/utils": 4.11.1 chalk: 4.1.2 copyfiles: 2.4.1 - eslint-config-custom: 4.11.0 + eslint-config-custom: 4.11.1 fs-extra: 10.0.0 node-plop: 0.26.3 plop: 2.7.6 pluralize: 8.0.0 - tsconfig: 4.11.0 + tsconfig: 4.11.1 languageName: unknown linkType: soft -"@strapi/helper-plugin@4.11.0, @strapi/helper-plugin@workspace:packages/core/helper-plugin": +"@strapi/helper-plugin@4.11.1, @strapi/helper-plugin@workspace:packages/core/helper-plugin": version: 0.0.0-use.local resolution: "@strapi/helper-plugin@workspace:packages/core/helper-plugin" dependencies: @@ -8202,34 +8202,34 @@ __metadata: languageName: node linkType: hard -"@strapi/logger@4.11.0, @strapi/logger@workspace:packages/utils/logger": +"@strapi/logger@4.11.1, @strapi/logger@workspace:packages/utils/logger": version: 0.0.0-use.local resolution: "@strapi/logger@workspace:packages/utils/logger" dependencies: - eslint-config-custom: 4.11.0 + eslint-config-custom: 4.11.1 lodash: 4.17.21 - tsconfig: 4.11.0 + tsconfig: 4.11.1 winston: 3.3.3 languageName: unknown linkType: soft -"@strapi/permissions@4.11.0, @strapi/permissions@workspace:packages/core/permissions": +"@strapi/permissions@4.11.1, @strapi/permissions@workspace:packages/core/permissions": version: 0.0.0-use.local resolution: "@strapi/permissions@workspace:packages/core/permissions" dependencies: "@casl/ability": 5.4.4 - "@strapi/utils": 4.11.0 + "@strapi/utils": 4.11.1 lodash: 4.17.21 sift: 16.0.1 languageName: unknown linkType: soft -"@strapi/plugin-color-picker@4.11.0, @strapi/plugin-color-picker@workspace:packages/plugins/color-picker": +"@strapi/plugin-color-picker@4.11.1, @strapi/plugin-color-picker@workspace:packages/plugins/color-picker": version: 0.0.0-use.local resolution: "@strapi/plugin-color-picker@workspace:packages/plugins/color-picker" dependencies: "@strapi/design-system": 1.8.0 - "@strapi/helper-plugin": 4.11.0 + "@strapi/helper-plugin": 4.11.1 "@strapi/icons": 1.8.0 "@testing-library/react": 14.0.0 prop-types: ^15.8.1 @@ -8248,27 +8248,27 @@ __metadata: languageName: unknown linkType: soft -"@strapi/plugin-content-manager@4.11.0, @strapi/plugin-content-manager@workspace:packages/core/content-manager": +"@strapi/plugin-content-manager@4.11.1, @strapi/plugin-content-manager@workspace:packages/core/content-manager": version: 0.0.0-use.local resolution: "@strapi/plugin-content-manager@workspace:packages/core/content-manager" dependencies: "@sindresorhus/slugify": 1.1.0 - "@strapi/utils": 4.11.0 + "@strapi/utils": 4.11.1 lodash: 4.17.21 languageName: unknown linkType: soft -"@strapi/plugin-content-type-builder@4.11.0, @strapi/plugin-content-type-builder@workspace:packages/core/content-type-builder": +"@strapi/plugin-content-type-builder@4.11.1, @strapi/plugin-content-type-builder@workspace:packages/core/content-type-builder": version: 0.0.0-use.local resolution: "@strapi/plugin-content-type-builder@workspace:packages/core/content-type-builder" dependencies: "@sindresorhus/slugify": 1.1.0 - "@strapi/admin": 4.11.0 + "@strapi/admin": 4.11.1 "@strapi/design-system": 1.8.0 - "@strapi/generators": 4.11.0 - "@strapi/helper-plugin": 4.11.0 + "@strapi/generators": 4.11.1 + "@strapi/helper-plugin": 4.11.1 "@strapi/icons": 1.8.0 - "@strapi/utils": 4.11.0 + "@strapi/utils": 4.11.1 "@testing-library/react": 14.0.0 "@testing-library/react-hooks": 8.0.1 fs-extra: 10.0.0 @@ -8296,15 +8296,15 @@ __metadata: languageName: unknown linkType: soft -"@strapi/plugin-documentation@4.11.0, @strapi/plugin-documentation@workspace:packages/plugins/documentation": +"@strapi/plugin-documentation@4.11.1, @strapi/plugin-documentation@workspace:packages/plugins/documentation": version: 0.0.0-use.local resolution: "@strapi/plugin-documentation@workspace:packages/plugins/documentation" dependencies: "@apidevtools/swagger-parser": ^10.1.0 "@strapi/design-system": 1.8.0 - "@strapi/helper-plugin": 4.11.0 + "@strapi/helper-plugin": 4.11.1 "@strapi/icons": 1.8.0 - "@strapi/utils": 4.11.0 + "@strapi/utils": 4.11.1 "@testing-library/react": 14.0.0 bcryptjs: 2.4.3 cheerio: ^1.0.0-rc.12 @@ -8339,15 +8339,15 @@ __metadata: languageName: unknown linkType: soft -"@strapi/plugin-email@4.11.0, @strapi/plugin-email@workspace:packages/core/email": +"@strapi/plugin-email@4.11.1, @strapi/plugin-email@workspace:packages/core/email": version: 0.0.0-use.local resolution: "@strapi/plugin-email@workspace:packages/core/email" dependencies: "@strapi/design-system": 1.8.0 - "@strapi/helper-plugin": 4.11.0 + "@strapi/helper-plugin": 4.11.1 "@strapi/icons": 1.8.0 - "@strapi/provider-email-sendmail": 4.11.0 - "@strapi/utils": 4.11.0 + "@strapi/provider-email-sendmail": 4.11.1 + "@strapi/utils": 4.11.1 "@testing-library/react": 14.0.0 lodash: 4.17.21 msw: 1.2.1 @@ -8366,16 +8366,16 @@ __metadata: languageName: unknown linkType: soft -"@strapi/plugin-graphql@4.11.0, @strapi/plugin-graphql@workspace:packages/plugins/graphql": +"@strapi/plugin-graphql@4.11.1, @strapi/plugin-graphql@workspace:packages/plugins/graphql": version: 0.0.0-use.local resolution: "@strapi/plugin-graphql@workspace:packages/plugins/graphql" dependencies: "@graphql-tools/schema": 8.5.1 "@graphql-tools/utils": ^8.13.1 "@strapi/design-system": 1.8.0 - "@strapi/helper-plugin": 4.11.0 + "@strapi/helper-plugin": 4.11.1 "@strapi/icons": 1.8.0 - "@strapi/utils": 4.11.0 + "@strapi/utils": 4.11.1 apollo-server-core: 3.12.0 apollo-server-koa: 3.10.0 cross-env: ^7.0.3 @@ -8403,14 +8403,14 @@ __metadata: languageName: unknown linkType: soft -"@strapi/plugin-i18n@4.11.0, @strapi/plugin-i18n@workspace:packages/plugins/i18n": +"@strapi/plugin-i18n@4.11.1, @strapi/plugin-i18n@workspace:packages/plugins/i18n": version: 0.0.0-use.local resolution: "@strapi/plugin-i18n@workspace:packages/plugins/i18n" dependencies: "@strapi/design-system": 1.8.0 - "@strapi/helper-plugin": 4.11.0 + "@strapi/helper-plugin": 4.11.1 "@strapi/icons": 1.8.0 - "@strapi/utils": 4.11.0 + "@strapi/utils": 4.11.1 "@testing-library/react": 14.0.0 formik: 2.4.0 immer: 9.0.19 @@ -8435,13 +8435,13 @@ __metadata: languageName: unknown linkType: soft -"@strapi/plugin-sentry@4.11.0, @strapi/plugin-sentry@workspace:packages/plugins/sentry": +"@strapi/plugin-sentry@4.11.1, @strapi/plugin-sentry@workspace:packages/plugins/sentry": version: 0.0.0-use.local resolution: "@strapi/plugin-sentry@workspace:packages/plugins/sentry" dependencies: "@sentry/node": 6.19.7 "@strapi/design-system": 1.8.0 - "@strapi/helper-plugin": 4.11.0 + "@strapi/helper-plugin": 4.11.1 "@strapi/icons": 1.8.0 react: ^18.2.0 react-dom: ^18.2.0 @@ -8456,15 +8456,15 @@ __metadata: languageName: unknown linkType: soft -"@strapi/plugin-upload@4.11.0, @strapi/plugin-upload@workspace:packages/core/upload": +"@strapi/plugin-upload@4.11.1, @strapi/plugin-upload@workspace:packages/core/upload": version: 0.0.0-use.local resolution: "@strapi/plugin-upload@workspace:packages/core/upload" dependencies: "@strapi/design-system": 1.8.0 - "@strapi/helper-plugin": 4.11.0 + "@strapi/helper-plugin": 4.11.1 "@strapi/icons": 1.8.0 - "@strapi/provider-upload-local": 4.11.0 - "@strapi/utils": 4.11.0 + "@strapi/provider-upload-local": 4.11.1 + "@strapi/utils": 4.11.1 "@testing-library/dom": 9.2.0 "@testing-library/react": 14.0.0 "@testing-library/user-event": 14.4.3 @@ -8502,14 +8502,14 @@ __metadata: languageName: unknown linkType: soft -"@strapi/plugin-users-permissions@4.11.0, @strapi/plugin-users-permissions@workspace:packages/plugins/users-permissions": +"@strapi/plugin-users-permissions@4.11.1, @strapi/plugin-users-permissions@workspace:packages/plugins/users-permissions": version: 0.0.0-use.local resolution: "@strapi/plugin-users-permissions@workspace:packages/plugins/users-permissions" dependencies: "@strapi/design-system": 1.8.0 - "@strapi/helper-plugin": 4.11.0 + "@strapi/helper-plugin": 4.11.1 "@strapi/icons": 1.8.0 - "@strapi/utils": 4.11.0 + "@strapi/utils": 4.11.1 "@testing-library/dom": 9.2.0 "@testing-library/react": 14.0.0 "@testing-library/user-event": 14.4.3 @@ -8543,12 +8543,12 @@ __metadata: languageName: unknown linkType: soft -"@strapi/provider-audit-logs-local@4.11.0, @strapi/provider-audit-logs-local@workspace:packages/providers/audit-logs-local": +"@strapi/provider-audit-logs-local@4.11.1, @strapi/provider-audit-logs-local@workspace:packages/providers/audit-logs-local": version: 0.0.0-use.local resolution: "@strapi/provider-audit-logs-local@workspace:packages/providers/audit-logs-local" dependencies: - eslint-config-custom: 4.11.0 - tsconfig: 4.11.0 + eslint-config-custom: 4.11.1 + tsconfig: 4.11.1 peerDependencies: "@strapi/strapi": ^4.9.0 languageName: unknown @@ -8558,22 +8558,22 @@ __metadata: version: 0.0.0-use.local resolution: "@strapi/provider-email-amazon-ses@workspace:packages/providers/email-amazon-ses" dependencies: - "@strapi/utils": 4.11.0 - eslint-config-custom: 4.11.0 + "@strapi/utils": 4.11.1 + eslint-config-custom: 4.11.1 node-ses: ^3.0.3 - tsconfig: 4.11.0 + tsconfig: 4.11.1 languageName: unknown linkType: soft -"@strapi/provider-email-mailgun@4.11.0, @strapi/provider-email-mailgun@workspace:packages/providers/email-mailgun": +"@strapi/provider-email-mailgun@4.11.1, @strapi/provider-email-mailgun@workspace:packages/providers/email-mailgun": version: 0.0.0-use.local resolution: "@strapi/provider-email-mailgun@workspace:packages/providers/email-mailgun" dependencies: - "@strapi/utils": 4.11.0 - eslint-config-custom: 4.11.0 + "@strapi/utils": 4.11.1 + eslint-config-custom: 4.11.1 form-data: ^4.0.0 mailgun.js: 8.2.1 - tsconfig: 4.11.0 + tsconfig: 4.11.1 languageName: unknown linkType: soft @@ -8582,10 +8582,10 @@ __metadata: resolution: "@strapi/provider-email-nodemailer@workspace:packages/providers/email-nodemailer" dependencies: "@types/nodemailer": 6.4.7 - eslint-config-custom: 4.11.0 + eslint-config-custom: 4.11.1 lodash: 4.17.21 nodemailer: 6.9.1 - tsconfig: 4.11.0 + tsconfig: 4.11.1 languageName: unknown linkType: soft @@ -8594,79 +8594,79 @@ __metadata: resolution: "@strapi/provider-email-sendgrid@workspace:packages/providers/email-sendgrid" dependencies: "@sendgrid/mail": 7.7.0 - "@strapi/utils": 4.11.0 - eslint-config-custom: 4.11.0 - tsconfig: 4.11.0 + "@strapi/utils": 4.11.1 + eslint-config-custom: 4.11.1 + tsconfig: 4.11.1 languageName: unknown linkType: soft -"@strapi/provider-email-sendmail@4.11.0, @strapi/provider-email-sendmail@workspace:packages/providers/email-sendmail": +"@strapi/provider-email-sendmail@4.11.1, @strapi/provider-email-sendmail@workspace:packages/providers/email-sendmail": version: 0.0.0-use.local resolution: "@strapi/provider-email-sendmail@workspace:packages/providers/email-sendmail" dependencies: - "@strapi/utils": 4.11.0 + "@strapi/utils": 4.11.1 "@types/sendmail": 1.4.4 - eslint-config-custom: 4.11.0 + eslint-config-custom: 4.11.1 sendmail: ^1.6.1 - tsconfig: 4.11.0 + tsconfig: 4.11.1 languageName: unknown linkType: soft -"@strapi/provider-upload-aws-s3@4.11.0, @strapi/provider-upload-aws-s3@workspace:packages/providers/upload-aws-s3": +"@strapi/provider-upload-aws-s3@4.11.1, @strapi/provider-upload-aws-s3@workspace:packages/providers/upload-aws-s3": version: 0.0.0-use.local resolution: "@strapi/provider-upload-aws-s3@workspace:packages/providers/upload-aws-s3" dependencies: "@types/jest": 29.2.0 aws-sdk: 2.1372.0 - eslint-config-custom: 4.11.0 + eslint-config-custom: 4.11.1 lodash: 4.17.21 - tsconfig: 4.11.0 + tsconfig: 4.11.1 languageName: unknown linkType: soft -"@strapi/provider-upload-cloudinary@4.11.0, @strapi/provider-upload-cloudinary@workspace:packages/providers/upload-cloudinary": +"@strapi/provider-upload-cloudinary@4.11.1, @strapi/provider-upload-cloudinary@workspace:packages/providers/upload-cloudinary": version: 0.0.0-use.local resolution: "@strapi/provider-upload-cloudinary@workspace:packages/providers/upload-cloudinary" dependencies: - "@strapi/utils": 4.11.0 + "@strapi/utils": 4.11.1 cloudinary: ^1.37.0 - eslint-config-custom: 4.11.0 + eslint-config-custom: 4.11.1 into-stream: ^5.1.0 - tsconfig: 4.11.0 + tsconfig: 4.11.1 languageName: unknown linkType: soft -"@strapi/provider-upload-local@4.11.0, @strapi/provider-upload-local@workspace:packages/providers/upload-local": +"@strapi/provider-upload-local@4.11.1, @strapi/provider-upload-local@workspace:packages/providers/upload-local": version: 0.0.0-use.local resolution: "@strapi/provider-upload-local@workspace:packages/providers/upload-local" dependencies: - "@strapi/utils": 4.11.0 + "@strapi/utils": 4.11.1 "@types/jest": 29.2.0 - eslint-config-custom: 4.11.0 + eslint-config-custom: 4.11.1 fs-extra: 10.0.0 - tsconfig: 4.11.0 + tsconfig: 4.11.1 languageName: unknown linkType: soft -"@strapi/strapi@4.11.0, @strapi/strapi@workspace:packages/core/strapi": +"@strapi/strapi@4.11.1, @strapi/strapi@workspace:packages/core/strapi": version: 0.0.0-use.local resolution: "@strapi/strapi@workspace:packages/core/strapi" dependencies: "@koa/cors": 3.4.3 "@koa/router": 10.1.1 - "@strapi/admin": 4.11.0 - "@strapi/data-transfer": 4.11.0 - "@strapi/database": 4.11.0 - "@strapi/generate-new": 4.11.0 - "@strapi/generators": 4.11.0 - "@strapi/logger": 4.11.0 - "@strapi/permissions": 4.11.0 - "@strapi/plugin-content-manager": 4.11.0 - "@strapi/plugin-content-type-builder": 4.11.0 - "@strapi/plugin-email": 4.11.0 - "@strapi/plugin-upload": 4.11.0 - "@strapi/typescript-utils": 4.11.0 - "@strapi/utils": 4.11.0 + "@strapi/admin": 4.11.1 + "@strapi/data-transfer": 4.11.1 + "@strapi/database": 4.11.1 + "@strapi/generate-new": 4.11.1 + "@strapi/generators": 4.11.1 + "@strapi/logger": 4.11.1 + "@strapi/permissions": 4.11.1 + "@strapi/plugin-content-manager": 4.11.1 + "@strapi/plugin-content-type-builder": 4.11.1 + "@strapi/plugin-email": 4.11.1 + "@strapi/plugin-upload": 4.11.1 + "@strapi/typescript-utils": 4.11.1 + "@strapi/utils": 4.11.1 bcryptjs: 2.4.3 boxen: 5.1.2 chalk: 4.1.2 @@ -8713,7 +8713,7 @@ __metadata: languageName: unknown linkType: soft -"@strapi/typescript-utils@4.11.0, @strapi/typescript-utils@workspace:packages/utils/typescript": +"@strapi/typescript-utils@4.11.1, @strapi/typescript-utils@workspace:packages/utils/typescript": version: 0.0.0-use.local resolution: "@strapi/typescript-utils@workspace:packages/utils/typescript" dependencies: @@ -8758,7 +8758,7 @@ __metadata: languageName: node linkType: hard -"@strapi/utils@4.11.0, @strapi/utils@workspace:packages/core/utils": +"@strapi/utils@4.11.1, @strapi/utils@workspace:packages/core/utils": version: 0.0.0-use.local resolution: "@strapi/utils@workspace:packages/core/utils" dependencies: @@ -14823,11 +14823,11 @@ __metadata: version: 0.0.0-use.local resolution: "create-strapi-app@workspace:packages/cli/create-strapi-app" dependencies: - "@strapi/generate-new": 4.11.0 + "@strapi/generate-new": 4.11.1 commander: 8.3.0 - eslint-config-custom: 4.11.0 + eslint-config-custom: 4.11.1 inquirer: 8.2.5 - tsconfig: 4.11.0 + tsconfig: 4.11.1 bin: create-strapi-app: ./bin/index.js languageName: unknown @@ -14837,16 +14837,16 @@ __metadata: version: 0.0.0-use.local resolution: "create-strapi-starter@workspace:packages/cli/create-strapi-starter" dependencies: - "@strapi/generate-new": 4.11.0 + "@strapi/generate-new": 4.11.1 chalk: 4.1.2 ci-info: 3.8.0 commander: 8.3.0 - eslint-config-custom: 4.11.0 + eslint-config-custom: 4.11.1 execa: 5.1.1 fs-extra: 10.0.0 inquirer: 8.2.5 ora: 5.4.1 - tsconfig: 4.11.0 + tsconfig: 4.11.1 bin: create-strapi-starter: ./bin/index.js languageName: unknown @@ -16669,7 +16669,7 @@ __metadata: languageName: node linkType: hard -"eslint-config-custom@4.11.0, eslint-config-custom@workspace:packages/utils/eslint-config-custom": +"eslint-config-custom@4.11.1, eslint-config-custom@workspace:packages/utils/eslint-config-custom": version: 0.0.0-use.local resolution: "eslint-config-custom@workspace:packages/utils/eslint-config-custom" languageName: unknown @@ -18674,16 +18674,16 @@ __metadata: resolution: "getstarted@workspace:examples/getstarted" dependencies: "@strapi/icons": 1.8.0 - "@strapi/plugin-color-picker": 4.11.0 - "@strapi/plugin-documentation": 4.11.0 - "@strapi/plugin-graphql": 4.11.0 - "@strapi/plugin-i18n": 4.11.0 - "@strapi/plugin-sentry": 4.11.0 - "@strapi/plugin-users-permissions": 4.11.0 - "@strapi/provider-email-mailgun": 4.11.0 - "@strapi/provider-upload-aws-s3": 4.11.0 - "@strapi/provider-upload-cloudinary": 4.11.0 - "@strapi/strapi": 4.11.0 + "@strapi/plugin-color-picker": 4.11.1 + "@strapi/plugin-documentation": 4.11.1 + "@strapi/plugin-graphql": 4.11.1 + "@strapi/plugin-i18n": 4.11.1 + "@strapi/plugin-sentry": 4.11.1 + "@strapi/plugin-users-permissions": 4.11.1 + "@strapi/provider-email-mailgun": 4.11.1 + "@strapi/provider-upload-aws-s3": 4.11.1 + "@strapi/provider-upload-cloudinary": 4.11.1 + "@strapi/strapi": 4.11.1 better-sqlite3: 8.3.0 lodash: 4.17.21 mysql: 2.18.1 @@ -22825,9 +22825,9 @@ __metadata: version: 0.0.0-use.local resolution: "kitchensink-ts@workspace:examples/kitchensink-ts" dependencies: - "@strapi/plugin-i18n": 4.11.0 - "@strapi/plugin-users-permissions": 4.11.0 - "@strapi/strapi": 4.11.0 + "@strapi/plugin-i18n": 4.11.1 + "@strapi/plugin-users-permissions": 4.11.1 + "@strapi/strapi": 4.11.1 better-sqlite3: 8.3.0 react: ^18.2.0 react-dom: ^18.2.0 @@ -22840,10 +22840,10 @@ __metadata: version: 0.0.0-use.local resolution: "kitchensink@workspace:examples/kitchensink" dependencies: - "@strapi/provider-email-mailgun": 4.11.0 - "@strapi/provider-upload-aws-s3": 4.11.0 - "@strapi/provider-upload-cloudinary": 4.11.0 - "@strapi/strapi": 4.11.0 + "@strapi/provider-email-mailgun": 4.11.1 + "@strapi/provider-upload-aws-s3": 4.11.1 + "@strapi/provider-upload-cloudinary": 4.11.1 + "@strapi/strapi": 4.11.1 lodash: 4.17.21 mysql: 2.18.1 passport-google-oauth2: 0.2.0 @@ -32120,7 +32120,7 @@ __metadata: languageName: node linkType: hard -"tsconfig@4.11.0, tsconfig@workspace:packages/utils/tsconfig": +"tsconfig@4.11.1, tsconfig@workspace:packages/utils/tsconfig": version: 0.0.0-use.local resolution: "tsconfig@workspace:packages/utils/tsconfig" languageName: unknown From 4dd26a2445e2ae1310c9a1d378adb26bd49d0342 Mon Sep 17 00:00:00 2001 From: Jamie Howard Date: Mon, 12 Jun 2023 16:24:09 +0100 Subject: [PATCH 147/172] feature(ee): emit workflow id with stage change event --- .../review-workflows/entity-service-decorator.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/core/admin/ee/server/services/review-workflows/entity-service-decorator.js b/packages/core/admin/ee/server/services/review-workflows/entity-service-decorator.js index 640edc984c..0e6c76ccdc 100644 --- a/packages/core/admin/ee/server/services/review-workflows/entity-service-decorator.js +++ b/packages/core/admin/ee/server/services/review-workflows/entity-service-decorator.js @@ -47,8 +47,14 @@ const decorator = (service) => ({ return service.update.call(this, uid, entityId, { ...opts, data }); } - const entity = await service.findOne.call(this, uid, entityId, { - populate: [ENTITY_STAGE_ATTRIBUTE], + const entity = await this.findOne(uid, entityId, { + populate: { + [ENTITY_STAGE_ATTRIBUTE]: { + populate: { + workflow: true, + }, + }, + }, }); const previousStageId = entity?.[ENTITY_STAGE_ATTRIBUTE]?.id ?? null; @@ -57,6 +63,7 @@ const decorator = (service) => ({ const webhookPayload = { entityId, workflow: { + id: entity[ENTITY_STAGE_ATTRIBUTE].workflow.id, stages: { from: previousStageId, to: data[ENTITY_STAGE_ATTRIBUTE], From 89dad0d065501a6f7faaf753df49478135d6f71d Mon Sep 17 00:00:00 2001 From: Jamie Howard Date: Mon, 12 Jun 2023 16:29:12 +0100 Subject: [PATCH 148/172] fix(ee): tests --- .../__tests__/entity-service-decorator.test.js | 3 ++- .../services/review-workflows/entity-service-decorator.js | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/core/admin/ee/server/services/review-workflows/__tests__/entity-service-decorator.test.js b/packages/core/admin/ee/server/services/review-workflows/__tests__/entity-service-decorator.test.js index c73a44fddb..82dab1b93d 100644 --- a/packages/core/admin/ee/server/services/review-workflows/__tests__/entity-service-decorator.test.js +++ b/packages/core/admin/ee/server/services/review-workflows/__tests__/entity-service-decorator.test.js @@ -109,7 +109,7 @@ describe('Entity service decorator', () => { const defaultService = { update: jest.fn(() => Promise.resolve(entry)), findOne: jest.fn(() => { - return { strapi_reviewWorkflows_stage: { id: 2 } }; + return { strapi_reviewWorkflows_stage: { id: 2, workflow: { id: 1 } } }; }), emitEvent: jest.fn(), }; @@ -123,6 +123,7 @@ describe('Entity service decorator', () => { expect(defaultService.emitEvent).toHaveBeenCalledWith(uid, WORKFLOW_UPDATE_STAGE, { entityId: 1, workflow: { + id: 1, stages: { from: 2, to: 1, diff --git a/packages/core/admin/ee/server/services/review-workflows/entity-service-decorator.js b/packages/core/admin/ee/server/services/review-workflows/entity-service-decorator.js index 0e6c76ccdc..82dc46ba5f 100644 --- a/packages/core/admin/ee/server/services/review-workflows/entity-service-decorator.js +++ b/packages/core/admin/ee/server/services/review-workflows/entity-service-decorator.js @@ -47,7 +47,7 @@ const decorator = (service) => ({ return service.update.call(this, uid, entityId, { ...opts, data }); } - const entity = await this.findOne(uid, entityId, { + const entity = await service.findOne.call(this, uid, entityId, { populate: { [ENTITY_STAGE_ATTRIBUTE]: { populate: { From dfbe582cd7a35fc303eb7f5590e2847532b3b9d3 Mon Sep 17 00:00:00 2001 From: Gustav Hansen Date: Mon, 12 Jun 2023 15:22:11 +0200 Subject: [PATCH 149/172] Chore: Add eslint simple-sort plugin --- packages/utils/eslint-config-custom/front.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/packages/utils/eslint-config-custom/front.js b/packages/utils/eslint-config-custom/front.js index 283fe6df40..2ea444b12c 100644 --- a/packages/utils/eslint-config-custom/front.js +++ b/packages/utils/eslint-config-custom/front.js @@ -31,6 +31,22 @@ module.exports = { 'react/jsx-no-constructed-context-values': 'warn', 'react/jsx-no-useless-fragment': 'warn', 'react/no-unstable-nested-components': 'warn', + 'import/order': [ + 'error', + { + groups: [ + ['external', 'internal', 'builtin'], + 'parent', + ['sibling', 'index'], + 'object', + 'type', + ], + pathGroups: [{ pattern: 'react', group: 'external', position: 'before' }], + pathGroupsExcludedImportTypes: ['react'], + 'newlines-between': 'always', + alphabetize: { order: 'asc', caseInsensitive: true }, + }, + ], 'no-restricted-imports': [ 'error', { From dca5778d8ed6beeabb229cf5481ada1e55e4607a Mon Sep 17 00:00:00 2001 From: Gustav Hansen Date: Mon, 12 Jun 2023 16:22:11 +0200 Subject: [PATCH 150/172] Chore: Apply eslint import sorting fix --- packages/core/admin/admin/src/StrapiApp.js | 24 +++--- .../src/components/AuthenticatedApp/index.js | 13 +-- .../AuthenticatedApp/tests/index.test.js | 18 ++-- .../components/AuthenticatedApp/utils/api.js | 4 +- .../ConfigurationsProvider/index.js | 3 + .../tests/index.test.js | 6 +- .../src/components/DragLayer/DragLayer.js | 3 +- .../GuidedTour/Homepage/components/Step.js | 12 +-- .../GuidedTour/Homepage/components/Stepper.js | 7 +- .../Homepage/components/tests/Stepper.test.js | 4 +- .../components/GuidedTour/Homepage/index.js | 11 ++- .../GuidedTour/Homepage/tests/index.test.js | 8 +- .../GuidedTour/Modal/components/Content.js | 5 +- .../GuidedTour/Modal/components/Modal.js | 9 +- .../Modal/components/StepNumberWithPadding.js | 4 +- .../GuidedTour/Modal/components/Stepper.js | 13 +-- .../src/components/GuidedTour/Modal/index.js | 9 +- .../GuidedTour/Modal/tests/index.test.js | 6 +- .../components/GuidedTour/Stepper/StepLine.js | 8 +- .../GuidedTour/Stepper/StepNumber.js | 8 +- .../admin/src/components/GuidedTour/index.js | 12 +-- .../admin/src/components/GuidedTour/init.js | 1 + .../components/GuidedTour/tests/index.test.js | 4 +- .../components/GuidedTour/tests/init.test.js | 1 + .../src/components/LanguageProvider/index.js | 7 +- .../LanguageProvider/tests/index.test.js | 8 +- .../admin/src/components/LeftMenu/index.js | 28 +++--- .../src/components/LocalesProvider/index.js | 2 + .../LocalesProvider/tests/index.test.js | 2 + .../LocalesProvider/useLocalesProvider.js | 1 + .../components/PluginsInitializer/index.js | 2 + .../PluginsInitializer/tests/index.test.js | 2 + .../src/components/PrivateRoute/index.js | 5 +- .../PrivateRoute/tests/index.test.js | 7 +- .../admin/src/components/Providers/index.js | 18 ++-- .../src/components/RBACProvider/index.js | 4 +- .../RBACProvider/tests/reducer.test.js | 2 +- .../admin/admin/src/components/Theme/index.js | 2 + .../components/ThemeToggleProvider/index.js | 4 +- .../components/UnauthenticatedLogo/index.js | 2 + .../components/AttributeFilter/Filters.js | 7 +- .../hooks/useAllowedAttributes.js | 2 +- .../components/AttributeFilter/index.js | 4 +- .../CollectionTypeFormWrapper/index.js | 36 ++++---- .../components/ComponentIcon/ComponentIcon.js | 3 +- .../components/ComponentInitializer/index.js | 10 ++- .../DynamicTable/BulkActionsBar/index.js | 8 +- .../BulkActionsBar/tests/index.test.js | 4 +- .../DynamicTable/CellContent/CellValue.js | 4 +- .../CellContent/Media/FileWrapper.js | 3 +- .../DynamicTable/CellContent/Media/index.js | 3 +- .../CellContent/MultipleMedias.js | 4 +- .../PublicationState/PublicationState.js | 3 +- .../tests/PublicationState.test.js | 3 +- .../CellContent/RelationMultiple/index.js | 4 +- .../RelationMultiple/tests/index.test.js | 9 +- .../CellContent/RelationSingle/index.js | 4 +- .../RelationSingle/tests/index.test.js | 3 +- .../CellContent/RepeatableComponent/index.js | 9 +- .../CellContent/SingleComponent/index.js | 3 +- .../DynamicTable/CellContent/index.js | 6 +- .../CellContent/tests/CellValue.test.js | 1 + .../CellContent/utils/hasContent.js | 3 +- .../DynamicTable/ConfirmDialogDelete/index.js | 6 +- .../DynamicTable/TableRows/index.js | 16 ++-- .../components/DynamicTable/index.js | 12 +-- .../components/AddComponentButton.js | 5 +- .../DynamicZone/components/ComponentCard.js | 6 +- .../components/ComponentCategory.js | 7 +- .../DynamicZone/components/ComponentPicker.js | 3 +- .../components/DynamicComponent.js | 19 ++--- .../components/DynamicZoneLabel.js | 7 +- .../tests/AddComponentButton.test.js | 3 +- .../components/tests/ComponentCard.test.js | 5 +- .../tests/ComponentCategory.test.js | 3 +- .../components/tests/ComponentPicker.test.js | 3 +- .../components/tests/DynamicComponent.test.js | 9 +- .../components/tests/DynamicZoneLabel.test.js | 6 +- .../components/DynamicZone/index.js | 12 +-- .../DynamicZone/tests/index.test.js | 7 +- .../EditViewDataManagerProvider/index.js | 36 ++++---- .../EditViewDataManagerProvider/reducer.js | 9 +- .../utils/cleanData.js | 1 + .../utils/index.js | 2 +- .../components/FieldComponent/Label.js | 3 +- .../components/FieldComponent/index.js | 21 ++--- .../components/FieldComponent/utils/select.js | 5 +- .../components/FieldTypeIcon/index.js | 13 +-- .../content-manager/components/Hint/index.js | 3 +- .../components/InjectionZoneList/index.js | 4 +- .../components/InputUID/endActionStyle.js | 2 +- .../components/InputUID/index.js | 16 ++-- .../components/InputUID/tests/index.test.js | 5 +- .../components/Inputs/index.js | 12 +-- .../components/Inputs/utils/select.js | 3 +- .../NonRepeatableComponent/index.js | 6 +- .../components/PreviewWysiwyg/index.js | 1 + .../PreviewWysiwyg/utils/mdRenderer.js | 2 +- .../components/RelationInput/RelationInput.js | 44 +++++----- .../RelationInput/components/Option.js | 10 +-- .../RelationInput/components/Relation.js | 2 +- .../RelationInput/components/RelationItem.js | 8 +- .../RelationInput/components/RelationList.js | 3 +- .../components/tests/Option.test.js | 6 +- .../components/tests/RelationItem.test.js | 5 +- .../components/tests/RelationList.test.js | 3 +- .../RelationInput/tests/RelationInput.test.js | 9 +- .../RelationInputDataManager.js | 16 ++-- .../tests/RelationInputDataManger.test.js | 16 ++-- .../RelationInputDataManager/utils/index.js | 6 +- .../utils/normalizeRelations.js | 4 +- .../RelationInputDataManager/utils/select.js | 3 +- .../utils/tests/select.test.js | 2 +- .../components/Accordion.js | 3 +- .../components/Component.js | 28 +++--- .../RepeatableComponent/components/Preview.js | 1 + .../components/tests/Accordion.test.js | 3 +- .../components/tests/Component.test.js | 5 +- .../components/tests/Preview.test.js | 3 +- .../components/RepeatableComponent/index.js | 19 ++--- .../RepeatableComponent/tests/index.test.js | 12 +-- .../components/SingleTypeFormWrapper/index.js | 25 +++--- .../components/Wysiwyg/Editor.js | 10 ++- .../components/Wysiwyg/EditorLayout.js | 9 +- .../components/Wysiwyg/WysiwygFooter.js | 6 +- .../components/Wysiwyg/WysiwygNav.js | 27 +++--- .../components/Wysiwyg/WysiwygStyles.js | 2 +- .../components/Wysiwyg/index.js | 30 ++++--- .../components/Wysiwyg/tests/index.test.js | 6 +- .../admin/src/content-manager/hooks/index.js | 6 +- .../hooks/useContentTypeLayout/index.js | 2 + .../content-manager/hooks/useDragAndDrop.js | 1 + .../hooks/useFetchContentTypeLayout/index.js | 11 ++- .../tests/reducer.test.js | 1 + .../utils/formatLayouts.js | 2 +- .../utils/tests/formatLayouts.test.js | 2 +- .../hooks/useFindRedirectionLink/index.js | 3 +- .../tests/selectors.test.js | 1 + .../utils/getRedirectionLink.js | 2 +- .../hooks/useLazyComponents/index.js | 1 + .../tests/useLazyComponents.test.js | 1 + .../hooks/usePluginsQueryParams/index.js | 2 +- .../useRelation/tests/useRelation.test.js | 5 +- .../hooks/useRelation/useRelation.js | 6 +- .../hooks/useSyncRbac/index.js | 4 +- .../hooks/useSyncRbac/reducer.js | 3 +- .../hooks/useSyncRbac/tests/selectors.test.js | 3 +- .../src/content-manager/hooks/useWysiwyg.js | 1 + .../pages/App/LeftMenu/index.js | 10 +-- .../pages/App/components/CardDragPreview.js | 7 +- .../App/components/ComponentDragPreview.js | 7 +- .../App/components/RelationDragPreview.js | 15 ++-- .../src/content-manager/pages/App/index.js | 23 ++--- .../src/content-manager/pages/App/reducer.js | 1 + .../content-manager/pages/App/selectors.js | 3 +- .../pages/App/tests/index.test.js | 14 +-- .../pages/App/tests/reducer.test.js | 3 +- .../pages/App/tests/selectors.test.js | 1 + .../pages/App/useContentManagerInitData.js | 11 ++- .../pages/App/utils/getContentTypeLinks.js | 6 +- .../utils/tests/getContentTypeLinks.test.js | 1 + .../components/ErrorFallback.js | 3 +- .../CollectionTypeRecursivePath/index.js | 13 +-- .../pages/ComponentSetttingsView/index.js | 12 +-- .../components/ComponentFieldList.js | 10 ++- .../components/DisplayedFieldButton.js | 17 ++-- .../components/DisplayedFields.js | 9 +- .../components/DynamicZoneList.js | 7 +- .../components/FieldButtonContent.js | 9 +- .../EditSettingsView/components/FormModal.js | 21 +++-- .../components/GenericInput.js | 3 +- .../components/LayoutDndProvider/index.js | 1 + .../EditSettingsView/components/LinkToCTB.js | 8 +- .../EditSettingsView/components/ModalForm.js | 15 ++-- .../components/RowItemsLayout.js | 5 +- .../EditSettingsView/components/RowsLayout.js | 4 +- .../EditSettingsView/hooks/useLayoutDnd.js | 1 + .../pages/EditSettingsView/index.js | 59 +++++++------ .../pages/EditSettingsView/reducer.js | 6 +- .../EditSettingsView/tests/index.test.js | 18 ++-- .../pages/EditSettingsView/utils/api.js | 1 + .../pages/EditSettingsView/utils/layout.js | 2 +- .../utils/tests/layout.test.js | 2 +- .../pages/EditView/DeleteLink/index.js | 9 +- .../pages/EditView/DeleteLink/utils/select.js | 2 +- .../EditView/DraftAndPublishBadge/index.js | 9 +- .../DraftAndPublishBadge/tests/index.test.js | 4 +- .../pages/EditView/GridRow/index.js | 6 +- .../pages/EditView/Header/index.js | 23 ++--- .../pages/EditView/Header/tests/index.test.js | 5 +- .../pages/EditView/Information/index.js | 10 ++- .../EditView/Information/tests/index.test.js | 5 +- .../tests/InformationBoxCe.test.js | 5 +- .../content-manager/pages/EditView/index.js | 29 ++++--- .../pages/EditView/selectors.js | 3 +- .../getFieldsActionMatchingPermissions.js | 4 +- .../pages/EditView/utils/index.js | 2 +- ...getFieldsActionMatchingPermissions.test.js | 2 +- .../EditViewLayoutManager/Permissions.js | 8 +- .../pages/EditViewLayoutManager/index.js | 7 +- .../pages/EditViewLayoutManager/reducer.js | 1 + .../components/DraggableCard.js | 9 +- .../components/EditFieldForm.js | 22 ++--- .../ListSettingsView/components/Settings.js | 10 ++- .../components/SortDisplayedFields.js | 13 +-- .../pages/ListSettingsView/index.js | 48 ++++++----- .../pages/ListSettingsView/reducer.js | 3 +- .../ListSettingsView/tests/index.test.js | 14 +-- .../pages/ListView/FieldPicker/index.js | 13 +-- .../pages/ListView/PaginationFooter/index.js | 5 +- .../content-manager/pages/ListView/index.js | 68 +++++++-------- .../content-manager/pages/ListView/reducer.js | 3 +- .../pages/ListView/selectors.js | 1 + .../pages/ListView/tests/reducer.test.js | 2 +- .../pages/ListView/utils/buildQueryString.js | 3 +- .../ListViewLayoutManager/Permissions.js | 7 +- .../pages/ListViewLayoutManager/index.js | 9 +- .../pages/NoContentType/index.js | 8 +- .../pages/NoContentType/tests/index.test.js | 6 +- .../pages/NoPermissions/index.js | 6 +- .../pages/NoPermissions/tests/index.test.js | 4 +- .../pages/SingleTypeRecursivePath/index.js | 8 +- .../sharedReducers/crudReducer/actions.js | 2 +- .../sharedReducers/crudReducer/reducer.js | 1 - .../crudReducer/tests/crudReducer.test.js | 1 + .../src/content-manager/testUtils/index.js | 2 +- .../admin/src/content-manager/utils/index.js | 7 -- .../utils/removePasswordFieldsFromData.js | 2 +- .../admin/src/content-manager/utils/schema.js | 3 +- .../src/contexts/ApiTokenPermissions/index.js | 1 + .../admin/src/contexts/MarketPlace/index.js | 1 + .../core/admin/admin/src/core/apis/index.js | 4 +- .../admin/src/core/store/configureStore.js | 2 +- packages/core/admin/admin/src/hooks/index.js | 18 ++-- .../useFetchMarketplacePlugins/index.js | 3 +- .../useFetchMarketplaceProviders/index.js | 3 +- .../useAdminUsers/tests/useAdminUsers.test.js | 5 +- .../src/hooks/useAdminUsers/useAdminUsers.js | 2 +- .../src/hooks/useConfigurations/index.js | 1 + .../hooks/useContentTypes/tests/index.test.js | 5 +- .../admin/src/hooks/useDebounce/index.js | 2 +- .../src/hooks/useFetchEnabledPlugins/index.js | 3 +- .../hooks/useFetchPermissionsLayout/index.js | 1 + .../admin/src/hooks/useFetchRole/index.js | 4 +- .../tests/useInjectReducer.test.js | 3 +- .../useInjectReducer/useInjectReducer.js | 1 + .../admin/admin/src/hooks/useMenu/index.js | 8 +- .../admin/admin/src/hooks/useMenu/reducer.js | 3 +- .../hooks/useMenu/utils/getGeneralLinks.js | 1 + .../utils/tests/getGeneralLinks.test.js | 1 + .../useNavigatorOnLine/tests/index.test.js | 3 +- .../hooks/usePermissionsDataManager/index.js | 1 + .../admin/src/hooks/useRegenerate/index.js | 3 +- .../hooks/useRegenerate/tests/index.test.js | 4 +- .../src/hooks/useReleaseNotification/index.js | 1 + .../admin/src/hooks/useRolesList/index.js | 4 +- .../admin/src/hooks/useSettingsForm/index.js | 5 +- .../hooks/useSettingsForm/tests/index.test.js | 5 +- .../admin/src/hooks/useSettingsMenu/index.js | 5 +- .../admin/src/hooks/useSettingsMenu/init.js | 5 +- .../hooks/useSettingsMenu/utils/adminLinks.js | 1 + .../useSettingsMenu/utils/globalLinks.js | 1 + .../admin/src/hooks/useThemeToggle/index.js | 1 + packages/core/admin/admin/src/index.js | 1 + .../admin/src/layouts/AppLayout/index.js | 3 +- .../LocaleToggle/index.js | 4 +- .../layouts/UnauthenticatedLayout/index.js | 6 +- .../admin/src/pages/Admin/Onboarding/index.js | 12 +-- .../Admin/Onboarding/tests/index.test.js | 6 +- .../core/admin/admin/src/pages/Admin/index.js | 12 +-- .../admin/src/pages/Admin/tests/index.test.js | 8 +- .../pages/Admin/tests/useTrackUsage.test.js | 1 + .../core/admin/admin/src/pages/App/index.js | 17 ++-- .../core/admin/admin/src/pages/App/reducer.js | 1 + .../admin/admin/src/pages/App/utils/index.js | 2 +- .../admin/admin/src/pages/App/utils/routes.js | 1 + .../components/FieldActionWrapper/index.js | 2 +- .../components/ForgotPassword/index.js | 10 ++- .../components/ForgotPasswordSuccess/index.js | 8 +- .../AuthPage/components/Login/BaseLogin.js | 10 ++- .../pages/AuthPage/components/Login/index.js | 5 +- .../components/Login/tests/BaseLogin.test.js | 10 ++- .../pages/AuthPage/components/Oops/index.js | 8 +- .../components/Oops/tests/index.test.js | 6 +- .../AuthPage/components/Register/index.js | 48 ++++++----- .../components/Register/tests/index.test.js | 13 +-- .../components/ResetPassword/index.js | 16 ++-- .../ResetPassword/tests/index.test.js | 8 +- .../admin/admin/src/pages/AuthPage/index.js | 9 +- .../admin/src/pages/AuthPage/utils/forms.js | 3 +- .../admin/src/pages/HomePage/CloudBox.js | 10 ++- .../admin/src/pages/HomePage/ContentBlocks.js | 10 ++- .../admin/src/pages/HomePage/HomeHeader.js | 9 +- .../admin/src/pages/HomePage/SocialLinks.js | 11 +-- .../admin/admin/src/pages/HomePage/index.js | 22 ++--- .../src/pages/HomePage/tests/index.test.js | 10 ++- .../src/pages/InstalledPluginsPage/Plugins.js | 18 ++-- .../src/pages/InstalledPluginsPage/index.js | 3 + .../src/pages/InternalErrorPage/index.js | 7 +- .../InternalErrorPage/tests/index.test.js | 6 +- .../EmptyNpmPackageGrid.js | 3 +- .../components/EmptyNpmPackageSearch/index.js | 6 +- .../components/MissingPluginBanner/index.js | 7 +- .../components/NpmPackageCard/CardButton.js | 7 +- .../NpmPackageCard/InstallPluginButton.js | 8 +- .../components/NpmPackageCard/PackageStats.js | 11 +-- .../components/NpmPackageCard/index.js | 13 +-- .../NpmPackagesFilters/FilterSelect.js | 3 +- .../NpmPackagesFilters/FiltersPopover.js | 6 +- .../components/NpmPackagesFilters/index.js | 10 ++- .../components/NpmPackagesGrid/index.js | 10 ++- .../components/NpmPackagesPagination/index.js | 5 +- .../components/OfflineLayout/index.js | 8 +- .../components/PageHeader/index.js | 7 +- .../components/SortSelect/index.js | 7 +- .../admin/src/pages/MarketplacePage/index.js | 48 ++++++----- .../pages/MarketplacePage/tests/index.test.js | 11 ++- .../MarketplacePage/tests/plugins.test.js | 9 +- .../MarketplacePage/tests/providers.test.js | 9 +- .../src/pages/MarketplacePage/tests/server.js | 3 +- .../utils/useMarketplaceData.js | 6 +- .../admin/src/pages/NotFoundPage/index.js | 7 +- .../pages/NotFoundPage/tests/index.test.js | 6 +- .../ProfilePage/components/Password/index.js | 15 ++-- .../components/Preferences/index.js | 7 +- .../ProfilePage/components/UserInfo/index.js | 5 +- .../admin/src/pages/ProfilePage/index.js | 41 ++++----- .../src/pages/ProfilePage/tests/index.test.js | 11 ++- .../pages/ProfilePage/tests/utils/server.js | 2 +- .../tests/utils/serverLockedSSO.js | 2 +- .../src/pages/ProfilePage/utils/schema.js | 1 + .../SettingsPage/components/Filters/index.js | 7 +- .../components/SettingsNav/index.js | 12 +-- .../SettingsNav/tests/index.test.js | 6 +- .../components/Tokens/FormHead/index.js | 8 +- .../components/Tokens/LifeSpanInput/index.js | 4 +- .../components/Tokens/Regenerate/index.js | 8 +- .../Tokens/Table/DefaultButton/index.js | 5 +- .../Tokens/Table/DeleteButton/index.js | 7 +- .../DeleteButton/tests/DeleteButton.test.js | 5 +- .../Tokens/Table/ReadButton/index.js | 2 + .../Tokens/Table/UpdateButton/index.js | 2 + .../components/Tokens/Table/index.js | 14 +-- .../components/Tokens/TokenBox/index.js | 5 +- .../Tokens/TokenDescription/index.js | 3 +- .../components/Tokens/TokenName/index.js | 3 +- .../Tokens/TokenTypeSelect/index.js | 4 +- .../admin/src/pages/SettingsPage/index.js | 11 ++- .../components/ActionBoundRoutes/index.js | 6 +- .../EditView/components/BoundRoute/index.js | 8 +- .../CollapsableContentType/CheckBoxWrapper.js | 2 +- .../CollapsableContentType/index.js | 17 ++-- .../components/ContenTypesSection/index.js | 4 +- .../components/FormApiTokenContainer/index.js | 8 +- .../EditView/components/LoadingView/index.js | 7 +- .../EditView/components/Permissions/index.js | 8 +- .../EditView/components/Regenerate/index.js | 8 +- .../pages/ApiTokens/EditView/index.js | 43 +++++----- .../pages/ApiTokens/EditView/reducer.js | 1 + .../ApiTokens/EditView/tests/index.test.js | 8 +- .../ApiTokens/EditView/tests/reducer.test.js | 2 +- .../pages/ApiTokens/EditView/utils/schema.js | 2 +- .../tests/transformPermissionsData.test.js | 1 + .../pages/ApiTokens/ListView/index.js | 33 +++---- .../ApiTokens/ListView/tests/index.test.js | 10 ++- .../ApiTokens/ProtectedCreateView/index.js | 2 + .../ApiTokens/ProtectedEditView/index.js | 2 + .../ApiTokens/ProtectedListView/index.js | 2 + .../components/CustomizationInfos/index.js | 11 ++- .../CustomizationInfos/tests/index.test.js | 5 +- .../components/LogoInput/index.js | 11 ++- .../components/LogoInput/tests/index.test.js | 7 +- .../LogoModalStepper/AddLogoDialog.js | 6 +- .../LogoModalStepper/FromComputerForm.js | 20 +++-- .../LogoModalStepper/FromUrlForm.js | 8 +- .../LogoModalStepper/ImageCardAsset.js | 7 +- .../LogoModalStepper/PendingLogoDialog.js | 6 +- .../components/LogoModalStepper/index.js | 4 +- .../tests/AddLogoDialog.test.js | 5 +- .../tests/ImageCardAsset.test.js | 5 +- .../tests/PendingLogoDialog.test.js | 5 +- .../pages/ApplicationInfosPage/index.js | 26 +++--- .../ApplicationInfosPage/tests/index.test.js | 9 +- .../ApplicationInfosPage/tests/server.js | 2 +- .../pages/ApplicationInfosPage/utils/api.js | 1 + .../utils/parseFileMetadatas.js | 2 +- .../utils/prefixAllUrls.js | 2 +- .../pages/Roles/CreatePage/index.js | 35 ++++---- .../Roles/CreatePage/tests/index.test.js | 7 +- .../pages/Roles/CreatePage/utils/schema.js | 2 +- .../components/CollapseLabel/index.js | 2 +- .../components/ConditionsButton/index.js | 5 +- .../ConditionsModal/ActionRow/index.js | 5 +- .../ActionRow/utils/options.js | 2 +- .../ActionRow/utils/tests/options.test.js | 2 +- .../components/ConditionsModal/index.js | 7 +- .../utils/createDefaultConditionsForm.js | 2 +- .../tests/createDefaultConditionsForm.test.js | 2 +- .../ContentTypeCollapse/Collapse/index.js | 9 +- .../utils/generateCheckboxesActions.js | 1 + .../CollapsePropertyMatrix/ActionRow/index.js | 7 +- .../CarretIcon/index.js | 2 +- .../CollapsePropertyMatrix/Header/index.js | 4 +- .../SubActionRow/index.js | 6 +- .../CollapsePropertyMatrix/index.js | 8 +- .../components/ContentTypeCollapse/index.js | 4 +- .../ContentTypeCollapse/utils/activeStyle.js | 1 + .../components/ContentTypeCollapses/index.js | 2 + .../EditPage/components/ContentTypes/index.js | 6 +- .../Roles/EditPage/components/Curve/index.js | 3 +- .../components/GlobalActions/index.js | 7 +- .../utils/getRowLabelCheckboxesState.js | 1 + .../EditPage/components/HiddenAction/index.js | 1 + .../EditPage/components/Permissions/index.js | 7 +- .../components/Permissions/reducer.js | 2 +- .../utils/createDefaultCTFormFromLayout.js | 2 +- .../createDefaultPluginsFormFromLayout.js | 2 +- .../formatContentTypesPermissionToAPI.js | 4 +- .../createDefaultCTFormFromLayout.test.js | 2 +- ...createDefaultPluginsFormFromLayout.test.js | 2 +- .../formatLayoutForSettingsAndPlugins.test.js | 1 + .../utils/updateConditionsToFalse.js | 2 +- .../PermissionsDataManagerProvider/index.js | 2 + .../PluginsAndSettings/Row/index.js | 4 +- .../PluginsAndSettings/SubCategory/index.js | 13 +-- .../SubCategory/utils/formatActions.js | 1 + .../components/PluginsAndSettings/index.js | 4 +- .../EditPage/components/RequiredSign/index.js | 1 + .../EditPage/components/RoleForm/index.js | 7 +- .../components/RowLabelWithCheckbox/index.js | 4 +- .../Roles/EditPage/components/utils/index.js | 2 +- .../pages/Roles/EditPage/index.js | 15 ++-- .../pages/Roles/EditPage/tests/index.test.js | 9 +- .../pages/Roles/EditPage/utils/schema.js | 2 +- .../ListPage/components/RoleRow/index.js | 5 +- .../pages/Roles/ListPage/index.js | 35 ++++---- .../pages/Roles/ListPage/tests/index.test.js | 9 +- .../pages/Roles/ProtectedEditPage/index.js | 4 +- .../pages/Roles/ProtectedListPage/index.js | 2 + .../FormTransferTokenContainer/index.js | 8 +- .../EditView/components/LoadingView/index.js | 7 +- .../pages/TransferTokens/EditView/index.js | 43 +++++----- .../EditView/tests/index.test.js | 8 +- .../TransferTokens/EditView/utils/schema.js | 2 +- .../pages/TransferTokens/ListView/index.js | 31 +++---- .../ListView/tests/index.test.js | 10 ++- .../ProtectedCreateView/index.js | 2 + .../TransferTokens/ProtectedEditView/index.js | 2 + .../TransferTokens/ProtectedListView/index.js | 2 + .../pages/Users/EditPage/index.js | 50 +++++------ .../Users/ListPage/CreateAction/index.js | 5 +- .../ListPage/CreateAction/tests/index.test.js | 5 +- .../ListPage/DynamicTable/TableRows/index.js | 12 +-- .../pages/Users/ListPage/ModalForm/index.js | 27 +++--- .../Users/ListPage/ModalForm/utils/schema.js | 2 +- .../Users/ListPage/PaginationFooter/index.js | 5 +- .../PaginationFooter/tests/index.test.js | 12 +-- .../pages/Users/ListPage/index.js | 22 ++--- .../pages/Users/ListPage/tests/index.test.js | 11 +-- .../Users/ListPage/utils/tableHeaders.js | 1 + .../pages/Users/ProtectedEditPage/index.js | 3 +- .../pages/Users/ProtectedListPage/index.js | 2 + .../components/MagicLink/MagicLinkWrapper.js | 5 +- .../pages/Users/components/MagicLink/index.js | 5 +- .../Users/components/SelectRoles/index.js | 7 +- .../Users/utils/validations/users/edit.js | 1 + .../Users/utils/validations/users/profile.js | 2 +- .../Users/utils/validations/users/roles.js | 2 +- .../EditView/components/Events/index.js | 22 ++--- .../components/HeadersInput/Combobox.js | 7 +- .../EditView/components/HeadersInput/index.js | 10 ++- .../components/TriggerContainer/index.js | 7 +- .../EditView/components/WebhookForm/index.js | 26 +++--- .../WebhookForm/tests/index.test.js | 11 +-- .../utils/makeWebhookValidationSchema.js | 2 +- .../pages/Webhooks/EditView/index.js | 9 +- .../pages/Webhooks/ListView/index.js | 59 ++++++------- .../Webhooks/ListView/tests/index.test.js | 8 +- .../pages/Webhooks/ListView/tests/server.js | 2 +- .../Webhooks/ProtectedCreateView/index.js | 2 + .../pages/Webhooks/ProtectedEditView/index.js | 2 + .../pages/Webhooks/ProtectedListView/index.js | 2 + .../pages/SettingsPage/tests/index.test.js | 10 ++- .../utils/createSectionsRoutes.js | 1 + .../src/pages/SettingsPage/utils/index.js | 1 - .../src/pages/SettingsPage/utils/routes.js | 1 + .../admin/src/pages/UseCasePage/index.js | 28 +++--- .../src/pages/UseCasePage/tests/index.test.js | 6 +- .../core/admin/admin/src/permissions/index.js | 3 +- packages/core/admin/admin/src/reducers.js | 4 +- .../shared/components/InjectionZone/index.js | 2 + .../shared/hooks/useAdminProvider/index.js | 1 + .../admin/admin/src/tests/StrapiApp.test.js | 5 +- .../src/translations/tests/index.test.js | 1 + .../core/admin/admin/src/utils/createRoute.js | 3 +- packages/core/admin/admin/src/utils/index.js | 6 +- .../utils/tests/getExistingActions.test.js | 1 + .../src/utils/tests/uniqueAdminHash.test.js | 1 + .../ReviewWorkflowsStageEE.js | 3 +- .../ReviewWorkflowsStage/getTableColumn.js | 8 +- .../tests/ReviewWorkflowsStage.test.js | 3 +- .../InformationBox/InformationBoxEE.js | 7 +- .../tests/InformationBoxEE.test.js | 7 +- .../ee/admin/hooks/useAuthProviders/index.js | 4 +- .../useLicenseLimitNotification/index.js | 6 +- .../tests/index.test.js | 1 + .../ee/admin/hooks/useLicenseLimits/index.js | 1 + .../useLicenseLimits/tests/index.test.js | 3 +- .../pages/AuthPage/components/Login/index.js | 8 +- .../components/Providers/SSOProviders.js | 5 +- .../AuthPage/components/Providers/index.js | 13 +-- .../ee/admin/pages/AuthPage/utils/forms.js | 2 +- .../ee/admin/pages/AuthResponse/index.js | 10 ++- .../components/AdminSeatInfo/index.js | 8 +- .../AdminSeatInfo/tests/index.test.js | 5 +- .../ListView/ComboboxFilter/index.js | 3 +- .../AuditLogs/ListView/Modal/ActionBody.js | 5 +- .../AuditLogs/ListView/Modal/ActionItem.js | 3 +- .../pages/AuditLogs/ListView/Modal/index.js | 9 +- .../ListView/PaginationFooter/index.js | 5 +- .../AuditLogs/ListView/TableRows/index.js | 8 +- .../ListView/TableRows/tests/index.test.js | 10 ++- .../ListView/hooks/useAuditLogsData.js | 2 +- .../ListView/hooks/useFormatTimeStamp.js | 2 +- .../pages/AuditLogs/ListView/index.js | 39 +++++---- .../AuditLogs/ListView/tests/index.test.js | 17 ++-- .../AuditLogs/ListView/tests/utils/data.js | 2 +- .../ListView/utils/getDisplayedFilters.js | 3 +- .../AuditLogs/ProtectedListPage/index.js | 2 + .../pages/ReviewWorkflows/ReviewWorkflows.js | 29 ++++--- .../pages/ReviewWorkflows/actions/index.js | 4 +- .../actions/tests/index.test.js | 7 +- .../components/AddStage/AddStage.js | 4 +- .../AddStage/tests/AddStage.test.js | 4 +- .../StageDragPreview/StageDragPreview.js | 7 +- .../components/Stages/Stage/Stage.js | 19 +++-- .../Stages/Stage/tests/Stage.test.js | 13 ++- .../components/Stages/Stages.js | 10 ++- .../components/Stages/tests/Stages.test.js | 16 ++-- .../hooks/tests/useReviewWorkflows.test.js | 7 +- .../hooks/useReviewWorkflows.js | 2 +- .../pages/ReviewWorkflows/reducer/index.js | 4 +- .../reducer/tests/index.test.js | 5 +- .../tests/ReviewWorkflows.test.js | 13 +-- .../SettingsPage/pages/SingleSignOn/index.js | 41 ++++----- .../pages/SingleSignOn/tests/index.test.js | 10 ++- .../pages/SingleSignOn/tests/server.js | 2 +- .../Users/ListPage/CreateAction/index.js | 8 +- .../pages/Users/components/MagicLink/index.js | 4 +- .../components/AllowedTypesSelect/index.js | 5 +- .../src/components/AttributeIcon/index.js | 17 ++-- .../AttributeOptions/AttributeList/index.js | 4 +- .../AttributeOptions/AttributeOption/index.js | 4 +- .../CustomFieldOption/index.js | 8 +- .../CustomFieldsList/index.js | 10 ++- .../AttributeOptions/EmptyAttributes/index.js | 10 ++- .../OptionBoxWrapper/index.js | 2 +- .../src/components/AttributeOptions/index.js | 15 ++-- .../AttributeOptions/tests/index.test.js | 8 +- .../BooleanDefaultValueSelect/index.js | 3 +- .../src/components/BooleanRadioGroup/index.js | 2 + .../CheckboxWithNumberField/index.js | 5 +- .../ComponentIcon/ComponentIcon.js | 3 +- .../src/components/ComponentCard/index.js | 9 +- .../src/components/ComponentList/index.js | 4 +- .../components/ContentTypeBuilderNav/index.js | 12 +-- .../ContentTypeBuilderNav/tests/index.test.js | 7 +- .../useContentTypeBuilderMenu.js | 4 +- .../components/ContentTypeRadioGroup/index.js | 4 +- .../components/CustomRadioGroup/components.js | 2 +- .../src/components/CustomRadioGroup/index.js | 4 +- .../components/DataManagerProvider/index.js | 54 ++++++------ .../components/DataManagerProvider/reducer.js | 6 +- .../DataManagerProvider/selectors.js | 2 + .../reducer_add_attribute_action.test.js | 2 +- ..._add_custom_field_attribute_action.test.js | 3 +- .../tests/reducer_basic_actions.test.js | 6 +- .../reducer_edit_attribute_action.test.js | 2 +- ...edit_custom_field_attribute_action.test.js | 3 +- .../tests/reducer_remove_field_action.test.js | 5 +- .../DataManagerProvider/utils/cleanData.js | 4 +- .../utils/retrieveComponentsFromSchema.js | 1 + .../retrieveComponentsThatHaveComponents.js | 1 + .../retrieveSpecificInfoFromComponents.js | 1 + .../utils/tests/cleanData.test.js | 3 +- .../components/DraftAndPublishToggle/index.js | 6 +- .../src/components/DynamicZoneList/index.js | 6 +- .../FormModal/attributes/advancedForm.js | 1 + .../FormModal/attributes/baseForm.js | 1 + .../components/FormModal/attributes/index.js | 2 +- .../components/FormModal/attributes/types.js | 8 +- .../FormModal/attributes/validation/common.js | 6 +- .../category/createCategorySchema.js | 2 +- .../components/FormModal/category/index.js | 2 +- .../component/createComponentSchema.js | 4 +- .../components/FormModal/component/index.js | 2 +- .../contentType/createContentTypeSchema.js | 2 +- .../components/FormModal/contentType/index.js | 2 +- .../src/components/FormModal/forms/index.js | 11 +-- .../FormModal/forms/tests/customField.test.js | 1 + .../admin/src/components/FormModal/index.js | 81 +++++++++--------- .../admin/src/components/FormModal/reducer.js | 7 +- .../src/components/FormModal/selectors.js | 2 + ...ducer.set-custom-field-data-schema.test.js | 2 +- .../FormModal/tests/reducer.test.js | 2 +- .../FormModal/utils/canEditContentType.js | 1 + .../utils/tests/canEditContentType.test.js | 1 + .../components/FormModalEndActions/index.js | 6 +- .../src/components/FormModalHeader/index.js | 8 +- .../FormModalNavigationProvider/index.js | 5 +- .../tests/index.test.js | 5 +- .../components/FormModalSubHeader/index.js | 5 +- .../admin/src/components/IconPicker/index.js | 20 +++-- .../components/IconPicker/tests/index.test.js | 8 +- .../admin/src/components/List/index.js | 15 ++-- .../src/components/ListRow/BoxWrapper.js | 2 +- .../src/components/ListRow/DisplayedType.js | 4 +- .../admin/src/components/ListRow/index.js | 19 +++-- .../src/components/NestedTFooter/index.js | 3 +- .../admin/src/components/PluginIcon/index.js | 1 + .../admin/src/components/PluralName/index.js | 6 +- .../RelationTargetPicker/index.js | 8 +- .../Relation/RelationField/index.js | 7 +- .../RelationNaturePicker/components.js | 2 +- .../Relation/RelationNaturePicker/index.js | 29 ++++--- .../admin/src/components/Relation/index.js | 5 +- .../components/ReviewWorkflowsToggle/index.js | 5 +- .../src/components/SelectCategory/index.js | 6 +- .../src/components/SelectComponent/index.js | 6 +- .../src/components/SelectComponents/index.js | 6 +- .../src/components/SelectDateType/index.js | 3 +- .../src/components/SelectNumber/index.js | 3 +- .../src/components/SingularName/index.js | 4 +- .../admin/src/components/TabForm/index.js | 7 +- .../src/components/TextareaEnum/index.js | 3 +- .../admin/src/components/UpperFirst/index.js | 2 +- .../admin/src/hooks/useDataManager.js | 1 + .../admin/src/hooks/useFormModalNavigation.js | 1 + .../admin/src/icons/Curve.js | 3 +- .../content-type-builder/admin/src/index.js | 4 +- .../admin/src/pages/App/Wrapper.js | 3 +- .../admin/src/pages/App/index.js | 16 ++-- .../ListView/LinkToCMSettingsView/index.js | 7 +- .../admin/src/pages/ListView/index.js | 9 +- .../src/pages/ListView/tests/index.test.js | 10 ++- .../admin/src/pages/RecursivePath/index.js | 5 +- .../admin/src/reducers.js | 2 +- .../admin/src/utils/tests/formAPI.test.js | 1 + packages/core/email/admin/src/index.js | 4 +- .../Settings/components/Configuration.js | 6 +- .../pages/Settings/components/EmailHeader.js | 6 +- .../email/admin/src/pages/Settings/index.js | 41 ++++----- .../src/pages/Settings/tests/index.test.js | 9 +- .../src/pages/Settings/tests/utils/server.js | 2 +- packages/core/email/admin/src/utils/schema.js | 2 +- .../src/components/AnErrorOccurred/index.js | 3 +- .../components/CheckPagePermissions/index.js | 4 +- .../src/components/CheckPermissions/index.js | 7 +- .../src/components/ConfirmDialog/index.js | 5 +- .../ConfirmDialog/tests/index.test.js | 6 +- .../src/components/ContentBox/index.js | 3 +- .../components/ContentBox/tests/index.test.js | 4 +- .../src/components/DateTimePicker/index.js | 1 + .../DateTimePicker/tests/index.test.js | 4 +- .../DynamicTable/TableHead/index.js | 8 +- .../src/components/DynamicTable/index.js | 12 +-- .../src/components/EmptyBodyTable/index.js | 4 +- .../src/components/EmptyStateLayout/index.js | 3 +- .../FilterListURLQuery/AttributeTag.js | 3 +- .../components/FilterListURLQuery/index.js | 3 + .../FilterListURLQuery/tests/index.test.js | 10 ++- .../FilterPopoverURLQuery/Inputs.js | 13 +-- .../components/FilterPopoverURLQuery/index.js | 11 ++- .../src/components/Form/index.js | 1 + .../components/GenericInput/NotSupported.js | 1 + .../src/components/GenericInput/index.js | 17 ++-- .../GenericInput/tests/index.test.js | 5 +- .../components/InjectionZone/InjectionZone.js | 2 + .../src/components/Link/index.js | 3 +- .../src/components/LinkButton/index.js | 3 +- .../components/LoadingIndicatorPage/index.js | 3 +- .../src/components/NoContent/index.js | 3 +- .../src/components/NoMedia/index.js | 3 +- .../src/components/NoPermissions/index.js | 5 +- .../src/components/NotAllowedInput/index.js | 7 +- .../NotAllowedInput/tests/index.test.js | 4 +- .../src/components/PageSizeURLQuery/index.js | 8 +- .../PageSizeURLQuery/tests/index.test.js | 6 +- .../components/PaginationURLQuery/index.js | 8 +- .../PaginationURLQuery/tests/index.test.js | 8 +- .../src/components/ReactSelect/ReactSelect.js | 4 +- .../ReactSelect/components/ClearIndicator.js | 4 +- .../components/DropdownIndicator.js | 4 +- .../ReactSelect/components/IconBox.js | 2 +- .../src/components/RelativeTime/index.js | 3 +- .../RelativeTime/tests/index.test.js | 4 +- .../src/components/SearchURLQuery/index.js | 10 ++- .../SearchURLQuery/tests/index.test.js | 8 +- .../src/components/SettingsPageTitle/index.js | 3 +- .../src/components/Status/index.js | 1 + .../hooks/useCMEditViewDataManager/index.js | 1 + ...ntentManagementUtilRemoveFieldsFromData.js | 2 +- .../utils/formatContentTypeData.js | 3 +- .../utils/getAttributeInfos.js | 2 +- ...ManagementUtilRemoveFieldsFromData.test.js | 3 +- .../utils/tests/formatContentTypeData.test.js | 1 + .../helper-plugin/src/features/AppInfo.js | 6 +- .../src/features/AutoReloadOverlayBlocker.js | 13 +-- .../src/features/CustomFields.js | 2 +- .../helper-plugin/src/features/GuidedTour.js | 2 +- .../helper-plugin/src/features/Library.js | 2 +- .../src/features/Notifications.js | 7 +- .../src/features/OverlayBlocker.js | 6 +- .../helper-plugin/src/features/StrapiApp.js | 2 +- .../helper-plugin/src/features/Tracking.js | 2 +- .../src/features/tests/Notifications.test.js | 6 +- .../src/features/tests/Tracking.test.js | 3 +- .../tests/useAPIErrorHandler.test.js | 4 +- .../useAPIErrorHandler/useAPIErrorHandler.js | 2 +- .../src/hooks/useFetchClient/index.js | 3 +- .../tests/useFetchClient.test.js | 3 +- .../src/hooks/useFieldHint/index.js | 2 + .../useFieldHint/tests/useFieldHint.test.js | 3 +- .../src/hooks/useFormattedMessage/index.js | 2 +- .../src/hooks/usePersistentState/index.js | 2 +- .../src/hooks/useQueryParams/index.js | 3 +- .../helper-plugin/src/hooks/useRBAC/index.js | 7 +- .../src/hooks/useRBAC/reducer.js | 1 + .../tests/useSelectionState.test.js | 2 +- .../src/icons/RemoveRoundedButton/index.js | 2 + .../helper-plugin/src/icons/SortIcon/index.js | 2 +- packages/core/helper-plugin/src/index.js | 85 +++++++++---------- packages/core/helper-plugin/webpack.config.js | 4 +- .../src/components/AssetCard/AssetCard.js | 13 +-- .../src/components/AssetCard/AssetCardBase.js | 7 +- .../components/AssetCard/AudioAssetCard.js | 5 +- .../src/components/AssetCard/AudioPreview.js | 3 +- .../src/components/AssetCard/DocAssetCard.js | 7 +- .../components/AssetCard/ImageAssetCard.js | 3 +- .../AssetCard/UploadingAssetCard.js | 16 ++-- .../components/AssetCard/VideoAssetCard.js | 9 +- .../src/components/AssetCard/VideoPreview.js | 3 +- .../AssetCard/tests/AssetCardBase.test.js | 3 +- .../AssetCard/tests/DocAssetCard.test.js | 6 +- .../AssetCard/tests/ImageAssetCard.test.js | 6 +- .../AssetDialog/BrowseStep/Filters.js | 8 +- .../AssetDialog/BrowseStep/PageSize.js | 5 +- .../BrowseStep/PaginationFooter/Pagination.js | 4 +- .../BrowseStep/PaginationFooter/components.js | 8 +- .../BrowseStep/PaginationFooter/index.js | 4 +- .../BrowseStep/SearchAsset/index.js | 10 ++- .../SearchAsset/tests/index.test.js | 6 +- .../AssetDialog/BrowseStep/index.js | 39 ++++----- .../BrowseStep/tests/index.test.js | 15 ++-- .../components/AssetDialog/DialogFooter.js | 3 +- .../AssetDialog/SelectedStep/index.js | 8 +- .../admin/src/components/AssetDialog/index.js | 43 +++++----- .../AssetDialog/tests/AssetDialog.test.js | 9 +- .../src/components/AssetGridList/Draggable.js | 1 + .../src/components/AssetGridList/index.js | 4 +- .../AssetGridList/tests/AssetGridList.test.js | 4 +- .../src/components/Breadcrumbs/Breadcrumbs.js | 12 +-- .../Breadcrumbs/CrumbSimpleMenuAsync.js | 12 +-- .../Breadcrumbs/tests/index.test.js | 7 +- .../BulkMoveDialog/BulkMoveDialog.js | 21 ++--- .../tests/BulkMoveDialog.test.js | 9 +- .../src/components/ContextInfo/ContextInfo.js | 3 +- .../ContextInfo/tests/ContextInfo.test.js | 3 +- .../src/components/CopyLinkButton/index.js | 8 +- .../EditAssetDialog/DialogHeader.js | 3 +- .../PreviewBox/AssetPreview.js | 8 +- .../PreviewBox/CroppingActions.js | 7 +- .../EditAssetDialog/PreviewBox/components.js | 2 +- .../EditAssetDialog/PreviewBox/index.js | 37 ++++---- .../EditAssetDialog/RemoveAssetDialog.js | 4 +- .../EditAssetDialog/ReplaceMediaButton.js | 8 +- .../src/components/EditAssetDialog/index.js | 40 ++++----- .../tests/EditAssetDialog.test.js | 10 ++- .../tests/RemoveAssetDialog.test.js | 11 ++- .../EditAssetDialog/tests/index.test.js | 10 ++- .../EditAssetDialog/tests/server.js | 2 +- .../EditFolderDialog/EditFolderDialog.js | 28 +++--- .../ModalHeader/ModalHeader.js | 5 +- .../EditFolderDialog/RemoveFolderDialog.js | 3 +- .../tests/EditFolderDialog.test.js | 15 ++-- .../components/EmptyAssets/EmptyAssetGrid.js | 3 +- .../admin/src/components/EmptyAssets/index.js | 6 +- .../src/components/FilterList/FilterTag.js | 3 +- .../admin/src/components/FilterList/index.js | 2 + .../components/FilterList/tests/index.test.js | 4 +- .../FilterPopover/FilterValueInput.js | 3 +- .../src/components/FilterPopover/index.js | 8 +- .../FolderCard/FolderCard/FolderCard.js | 8 +- .../FolderCardBody/FolderCardBody.js | 2 +- .../FolderCard/FolderCardBodyAction/index.js | 3 +- .../FolderCardCheckbox/FolderCardCheckbox.js | 4 +- .../admin/src/components/FolderCard/index.js | 2 +- .../FolderCard/tests/FolderCard.test.js | 7 +- .../FolderGridList/FolderGridList.js | 3 +- .../tests/FolderGridList.test.js | 5 +- .../components/MediaLibraryDialog/index.js | 1 + .../Carousel/CarouselAsset.js | 12 +-- .../Carousel/CarouselAssetActions.js | 8 +- .../Carousel/CarouselAssets.js | 13 +-- .../Carousel/EmptyStateAsset.js | 12 +-- .../Carousel/tests/CarouselAssets.test.js | 5 +- .../src/components/MediaLibraryInput/index.js | 12 +-- .../tests/MediaLibraryInput.test.js | 8 +- .../src/components/PaginationFooter/index.js | 5 +- .../admin/src/components/PluginIcon/index.js | 1 + .../admin/src/components/SelectTree/Option.js | 10 +-- .../src/components/SelectTree/SelectTree.js | 6 +- .../SelectTree/tests/SelectTree.test.js | 6 +- .../admin/src/components/SortPicker/index.js | 8 +- .../src/components/TableList/CellContent.js | 10 ++- .../src/components/TableList/PreviewCell.js | 7 +- .../src/components/TableList/TableRows.js | 10 ++- .../admin/src/components/TableList/index.js | 10 ++- .../TableList/tests/CellContent.test.js | 5 +- .../TableList/tests/PreviewCell.test.js | 3 +- .../TableList/tests/TableList.test.js | 5 +- .../TableList/tests/TableRows.test.js | 5 +- .../AddAssetStep/AddAssetStep.js | 19 +++-- .../AddAssetStep/FromComputerForm.js | 10 ++- .../AddAssetStep/FromUrlForm.js | 10 ++- .../tests/FromComputerForm.test.js | 6 +- .../PendingAssetStep/PendingAssetStep.js | 19 +++-- .../tests/PendingAssetStep.test.js | 8 +- .../UploadAssetDialog/UploadAssetDialog.js | 8 +- .../tests/UploadAssetDialog.test.js | 9 +- .../src/components/UploadProgress/index.js | 7 +- .../UploadProgress/tests/index.test.js | 6 +- packages/core/upload/admin/src/constants.js | 1 + .../admin/src/hooks/tests/useAssets.test.js | 10 +-- .../admin/src/hooks/tests/useBulkMove.test.js | 10 +-- .../src/hooks/tests/useBulkRemove.test.js | 10 +-- .../admin/src/hooks/tests/useConfig.test.js | 14 +-- .../src/hooks/tests/useEditFolder.test.js | 10 +-- .../admin/src/hooks/tests/useFolder.test.js | 12 +-- .../hooks/tests/useFolderStructure.test.js | 6 +- .../admin/src/hooks/tests/useFolders.test.js | 10 +-- .../hooks/tests/useModalQueryParams.test.js | 11 +-- .../src/hooks/tests/useRemoveAsset.test.js | 10 +-- .../core/upload/admin/src/hooks/useAssets.js | 6 +- .../upload/admin/src/hooks/useBulkMove.js | 2 +- .../upload/admin/src/hooks/useBulkRemove.js | 2 +- .../core/upload/admin/src/hooks/useConfig.js | 2 +- .../core/upload/admin/src/hooks/useCropImg.js | 3 +- .../upload/admin/src/hooks/useEditAsset.js | 11 +-- .../upload/admin/src/hooks/useEditFolder.js | 2 +- .../core/upload/admin/src/hooks/useFolder.js | 2 +- .../admin/src/hooks/useFolderStructure.js | 6 +- .../core/upload/admin/src/hooks/useFolders.js | 6 +- .../src/hooks/useMediaLibraryPermissions.js | 2 + .../admin/src/hooks/useModalQueryParams.js | 5 +- .../upload/admin/src/hooks/useRemoveAsset.js | 4 +- .../core/upload/admin/src/hooks/useUpload.js | 11 +-- packages/core/upload/admin/src/index.js | 6 +- .../ConfigureTheView/components/Settings.js | 6 +- .../components/tests/Settings.test.js | 9 +- .../src/pages/App/ConfigureTheView/index.js | 28 +++--- .../App/ConfigureTheView/state/actions.js | 2 +- .../App/ConfigureTheView/state/reducer.js | 3 +- .../state/tests/reducer.test.js | 2 +- .../tests/ConfigureTheView.test.js | 12 +-- .../MediaLibrary/components/BulkActions.js | 4 +- .../components/BulkDeleteButton.js | 7 +- .../MediaLibrary/components/BulkMoveButton.js | 5 +- .../components/EmptyOrNoPermissions.js | 4 +- .../App/MediaLibrary/components/Filters.js | 4 +- .../App/MediaLibrary/components/Header.js | 16 ++-- .../components/tests/BulkActions.test.js | 7 +- .../components/tests/BulkDeleteButton.test.js | 13 +-- .../components/tests/BulkMoveButton.test.js | 15 ++-- .../tests/EmptyOrNoPermissions.test.js | 3 +- .../components/tests/Header.test.js | 9 +- .../admin/src/pages/App/MediaLibrary/index.js | 83 +++++++++--------- .../MediaLibrary/tests/MediaLibrary.test.js | 21 ++--- .../src/pages/App/components/BulkActions.js | 4 +- .../pages/App/components/BulkDeleteButton.js | 7 +- .../pages/App/components/BulkMoveButton.js | 5 +- .../App/components/EmptyOrNoPermissions.js | 4 +- .../admin/src/pages/App/components/Filters.js | 4 +- .../admin/src/pages/App/components/Header.js | 16 ++-- .../tests/EmptyOrNoPermissions.test.js | 3 +- .../core/upload/admin/src/pages/App/index.js | 18 ++-- .../admin/src/pages/App/tests/Upload.test.js | 15 ++-- .../admin/src/pages/SettingsPage/index.js | 37 ++++---- .../pages/SettingsPage/tests/index.test.js | 5 +- .../pages/SettingsPage/tests/utils/server.js | 2 +- .../upload/admin/src/utils/deleteRequest.js | 1 + .../admin/src/utils/getBreadcrumbDataML.js | 2 +- packages/core/upload/admin/src/utils/index.js | 18 ++-- .../upload/admin/src/utils/urlYupSchema.js | 3 +- .../upload/admin/src/utils/urlsToAssets.js | 2 + .../ColorPicker/ColorPickerIcon/index.js | 5 +- .../ColorPicker/ColorPickerInput/index.js | 21 ++--- .../tests/color-picker-input.test.js | 4 +- .../plugins/color-picker/admin/src/index.js | 3 +- .../components/FieldActionWrapper/index.js | 2 +- .../admin/src/components/PluginIcon/index.js | 1 + .../plugins/documentation/admin/src/index.js | 2 + .../admin/src/pages/PluginPage/index.js | 44 +++++----- .../src/pages/PluginPage/tests/index.test.js | 6 +- .../src/pages/PluginPage/tests/server.js | 2 +- .../admin/src/pages/SettingsPage/index.js | 41 +++++---- .../pages/SettingsPage/tests/index.test.js | 8 +- .../src/pages/SettingsPage/tests/server.js | 2 +- .../admin/src/pages/utils/useReactQuery.js | 5 +- packages/plugins/graphql/admin/src/index.js | 2 + .../CMEditViewCopyLocale/index.js | 25 +++--- .../CMEditViewCopyLocale/utils/cleanData.js | 1 + ...removePasswordAndRelationsFieldFromData.js | 2 +- ...ePasswordAndRelationsFieldFromData.test.js | 3 +- .../CMEditViewLocalePicker/Bullet.js | 4 +- .../CMEditViewLocalePicker/index.js | 11 ++- .../CMEditViewInjectedComponents/index.js | 7 +- .../DeleteModalAdditionalInfos/index.js | 6 +- .../PublishModalAdditionalInfos/index.js | 6 +- .../UnpublishModalAdditionalInfos/index.js | 6 +- .../components/CheckboxConfirmation/index.js | 12 +-- .../admin/src/components/Initializer/index.js | 4 +- .../admin/src/components/LabelAction/index.js | 3 +- .../src/components/LocaleList/LocaleTable.js | 15 ++-- .../admin/src/components/LocaleList/index.js | 15 ++-- .../LocaleListCell/LocaleListCell.js | 14 +-- .../tests/LocaleListCell.test.js | 6 +- .../src/components/LocalePicker/index.js | 8 +- .../src/components/LocaleSelect/index.js | 8 +- .../LocaleSelect/tests/LocaleSelect.test.js | 9 +- .../components/ModalCreate/AdvancedForm.js | 4 +- .../src/components/ModalCreate/BaseForm.js | 4 +- .../admin/src/components/ModalCreate/index.js | 31 ++++--- .../admin/src/components/ModalDelete/index.js | 4 +- .../src/components/ModalEdit/AdvancedForm.js | 8 +- .../src/components/ModalEdit/BaseForm.js | 10 ++- .../admin/src/components/ModalEdit/index.js | 37 ++++---- .../admin/src/components/SettingsModal.js | 8 +- .../contentManagerHooks/addColumnToTable.js | 2 + .../mutateEditViewLayout.js | 4 +- .../addLocaleToCollectionTypesLinks.test.js | 1 + .../tests/addLocaleToSingleTypesLinks.test.js | 1 + .../tests/mutateEditViewLayout.test.js | 2 + .../utils/addLocaleToLinksSearch.js | 3 +- .../plugins/i18n/admin/src/hooks/reducers.js | 4 +- .../admin/src/hooks/tests/reducers.test.js | 2 +- .../admin/src/hooks/useAddLocale/index.js | 4 +- .../hooks/useContentTypePermissions/index.js | 1 + .../src/hooks/useDefaultLocales/index.js | 5 +- .../admin/src/hooks/useDeleteLocale/index.js | 2 + .../admin/src/hooks/useEditLocale/index.js | 2 + .../i18n/admin/src/hooks/useHasI18n/index.js | 2 +- .../i18n/admin/src/hooks/useLocales/index.js | 4 +- packages/plugins/i18n/admin/src/index.js | 22 ++--- .../addCommonFieldsToInitialDataMiddleware.js | 13 +-- .../i18n/admin/src/middlewares/index.js | 2 +- ...ommonFieldsToInitialDataMiddleware.test.js | 1 + .../pages/SettingsPage/LocaleSettingsPage.js | 2 + .../admin/src/pages/SettingsPage/index.js | 5 +- packages/plugins/i18n/admin/src/schemas.js | 2 +- .../src/selectors/tests/selectors.test.js | 1 + packages/plugins/sentry/admin/src/index.js | 2 + .../admin/src/components/BoundRoute/index.js | 8 +- .../src/components/FormModal/Input/index.js | 5 +- .../FormModal/Input/tests/index.test.js | 4 +- .../admin/src/components/FormModal/index.js | 14 +-- .../components/FormModal/tests/index.test.js | 4 +- .../PermissionRow/CheckboxWrapper.js | 2 +- .../Permissions/PermissionRow/SubCategory.js | 13 +-- .../Permissions/PermissionRow/index.js | 6 +- .../admin/src/components/Permissions/index.js | 7 +- .../Permissions/tests/reducer.test.js | 1 + .../admin/src/components/Policies/index.js | 5 +- .../src/components/UsersPermissions/index.js | 15 ++-- .../UsersPermissions/tests/reducer.test.js | 1 + .../contexts/UsersPermissionsContext/index.js | 1 + .../admin/src/hooks/index.js | 6 +- .../admin/src/hooks/useFetchRole/index.js | 9 +- .../admin/src/hooks/useForm/index.js | 5 +- .../src/hooks/useForm/tests/reducer.test.js | 1 + .../admin/src/hooks/usePlugins/index.js | 7 +- .../admin/src/hooks/useRolesList/index.js | 5 +- .../users-permissions/admin/src/index.js | 2 + .../admin/src/pages/AdvancedSettings/index.js | 39 +++++---- .../AdvancedSettings/tests/index.test.js | 9 +- .../AdvancedSettings/tests/utils/server.js | 2 +- .../src/pages/AdvancedSettings/utils/api.js | 1 + .../pages/AdvancedSettings/utils/schema.js | 2 +- .../EmailTemplates/components/EmailForm.js | 20 +++-- .../EmailTemplates/components/EmailTable.js | 16 ++-- .../admin/src/pages/EmailTemplates/index.js | 21 +++-- .../pages/EmailTemplates/tests/index.test.js | 9 +- .../EmailTemplates/tests/utils/server.js | 2 +- .../src/pages/EmailTemplates/utils/api.js | 1 + .../src/pages/EmailTemplates/utils/schema.js | 2 +- .../admin/src/pages/Providers/index.js | 57 +++++++------ .../src/pages/Providers/tests/index.test.js | 9 +- .../admin/src/pages/Providers/tests/server.js | 2 +- .../admin/src/pages/Providers/utils/api.js | 1 + .../admin/src/pages/Providers/utils/forms.js | 2 +- .../admin/src/pages/Roles/CreatePage/index.js | 39 +++++---- .../Roles/CreatePage/tests/index.test.js | 11 ++- .../pages/Roles/CreatePage/tests/server.js | 3 +- .../pages/Roles/CreatePage/utils/schema.js | 2 +- .../admin/src/pages/Roles/EditPage/index.js | 55 ++++++------ .../pages/Roles/EditPage/tests/index.test.js | 13 +-- .../src/pages/Roles/EditPage/tests/server.js | 3 +- .../src/pages/Roles/EditPage/utils/schema.js | 2 +- .../Roles/ListPage/components/TableBody.js | 7 +- .../admin/src/pages/Roles/ListPage/index.js | 42 ++++----- .../pages/Roles/ListPage/tests/index.test.js | 8 +- .../src/pages/Roles/ListPage/tests/server.js | 2 +- .../src/pages/Roles/ListPage/utils/api.js | 1 + .../pages/Roles/ProtectedCreatePage/index.js | 2 + .../pages/Roles/ProtectedEditPage/index.js | 2 + .../pages/Roles/ProtectedListPage/index.js | 5 +- .../admin/src/pages/Roles/index.js | 13 +-- .../admin/src/utils/index.js | 2 +- 1018 files changed, 4571 insertions(+), 3243 deletions(-) diff --git a/packages/core/admin/admin/src/StrapiApp.js b/packages/core/admin/admin/src/StrapiApp.js index 9484f7749b..bbe0ef2bad 100644 --- a/packages/core/admin/admin/src/StrapiApp.js +++ b/packages/core/admin/admin/src/StrapiApp.js @@ -1,27 +1,29 @@ import React from 'react'; -import { BrowserRouter } from 'react-router-dom'; -import { lightTheme, darkTheme } from '@strapi/design-system'; + +import { darkTheme, lightTheme } from '@strapi/design-system'; +import invariant from 'invariant'; +import isFunction from 'lodash/isFunction'; import merge from 'lodash/merge'; import pick from 'lodash/pick'; -import isFunction from 'lodash/isFunction'; -import invariant from 'invariant'; import { Helmet } from 'react-helmet'; -import { basename, createHook } from './core/utils'; -import configureStore from './core/store/configureStore'; -import { customFields, Plugin } from './core/apis'; -import App from './pages/App'; +import { BrowserRouter } from 'react-router-dom'; + import Logo from './assets/images/logo-strapi-2022.svg'; +import localStorageKey from './components/LanguageProvider/utils/localStorageKey'; import Providers from './components/Providers'; -import languageNativeNames from './translations/languageNativeNames'; +import { customFields, Plugin } from './core/apis'; +import configureStore from './core/store/configureStore'; +import { basename, createHook } from './core/utils'; import { INJECT_COLUMN_IN_TABLE, MUTATE_COLLECTION_TYPES_LINKS, MUTATE_EDIT_VIEW_LAYOUT, MUTATE_SINGLE_TYPES_LINKS, } from './exposedHooks'; -import injectionZones from './injectionZones'; import favicon from './favicon.png'; -import localStorageKey from './components/LanguageProvider/utils/localStorageKey'; +import injectionZones from './injectionZones'; +import App from './pages/App'; +import languageNativeNames from './translations/languageNativeNames'; class StrapiApp { constructor({ adminConfig, appPlugins, library, middlewares, reducers }) { diff --git a/packages/core/admin/admin/src/components/AuthenticatedApp/index.js b/packages/core/admin/admin/src/components/AuthenticatedApp/index.js index f8465ffcd4..a0bb170e27 100644 --- a/packages/core/admin/admin/src/components/AuthenticatedApp/index.js +++ b/packages/core/admin/admin/src/components/AuthenticatedApp/index.js @@ -1,18 +1,22 @@ -import React, { useState, useEffect } from 'react'; -// TODO: DS add loader +import React, { useEffect, useState } from 'react'; + import { + AppInfoProvider, auth, LoadingIndicatorPage, - AppInfoProvider, useGuidedTour, useNotification, } from '@strapi/helper-plugin'; -import { useQueries } from 'react-query'; import get from 'lodash/get'; +import { useQueries } from 'react-query'; +// TODO: DS add loader + import packageJSON from '../../../../package.json'; import { useConfigurations } from '../../hooks'; +import { getFullName, hashAdminUserEmail } from '../../utils'; import PluginsInitializer from '../PluginsInitializer'; import RBACProvider from '../RBACProvider'; + import { fetchAppInfo, fetchCurrentUserPermissions, @@ -20,7 +24,6 @@ import { fetchUserRoles, } from './utils/api'; import checkLatestStrapiVersion from './utils/checkLatestStrapiVersion'; -import { getFullName, hashAdminUserEmail } from '../../utils'; const strapiVersion = packageJSON.version; diff --git a/packages/core/admin/admin/src/components/AuthenticatedApp/tests/index.test.js b/packages/core/admin/admin/src/components/AuthenticatedApp/tests/index.test.js index 606782674e..c531079c6f 100644 --- a/packages/core/admin/admin/src/components/AuthenticatedApp/tests/index.test.js +++ b/packages/core/admin/admin/src/components/AuthenticatedApp/tests/index.test.js @@ -1,21 +1,23 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import { render, waitFor } from '@testing-library/react'; -import { QueryClientProvider, QueryClient } from 'react-query'; + +import { darkTheme, lightTheme } from '@strapi/design-system'; import { useGuidedTour } from '@strapi/helper-plugin'; -import { lightTheme, darkTheme } from '@strapi/design-system'; +import { render, waitFor } from '@testing-library/react'; +import PropTypes from 'prop-types'; import { IntlProvider } from 'react-intl'; +import { QueryClient, QueryClientProvider } from 'react-query'; + +import AuthenticatedApp from '..'; +import packageJSON from '../../../../../package.json'; import { ConfigurationsContext } from '../../../contexts'; +import Theme from '../../Theme'; +import ThemeToggleProvider from '../../ThemeToggleProvider'; import { fetchAppInfo, fetchCurrentUserPermissions, fetchStrapiLatestRelease, fetchUserRoles, } from '../utils/api'; -import packageJSON from '../../../../../package.json'; -import Theme from '../../Theme'; -import ThemeToggleProvider from '../../ThemeToggleProvider'; -import AuthenticatedApp from '..'; const strapiVersion = packageJSON.version; diff --git a/packages/core/admin/admin/src/components/AuthenticatedApp/utils/api.js b/packages/core/admin/admin/src/components/AuthenticatedApp/utils/api.js index 03479df8ad..1b5845b421 100644 --- a/packages/core/admin/admin/src/components/AuthenticatedApp/utils/api.js +++ b/packages/core/admin/admin/src/components/AuthenticatedApp/utils/api.js @@ -1,7 +1,9 @@ import { getFetchClient } from '@strapi/helper-plugin'; -import checkLatestStrapiVersion from './checkLatestStrapiVersion'; + import packageJSON from '../../../../../package.json'; +import checkLatestStrapiVersion from './checkLatestStrapiVersion'; + const strapiVersion = packageJSON.version; const showUpdateNotif = !JSON.parse(localStorage.getItem('STRAPI_UPDATE_NOTIF')); const { get } = getFetchClient(); diff --git a/packages/core/admin/admin/src/components/ConfigurationsProvider/index.js b/packages/core/admin/admin/src/components/ConfigurationsProvider/index.js index ce94ed79c2..e6a4963d00 100644 --- a/packages/core/admin/admin/src/components/ConfigurationsProvider/index.js +++ b/packages/core/admin/admin/src/components/ConfigurationsProvider/index.js @@ -1,6 +1,9 @@ import React, { useCallback, useMemo, useReducer } from 'react'; + import PropTypes from 'prop-types'; + import { ConfigurationsContext } from '../../contexts'; + import reducer, { initialState } from './reducer'; const ConfigurationsProvider = ({ diff --git a/packages/core/admin/admin/src/components/ConfigurationsProvider/tests/index.test.js b/packages/core/admin/admin/src/components/ConfigurationsProvider/tests/index.test.js index d28f7dd8d1..1b3aa674c3 100644 --- a/packages/core/admin/admin/src/components/ConfigurationsProvider/tests/index.test.js +++ b/packages/core/admin/admin/src/components/ConfigurationsProvider/tests/index.test.js @@ -1,7 +1,9 @@ import React from 'react'; -import { render, fireEvent, screen } from '@testing-library/react'; -import ConfigurationsProvider from '../index'; + +import { fireEvent, render, screen } from '@testing-library/react'; + import { useConfigurations } from '../../../hooks'; +import ConfigurationsProvider from '../index'; describe('ConfigurationsProvider', () => { it('should not crash', () => { diff --git a/packages/core/admin/admin/src/components/DragLayer/DragLayer.js b/packages/core/admin/admin/src/components/DragLayer/DragLayer.js index 6a4e1ea60e..e05706f9e6 100644 --- a/packages/core/admin/admin/src/components/DragLayer/DragLayer.js +++ b/packages/core/admin/admin/src/components/DragLayer/DragLayer.js @@ -1,7 +1,8 @@ import * as React from 'react'; + +import { Box } from '@strapi/design-system'; import PropTypes from 'prop-types'; import { useDragLayer } from 'react-dnd'; -import { Box } from '@strapi/design-system'; function getStyle(initialOffset, currentOffset, mouseOffset) { if (!initialOffset || !currentOffset) { diff --git a/packages/core/admin/admin/src/components/GuidedTour/Homepage/components/Step.js b/packages/core/admin/admin/src/components/GuidedTour/Homepage/components/Step.js index ea31ed55c2..c4bb9f24b4 100644 --- a/packages/core/admin/admin/src/components/GuidedTour/Homepage/components/Step.js +++ b/packages/core/admin/admin/src/components/GuidedTour/Homepage/components/Step.js @@ -1,11 +1,13 @@ import React from 'react'; -import { useIntl } from 'react-intl'; -import PropTypes from 'prop-types'; + +import { Box, Flex, Typography } from '@strapi/design-system'; import { pxToRem } from '@strapi/helper-plugin'; -import { Typography, Box, Flex } from '@strapi/design-system'; -import StepNumber from '../../Stepper/StepNumber'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; + +import { IS_ACTIVE, IS_DONE, IS_NOT_DONE } from '../../constants'; import StepLine from '../../Stepper/StepLine'; -import { IS_DONE, IS_ACTIVE, IS_NOT_DONE } from '../../constants'; +import StepNumber from '../../Stepper/StepNumber'; const StepHomepage = ({ type, title, number, content, hasLine }) => { const { formatMessage } = useIntl(); diff --git a/packages/core/admin/admin/src/components/GuidedTour/Homepage/components/Stepper.js b/packages/core/admin/admin/src/components/GuidedTour/Homepage/components/Stepper.js index 9c53587462..bbf41646d4 100644 --- a/packages/core/admin/admin/src/components/GuidedTour/Homepage/components/Stepper.js +++ b/packages/core/admin/admin/src/components/GuidedTour/Homepage/components/Stepper.js @@ -1,8 +1,11 @@ import React from 'react'; -import PropTypes from 'prop-types'; + import { Box } from '@strapi/design-system'; +import PropTypes from 'prop-types'; + +import { IS_ACTIVE, IS_DONE, IS_NOT_DONE } from '../../constants'; + import StepHomepage from './Step'; -import { IS_DONE, IS_ACTIVE, IS_NOT_DONE } from '../../constants'; const getType = (activeSectionIndex, index) => { if (activeSectionIndex === -1) { diff --git a/packages/core/admin/admin/src/components/GuidedTour/Homepage/components/tests/Stepper.test.js b/packages/core/admin/admin/src/components/GuidedTour/Homepage/components/tests/Stepper.test.js index 3a0005fb77..c46b2db290 100644 --- a/packages/core/admin/admin/src/components/GuidedTour/Homepage/components/tests/Stepper.test.js +++ b/packages/core/admin/admin/src/components/GuidedTour/Homepage/components/tests/Stepper.test.js @@ -1,7 +1,9 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; + import Stepper from '../Stepper'; const sections = [ diff --git a/packages/core/admin/admin/src/components/GuidedTour/Homepage/index.js b/packages/core/admin/admin/src/components/GuidedTour/Homepage/index.js index ed38c93d6c..000f07de68 100644 --- a/packages/core/admin/admin/src/components/GuidedTour/Homepage/index.js +++ b/packages/core/admin/admin/src/components/GuidedTour/Homepage/index.js @@ -1,11 +1,14 @@ import React from 'react'; -import { useGuidedTour, useTracking, LinkButton } from '@strapi/helper-plugin'; -import { useIntl } from 'react-intl'; -import { Flex, Box, Typography, Button } from '@strapi/design-system'; + +import { Box, Button, Flex, Typography } from '@strapi/design-system'; +import { LinkButton, useGuidedTour, useTracking } from '@strapi/helper-plugin'; import { ArrowRight } from '@strapi/icons'; -import StepperHomepage from './components/Stepper'; +import { useIntl } from 'react-intl'; + import layout from '../layout'; +import StepperHomepage from './components/Stepper'; + const GuidedTourHomepage = () => { const { guidedTourState, setSkipped } = useGuidedTour(); const { formatMessage } = useIntl(); diff --git a/packages/core/admin/admin/src/components/GuidedTour/Homepage/tests/index.test.js b/packages/core/admin/admin/src/components/GuidedTour/Homepage/tests/index.test.js index c5161a2ece..bb10aa99e0 100644 --- a/packages/core/admin/admin/src/components/GuidedTour/Homepage/tests/index.test.js +++ b/packages/core/admin/admin/src/components/GuidedTour/Homepage/tests/index.test.js @@ -1,10 +1,12 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { TrackingProvider, useGuidedTour } from '@strapi/helper-plugin'; import { render, screen } from '@testing-library/react'; -import { Router } from 'react-router-dom'; import { createMemoryHistory } from 'history'; import { IntlProvider } from 'react-intl'; -import { useGuidedTour, TrackingProvider } from '@strapi/helper-plugin'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; +import { Router } from 'react-router-dom'; + import GuidedTourHomepage from '../index'; jest.mock('@strapi/helper-plugin', () => ({ diff --git a/packages/core/admin/admin/src/components/GuidedTour/Modal/components/Content.js b/packages/core/admin/admin/src/components/GuidedTour/Modal/components/Content.js index 69c01f1760..62828b2481 100644 --- a/packages/core/admin/admin/src/components/GuidedTour/Modal/components/Content.js +++ b/packages/core/admin/admin/src/components/GuidedTour/Modal/components/Content.js @@ -1,8 +1,9 @@ import React from 'react'; + +import { Box, Flex, Typography } from '@strapi/design-system'; import PropTypes from 'prop-types'; -import styled from 'styled-components'; -import { Flex, Box, Typography } from '@strapi/design-system'; import { useIntl } from 'react-intl'; +import styled from 'styled-components'; const LiStyled = styled.li` list-style: disc; diff --git a/packages/core/admin/admin/src/components/GuidedTour/Modal/components/Modal.js b/packages/core/admin/admin/src/components/GuidedTour/Modal/components/Modal.js index 561cf9ed39..d9c3be542b 100644 --- a/packages/core/admin/admin/src/components/GuidedTour/Modal/components/Modal.js +++ b/packages/core/admin/admin/src/components/GuidedTour/Modal/components/Modal.js @@ -1,10 +1,11 @@ import React from 'react'; -import styled from 'styled-components'; + +import { Box, Button, Flex, FocusTrap, IconButton, Portal } from '@strapi/design-system'; +import { pxToRem } from '@strapi/helper-plugin'; +import { Cross } from '@strapi/icons'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { pxToRem } from '@strapi/helper-plugin'; -import { Portal, FocusTrap, Flex, Box, IconButton, Button } from '@strapi/design-system'; -import { Cross } from '@strapi/icons'; +import styled from 'styled-components'; const ModalWrapper = styled(Flex)` position: fixed; diff --git a/packages/core/admin/admin/src/components/GuidedTour/Modal/components/StepNumberWithPadding.js b/packages/core/admin/admin/src/components/GuidedTour/Modal/components/StepNumberWithPadding.js index 27cf9bc9b2..393262714f 100644 --- a/packages/core/admin/admin/src/components/GuidedTour/Modal/components/StepNumberWithPadding.js +++ b/packages/core/admin/admin/src/components/GuidedTour/Modal/components/StepNumberWithPadding.js @@ -1,6 +1,8 @@ import React from 'react'; -import PropTypes from 'prop-types'; + import { Box } from '@strapi/design-system'; +import PropTypes from 'prop-types'; + import StepNumber from '../../Stepper/StepNumber'; const StepNumberWithPadding = ({ number, last, type }) => ( diff --git a/packages/core/admin/admin/src/components/GuidedTour/Modal/components/Stepper.js b/packages/core/admin/admin/src/components/GuidedTour/Modal/components/Stepper.js index b24e2533cd..4d63b4bc95 100644 --- a/packages/core/admin/admin/src/components/GuidedTour/Modal/components/Stepper.js +++ b/packages/core/admin/admin/src/components/GuidedTour/Modal/components/Stepper.js @@ -1,13 +1,16 @@ import React from 'react'; + +import { Box, Button, Flex, Typography } from '@strapi/design-system'; +import { LinkButton, pxToRem } from '@strapi/helper-plugin'; +import { ArrowRight } from '@strapi/icons'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { pxToRem, LinkButton } from '@strapi/helper-plugin'; -import { Typography, Button, Box, Flex } from '@strapi/design-system'; -import { ArrowRight } from '@strapi/icons'; -import Content from './Content'; + +import { IS_ACTIVE, IS_DONE } from '../../constants'; import StepLine from '../../Stepper/StepLine'; + +import Content from './Content'; import StepNumberWithPadding from './StepNumberWithPadding'; -import { IS_DONE, IS_ACTIVE } from '../../constants'; const StepperModal = ({ title, diff --git a/packages/core/admin/admin/src/components/GuidedTour/Modal/index.js b/packages/core/admin/admin/src/components/GuidedTour/Modal/index.js index d238a52533..5d2e4b1846 100644 --- a/packages/core/admin/admin/src/components/GuidedTour/Modal/index.js +++ b/packages/core/admin/admin/src/components/GuidedTour/Modal/index.js @@ -1,10 +1,13 @@ -import React, { useEffect, useState, useReducer } from 'react'; -import at from 'lodash/at'; +import React, { useEffect, useReducer, useState } from 'react'; + import { useGuidedTour, useTracking } from '@strapi/helper-plugin'; +import at from 'lodash/at'; + import layout from '../layout'; + import Modal from './components/Modal'; -import reducer, { initialState } from './reducer'; import StepperModal from './components/Stepper'; +import reducer, { initialState } from './reducer'; const GuidedTourModal = () => { const { diff --git a/packages/core/admin/admin/src/components/GuidedTour/Modal/tests/index.test.js b/packages/core/admin/admin/src/components/GuidedTour/Modal/tests/index.test.js index 2ab784b220..5fe0529002 100644 --- a/packages/core/admin/admin/src/components/GuidedTour/Modal/tests/index.test.js +++ b/packages/core/admin/admin/src/components/GuidedTour/Modal/tests/index.test.js @@ -1,8 +1,10 @@ import React from 'react'; + +import { darkTheme, lightTheme } from '@strapi/design-system'; +import { useGuidedTour } from '@strapi/helper-plugin'; import { render, screen } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; -import { useGuidedTour } from '@strapi/helper-plugin'; -import { lightTheme, darkTheme } from '@strapi/design-system'; + import Theme from '../../../Theme'; import ThemeToggleProvider from '../../../ThemeToggleProvider'; import GuidedTourModal from '../index'; diff --git a/packages/core/admin/admin/src/components/GuidedTour/Stepper/StepLine.js b/packages/core/admin/admin/src/components/GuidedTour/Stepper/StepLine.js index 715dbc857c..329142fbad 100644 --- a/packages/core/admin/admin/src/components/GuidedTour/Stepper/StepLine.js +++ b/packages/core/admin/admin/src/components/GuidedTour/Stepper/StepLine.js @@ -1,8 +1,10 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import { pxToRem } from '@strapi/helper-plugin'; + import { Box } from '@strapi/design-system'; -import { IS_DONE, IS_ACTIVE, IS_NOT_DONE } from '../constants'; +import { pxToRem } from '@strapi/helper-plugin'; +import PropTypes from 'prop-types'; + +import { IS_ACTIVE, IS_DONE, IS_NOT_DONE } from '../constants'; const StepLine = ({ type, ...props }) => { return ( diff --git a/packages/core/admin/admin/src/components/GuidedTour/Stepper/StepNumber.js b/packages/core/admin/admin/src/components/GuidedTour/Stepper/StepNumber.js index 67306c50a3..e2ca6823a4 100644 --- a/packages/core/admin/admin/src/components/GuidedTour/Stepper/StepNumber.js +++ b/packages/core/admin/admin/src/components/GuidedTour/Stepper/StepNumber.js @@ -1,9 +1,11 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import { pxToRem } from '@strapi/helper-plugin'; + import { Flex, Icon, Typography } from '@strapi/design-system'; +import { pxToRem } from '@strapi/helper-plugin'; import { Check } from '@strapi/icons'; -import { IS_DONE, IS_ACTIVE, IS_NOT_DONE } from '../constants'; +import PropTypes from 'prop-types'; + +import { IS_ACTIVE, IS_DONE, IS_NOT_DONE } from '../constants'; const StepNumber = ({ type, number }) => { if (type === IS_DONE) { diff --git a/packages/core/admin/admin/src/components/GuidedTour/index.js b/packages/core/admin/admin/src/components/GuidedTour/index.js index cab615509c..22a0c3e87a 100644 --- a/packages/core/admin/admin/src/components/GuidedTour/index.js +++ b/packages/core/admin/admin/src/components/GuidedTour/index.js @@ -1,12 +1,14 @@ import React, { useReducer } from 'react'; -import PropTypes from 'prop-types'; -import get from 'lodash/get'; + import { GuidedTourProvider } from '@strapi/helper-plugin'; -import persistStateToLocaleStorage from './utils/persistStateToLocaleStorage'; +import get from 'lodash/get'; +import PropTypes from 'prop-types'; + +import init from './init'; +import reducer, { initialState } from './reducer'; import arePreviousSectionsDone from './utils/arePreviousSectionsDone'; import arePreviousStepsDone from './utils/arePreviousStepsDone'; -import reducer, { initialState } from './reducer'; -import init from './init'; +import persistStateToLocaleStorage from './utils/persistStateToLocaleStorage'; const GuidedTour = ({ children }) => { const [{ currentStep, guidedTourState, isGuidedTourVisible, isSkipped }, dispatch] = useReducer( diff --git a/packages/core/admin/admin/src/components/GuidedTour/init.js b/packages/core/admin/admin/src/components/GuidedTour/init.js index 4aadedce0b..82ec4f3e7b 100644 --- a/packages/core/admin/admin/src/components/GuidedTour/init.js +++ b/packages/core/admin/admin/src/components/GuidedTour/init.js @@ -1,4 +1,5 @@ import set from 'lodash/set'; + import persistStateToLocaleStorage, { COMPLETED_STEPS, CURRENT_STEP, diff --git a/packages/core/admin/admin/src/components/GuidedTour/tests/index.test.js b/packages/core/admin/admin/src/components/GuidedTour/tests/index.test.js index d4aae9d8c6..3eb554a837 100644 --- a/packages/core/admin/admin/src/components/GuidedTour/tests/index.test.js +++ b/packages/core/admin/admin/src/components/GuidedTour/tests/index.test.js @@ -1,6 +1,8 @@ import React, { useEffect } from 'react'; -import { render, screen, fireEvent } from '@testing-library/react'; + import { useGuidedTour } from '@strapi/helper-plugin/'; +import { fireEvent, render, screen } from '@testing-library/react'; + import GuidedTour from '../index'; describe('GuidedTour', () => { diff --git a/packages/core/admin/admin/src/components/GuidedTour/tests/init.test.js b/packages/core/admin/admin/src/components/GuidedTour/tests/init.test.js index ba6eeccae2..f65924af1d 100644 --- a/packages/core/admin/admin/src/components/GuidedTour/tests/init.test.js +++ b/packages/core/admin/admin/src/components/GuidedTour/tests/init.test.js @@ -1,4 +1,5 @@ import cloneDeep from 'lodash/cloneDeep'; + import init from '../init'; import { initialState } from '../reducer'; diff --git a/packages/core/admin/admin/src/components/LanguageProvider/index.js b/packages/core/admin/admin/src/components/LanguageProvider/index.js index 25d19c819c..1d069e5dfe 100644 --- a/packages/core/admin/admin/src/components/LanguageProvider/index.js +++ b/packages/core/admin/admin/src/components/LanguageProvider/index.js @@ -7,13 +7,16 @@ */ import React, { useEffect, useReducer } from 'react'; + +import defaultsDeep from 'lodash/defaultsDeep'; import PropTypes from 'prop-types'; import { IntlProvider } from 'react-intl'; -import defaultsDeep from 'lodash/defaultsDeep'; + import LocalesProvider from '../LocalesProvider'; -import localStorageKey from './utils/localStorageKey'; + import init from './init'; import reducer, { initialState } from './reducer'; +import localStorageKey from './utils/localStorageKey'; const LanguageProvider = ({ children, localeNames, messages }) => { const [{ locale }, dispatch] = useReducer(reducer, initialState, () => init(localeNames)); diff --git a/packages/core/admin/admin/src/components/LanguageProvider/tests/index.test.js b/packages/core/admin/admin/src/components/LanguageProvider/tests/index.test.js index cbb7dbea59..de659b72f0 100644 --- a/packages/core/admin/admin/src/components/LanguageProvider/tests/index.test.js +++ b/packages/core/admin/admin/src/components/LanguageProvider/tests/index.test.js @@ -1,10 +1,12 @@ import React from 'react'; -import { render, screen, fireEvent } from '@testing-library/react'; + +import { fireEvent, render, screen } from '@testing-library/react'; import { useIntl } from 'react-intl'; -import useLocalesProvider from '../../LocalesProvider/useLocalesProvider'; -import LanguageProvider from '../index'; + import en from '../../../translations/en.json'; import fr from '../../../translations/fr.json'; +import useLocalesProvider from '../../LocalesProvider/useLocalesProvider'; +import LanguageProvider from '../index'; const messages = { en, fr }; const localeNames = { en: 'English', fr: 'Français' }; diff --git a/packages/core/admin/admin/src/components/LeftMenu/index.js b/packages/core/admin/admin/src/components/LeftMenu/index.js index daf5466c89..0210176bdb 100644 --- a/packages/core/admin/admin/src/components/LeftMenu/index.js +++ b/packages/core/admin/admin/src/components/LeftMenu/index.js @@ -1,27 +1,29 @@ import React, { useRef, useState } from 'react'; -import styled from 'styled-components'; -import PropTypes from 'prop-types'; -import { useIntl } from 'react-intl'; -import { NavLink as RouterNavLink, useLocation, useHistory } from 'react-router-dom'; -import { Divider, FocusTrap, Box, Typography, Flex } from '@strapi/design-system'; + +import { Box, Divider, Flex, FocusTrap, Typography } from '@strapi/design-system'; import { MainNav, NavBrand, - NavSections, - NavLink, - NavSection, - NavUser, NavCondense, NavFooter, + NavLink, + NavSection, + NavSections, + NavUser, } from '@strapi/design-system/v2'; -import { Write, Exit } from '@strapi/icons'; import { auth, - usePersistentState, - useAppInfo, - useTracking, getFetchClient, + useAppInfo, + usePersistentState, + useTracking, } from '@strapi/helper-plugin'; +import { Exit, Write } from '@strapi/icons'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import { NavLink as RouterNavLink, useHistory, useLocation } from 'react-router-dom'; +import styled from 'styled-components'; + import { useConfigurations } from '../../hooks'; const LinkUserWrapper = styled(Box)` diff --git a/packages/core/admin/admin/src/components/LocalesProvider/index.js b/packages/core/admin/admin/src/components/LocalesProvider/index.js index 98ee3c4100..32a7fa0e91 100644 --- a/packages/core/admin/admin/src/components/LocalesProvider/index.js +++ b/packages/core/admin/admin/src/components/LocalesProvider/index.js @@ -1,5 +1,7 @@ import React from 'react'; + import PropTypes from 'prop-types'; + import LocalesProviderContext from './context'; const LocalesProvider = ({ changeLocale, children, localeNames }) => { diff --git a/packages/core/admin/admin/src/components/LocalesProvider/tests/index.test.js b/packages/core/admin/admin/src/components/LocalesProvider/tests/index.test.js index c3a6853e28..7eb2a00001 100644 --- a/packages/core/admin/admin/src/components/LocalesProvider/tests/index.test.js +++ b/packages/core/admin/admin/src/components/LocalesProvider/tests/index.test.js @@ -1,5 +1,7 @@ import React from 'react'; + import { render } from '@testing-library/react'; + import LocalesProvider from '../index'; describe('LocalesProvider', () => { diff --git a/packages/core/admin/admin/src/components/LocalesProvider/useLocalesProvider.js b/packages/core/admin/admin/src/components/LocalesProvider/useLocalesProvider.js index 1c0e418fb9..524bd9b98d 100644 --- a/packages/core/admin/admin/src/components/LocalesProvider/useLocalesProvider.js +++ b/packages/core/admin/admin/src/components/LocalesProvider/useLocalesProvider.js @@ -1,4 +1,5 @@ import { useContext } from 'react'; + import LocalesProviderContext from './context'; const useLocalesProvider = () => { diff --git a/packages/core/admin/admin/src/components/PluginsInitializer/index.js b/packages/core/admin/admin/src/components/PluginsInitializer/index.js index bd3a1b6c74..51a3cb904a 100644 --- a/packages/core/admin/admin/src/components/PluginsInitializer/index.js +++ b/packages/core/admin/admin/src/components/PluginsInitializer/index.js @@ -1,5 +1,7 @@ import React, { useReducer, useRef } from 'react'; + import { LoadingIndicatorPage, useStrapiApp } from '@strapi/helper-plugin'; + import Admin from '../../pages/Admin'; import init from './init'; diff --git a/packages/core/admin/admin/src/components/PluginsInitializer/tests/index.test.js b/packages/core/admin/admin/src/components/PluginsInitializer/tests/index.test.js index f9909a3e63..0109608db9 100644 --- a/packages/core/admin/admin/src/components/PluginsInitializer/tests/index.test.js +++ b/packages/core/admin/admin/src/components/PluginsInitializer/tests/index.test.js @@ -1,6 +1,8 @@ import React from 'react'; + import { StrapiAppProvider } from '@strapi/helper-plugin'; import { render } from '@testing-library/react'; + import PluginsInitializer from '../index'; jest.mock('../../../pages/Admin', () => () => { diff --git a/packages/core/admin/admin/src/components/PrivateRoute/index.js b/packages/core/admin/admin/src/components/PrivateRoute/index.js index 9f99bff0e9..e09b1a56ce 100644 --- a/packages/core/admin/admin/src/components/PrivateRoute/index.js +++ b/packages/core/admin/admin/src/components/PrivateRoute/index.js @@ -8,9 +8,10 @@ */ import React, { memo } from 'react'; -import { Redirect, Route, useLocation } from 'react-router-dom'; -import PropTypes from 'prop-types'; + import { auth } from '@strapi/helper-plugin'; +import PropTypes from 'prop-types'; +import { Redirect, Route, useLocation } from 'react-router-dom'; /* eslint-disable react/jsx-curly-newline */ diff --git a/packages/core/admin/admin/src/components/PrivateRoute/tests/index.test.js b/packages/core/admin/admin/src/components/PrivateRoute/tests/index.test.js index ac06f7b7c6..4ce68d512c 100644 --- a/packages/core/admin/admin/src/components/PrivateRoute/tests/index.test.js +++ b/packages/core/admin/admin/src/components/PrivateRoute/tests/index.test.js @@ -1,9 +1,10 @@ import React from 'react'; -import { Router, Route, Switch } from 'react-router-dom'; -import { createMemoryHistory } from 'history'; -import { act, render, screen, waitFor } from '@testing-library/react'; import { auth } from '@strapi/helper-plugin'; +import { act, render, screen, waitFor } from '@testing-library/react'; +import { createMemoryHistory } from 'history'; +import { Route, Router, Switch } from 'react-router-dom'; + import PrivateRoute from '..'; const ProtectedPage = () => { diff --git a/packages/core/admin/admin/src/components/Providers/index.js b/packages/core/admin/admin/src/components/Providers/index.js index 9bd08c6213..412891cbc7 100644 --- a/packages/core/admin/admin/src/components/Providers/index.js +++ b/packages/core/admin/admin/src/components/Providers/index.js @@ -1,21 +1,23 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import { QueryClientProvider, QueryClient } from 'react-query'; + import { - LibraryProvider, - CustomFieldsProvider, - StrapiAppProvider, AutoReloadOverlayBlockerProvider, - OverlayBlockerProvider, + CustomFieldsProvider, + LibraryProvider, NotificationsProvider, + OverlayBlockerProvider, + StrapiAppProvider, } from '@strapi/helper-plugin'; +import PropTypes from 'prop-types'; +import { QueryClient, QueryClientProvider } from 'react-query'; import { Provider } from 'react-redux'; + import { AdminContext } from '../../contexts'; import ConfigurationsProvider from '../ConfigurationsProvider'; -import LanguageProvider from '../LanguageProvider'; import GuidedTour from '../GuidedTour'; -import ThemeToggleProvider from '../ThemeToggleProvider'; +import LanguageProvider from '../LanguageProvider'; import Theme from '../Theme'; +import ThemeToggleProvider from '../ThemeToggleProvider'; const queryClient = new QueryClient({ defaultOptions: { diff --git a/packages/core/admin/admin/src/components/RBACProvider/index.js b/packages/core/admin/admin/src/components/RBACProvider/index.js index 15ec3ed7e8..9d37cf89d4 100644 --- a/packages/core/admin/admin/src/components/RBACProvider/index.js +++ b/packages/core/admin/admin/src/components/RBACProvider/index.js @@ -1,7 +1,9 @@ import React, { useEffect } from 'react'; -import { useDispatch, useSelector } from 'react-redux'; + import { LoadingIndicatorPage, RBACProviderContext } from '@strapi/helper-plugin'; import PropTypes from 'prop-types'; +import { useDispatch, useSelector } from 'react-redux'; + import { resetStore, setPermissions } from './actions'; const RBACProvider = ({ children, permissions, refetchPermissions }) => { diff --git a/packages/core/admin/admin/src/components/RBACProvider/tests/reducer.test.js b/packages/core/admin/admin/src/components/RBACProvider/tests/reducer.test.js index 0654a3baa8..bc50e42559 100644 --- a/packages/core/admin/admin/src/components/RBACProvider/tests/reducer.test.js +++ b/packages/core/admin/admin/src/components/RBACProvider/tests/reducer.test.js @@ -1,6 +1,6 @@ import { fixtures } from '@strapi/admin-test-utils'; -import { setPermissions, resetStore } from '../actions'; +import { resetStore, setPermissions } from '../actions'; import rbacProviderReducer, { initialState } from '../reducer'; describe('rbacProviderReducer', () => { diff --git a/packages/core/admin/admin/src/components/Theme/index.js b/packages/core/admin/admin/src/components/Theme/index.js index 9788a82d1b..3792d4e854 100644 --- a/packages/core/admin/admin/src/components/Theme/index.js +++ b/packages/core/admin/admin/src/components/Theme/index.js @@ -1,7 +1,9 @@ import React from 'react'; + import { DesignSystemProvider } from '@strapi/design-system'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; + import { useThemeToggle } from '../../hooks'; import GlobalStyle from '../GlobalStyle'; diff --git a/packages/core/admin/admin/src/components/ThemeToggleProvider/index.js b/packages/core/admin/admin/src/components/ThemeToggleProvider/index.js index 65482a77a0..76adccec1a 100644 --- a/packages/core/admin/admin/src/components/ThemeToggleProvider/index.js +++ b/packages/core/admin/admin/src/components/ThemeToggleProvider/index.js @@ -4,8 +4,10 @@ * */ -import React, { useState, useMemo, useCallback } from 'react'; +import React, { useCallback, useMemo, useState } from 'react'; + import PropTypes from 'prop-types'; + import { ThemeToggleContext } from '../../contexts'; const THEME_KEY = 'STRAPI_THEME'; diff --git a/packages/core/admin/admin/src/components/UnauthenticatedLogo/index.js b/packages/core/admin/admin/src/components/UnauthenticatedLogo/index.js index 0f32bdf9be..f89a5b72b3 100644 --- a/packages/core/admin/admin/src/components/UnauthenticatedLogo/index.js +++ b/packages/core/admin/admin/src/components/UnauthenticatedLogo/index.js @@ -1,5 +1,7 @@ import React from 'react'; + import styled from 'styled-components'; + import { useConfigurations } from '../../hooks'; const Img = styled.img` diff --git a/packages/core/admin/admin/src/content-manager/components/AttributeFilter/Filters.js b/packages/core/admin/admin/src/content-manager/components/AttributeFilter/Filters.js index 73fca489e4..ee2755fe0c 100644 --- a/packages/core/admin/admin/src/content-manager/components/AttributeFilter/Filters.js +++ b/packages/core/admin/admin/src/content-manager/components/AttributeFilter/Filters.js @@ -1,9 +1,10 @@ import React, { useRef, useState } from 'react'; + +import { Box, Button } from '@strapi/design-system'; +import { FilterListURLQuery, FilterPopoverURLQuery, useTracking } from '@strapi/helper-plugin'; +import { Filter } from '@strapi/icons'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { Box, Button } from '@strapi/design-system'; -import { Filter } from '@strapi/icons'; -import { FilterListURLQuery, FilterPopoverURLQuery, useTracking } from '@strapi/helper-plugin'; const Filters = ({ displayedFilters }) => { const [isVisible, setIsVisible] = useState(false); diff --git a/packages/core/admin/admin/src/content-manager/components/AttributeFilter/hooks/useAllowedAttributes.js b/packages/core/admin/admin/src/content-manager/components/AttributeFilter/hooks/useAllowedAttributes.js index edfe341101..05068e0460 100644 --- a/packages/core/admin/admin/src/content-manager/components/AttributeFilter/hooks/useAllowedAttributes.js +++ b/packages/core/admin/admin/src/content-manager/components/AttributeFilter/hooks/useAllowedAttributes.js @@ -1,5 +1,5 @@ +import { findMatchingPermissions, useRBACProvider } from '@strapi/helper-plugin'; import get from 'lodash/get'; -import { useRBACProvider, findMatchingPermissions } from '@strapi/helper-plugin'; const NOT_ALLOWED_FILTERS = ['json', 'component', 'media', 'richtext', 'dynamiczone', 'password']; const TIMESTAMPS = ['createdAt', 'updatedAt']; diff --git a/packages/core/admin/admin/src/content-manager/components/AttributeFilter/index.js b/packages/core/admin/admin/src/content-manager/components/AttributeFilter/index.js index 48f922124d..b34e5a1d33 100644 --- a/packages/core/admin/admin/src/content-manager/components/AttributeFilter/index.js +++ b/packages/core/admin/admin/src/content-manager/components/AttributeFilter/index.js @@ -1,8 +1,10 @@ import React from 'react'; + import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import useAllowedAttributes from './hooks/useAllowedAttributes'; + import Filters from './Filters'; +import useAllowedAttributes from './hooks/useAllowedAttributes'; const AttributeFilter = ({ contentType, slug, metadatas }) => { const { formatMessage } = useIntl(); diff --git a/packages/core/admin/admin/src/content-manager/components/CollectionTypeFormWrapper/index.js b/packages/core/admin/admin/src/content-manager/components/CollectionTypeFormWrapper/index.js index 6ec515527d..d1425f2836 100644 --- a/packages/core/admin/admin/src/content-manager/components/CollectionTypeFormWrapper/index.js +++ b/packages/core/admin/admin/src/content-manager/components/CollectionTypeFormWrapper/index.js @@ -1,27 +1,23 @@ import { memo, useCallback, useEffect, useMemo, useRef } from 'react'; -import { useQueryClient } from 'react-query'; -import { useHistory } from 'react-router-dom'; -import axios from 'axios'; -import get from 'lodash/get'; + import { - useTracking, - useNotification, - useQueryParams, - formatContentTypeData, contentManagementUtilRemoveFieldsFromData, - useGuidedTour, + formatContentTypeData, useAPIErrorHandler, useFetchClient, + useGuidedTour, + useNotification, + useQueryParams, + useTracking, } from '@strapi/helper-plugin'; -import { useSelector, useDispatch } from 'react-redux'; -import PropTypes from 'prop-types'; +import axios from 'axios'; +import get from 'lodash/get'; import isEqual from 'lodash/isEqual'; -import { - createDefaultForm, - getTrad, - getRequestUrl, - removePasswordFieldsFromData, -} from '../../utils'; +import PropTypes from 'prop-types'; +import { useQueryClient } from 'react-query'; +import { useDispatch, useSelector } from 'react-redux'; +import { useHistory } from 'react-router-dom'; + import { useFindRedirectionLink } from '../../hooks'; import { getData, @@ -33,6 +29,12 @@ import { submitSucceeded, } from '../../sharedReducers/crudReducer/actions'; import selectCrudReducer from '../../sharedReducers/crudReducer/selectors'; +import { + createDefaultForm, + getRequestUrl, + getTrad, + removePasswordFieldsFromData, +} from '../../utils'; // This container is used to handle the CRUD const CollectionTypeFormWrapper = ({ allLayoutData, children, slug, id, origin }) => { diff --git a/packages/core/admin/admin/src/content-manager/components/ComponentIcon/ComponentIcon.js b/packages/core/admin/admin/src/content-manager/components/ComponentIcon/ComponentIcon.js index 21ceb566f9..620fee625f 100644 --- a/packages/core/admin/admin/src/content-manager/components/ComponentIcon/ComponentIcon.js +++ b/packages/core/admin/admin/src/content-manager/components/ComponentIcon/ComponentIcon.js @@ -1,7 +1,8 @@ -import PropTypes from 'prop-types'; import React from 'react'; import { Flex, Icon } from '@strapi/design-system'; +import PropTypes from 'prop-types'; + import { COMPONENT_ICONS } from './constants'; export function ComponentIcon({ showBackground = true, size = 'M', icon }) { diff --git a/packages/core/admin/admin/src/content-manager/components/ComponentInitializer/index.js b/packages/core/admin/admin/src/content-manager/components/ComponentInitializer/index.js index d3a0394567..bd9777da58 100644 --- a/packages/core/admin/admin/src/content-manager/components/ComponentInitializer/index.js +++ b/packages/core/admin/admin/src/content-manager/components/ComponentInitializer/index.js @@ -1,10 +1,12 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import styled from 'styled-components'; -import { useIntl } from 'react-intl'; -import { PlusCircle } from '@strapi/icons'; + import { Box, Flex, Typography } from '@strapi/design-system'; import { pxToRem } from '@strapi/helper-plugin'; +import { PlusCircle } from '@strapi/icons'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import styled from 'styled-components'; + import { getTrad } from '../../utils'; const IconWrapper = styled.span` diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicTable/BulkActionsBar/index.js b/packages/core/admin/admin/src/content-manager/components/DynamicTable/BulkActionsBar/index.js index 7ffe9c9336..868c652e28 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicTable/BulkActionsBar/index.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicTable/BulkActionsBar/index.js @@ -1,13 +1,15 @@ import React, { useState } from 'react'; -import PropTypes from 'prop-types'; + import { Button, Dialog, DialogBody, DialogFooter, Flex, Typography } from '@strapi/design-system'; +import { useTracking } from '@strapi/helper-plugin'; import { Check, ExclamationMarkCircle, Trash } from '@strapi/icons'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; import { useSelector } from 'react-redux'; -import { useTracking } from '@strapi/helper-plugin'; + +import { listViewDomain } from '../../../pages/ListView/selectors'; import { getTrad } from '../../../utils'; import InjectionZoneList from '../../InjectionZoneList'; -import { listViewDomain } from '../../../pages/ListView/selectors'; const ConfirmBulkActionDialog = ({ onToggleDialog, isOpen, dialogBody, endAction }) => { const { formatMessage } = useIntl(); diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicTable/BulkActionsBar/tests/index.test.js b/packages/core/admin/admin/src/content-manager/components/DynamicTable/BulkActionsBar/tests/index.test.js index eeb623a564..5891532d56 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicTable/BulkActionsBar/tests/index.test.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicTable/BulkActionsBar/tests/index.test.js @@ -1,8 +1,10 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render, screen, waitFor, within } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; import { IntlProvider } from 'react-intl'; + import BulkActionsBar from '../index'; jest.mock('@strapi/helper-plugin', () => ({ diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/CellValue.js b/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/CellValue.js index 3e94f5d83c..69797d5ea4 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/CellValue.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/CellValue.js @@ -1,7 +1,7 @@ +import parseISO from 'date-fns/parseISO'; +import toString from 'lodash/toString'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import toString from 'lodash/toString'; -import parseISO from 'date-fns/parseISO'; const CellValue = ({ type, value }) => { const { formatDate, formatTime, formatNumber } = useIntl(); diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/Media/FileWrapper.js b/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/Media/FileWrapper.js index 6dbd43a84c..cd18ee6324 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/Media/FileWrapper.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/Media/FileWrapper.js @@ -1,7 +1,8 @@ import React from 'react'; + +import { Flex, Typography } from '@strapi/design-system'; import PropTypes from 'prop-types'; import styled from 'styled-components'; -import { Flex, Typography } from '@strapi/design-system'; const Wrapper = styled(Flex)` position: relative; diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/Media/index.js b/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/Media/index.js index f6c614184a..c174940c82 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/Media/index.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/Media/index.js @@ -1,7 +1,8 @@ -import PropTypes from 'prop-types'; import React from 'react'; + import { Avatar, Tooltip } from '@strapi/design-system'; import { getFileExtension, prefixFileUrlWithBackendUrl } from '@strapi/helper-plugin'; +import PropTypes from 'prop-types'; import FileWrapper from './FileWrapper'; diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/MultipleMedias.js b/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/MultipleMedias.js index a3baf012c9..e4481d7018 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/MultipleMedias.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/MultipleMedias.js @@ -1,6 +1,8 @@ import React from 'react'; -import PropTypes from 'prop-types'; + import { AvatarGroup } from '@strapi/design-system'; +import PropTypes from 'prop-types'; + import Media from './Media'; import FileWrapper from './Media/FileWrapper'; diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/PublicationState/PublicationState.js b/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/PublicationState/PublicationState.js index 596cf694d6..9a204cd173 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/PublicationState/PublicationState.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/PublicationState/PublicationState.js @@ -1,7 +1,8 @@ import React from 'react'; + +import { Status, Typography } from '@strapi/design-system'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { Status, Typography } from '@strapi/design-system'; import { getTrad } from '../../../../utils'; diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/PublicationState/tests/PublicationState.test.js b/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/PublicationState/tests/PublicationState.test.js index e0c00c4943..c9925dd5c0 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/PublicationState/tests/PublicationState.test.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/PublicationState/tests/PublicationState.test.js @@ -1,6 +1,7 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render } from '@testing-library/react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; import { IntlProvider } from 'react-intl'; import { PublicationState } from '..'; diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/RelationMultiple/index.js b/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/RelationMultiple/index.js index 04b70824c6..2bd7ac1d11 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/RelationMultiple/index.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/RelationMultiple/index.js @@ -1,3 +1,5 @@ +import React, { useMemo, useState } from 'react'; + import { Badge, Box, @@ -10,10 +12,10 @@ import { } from '@strapi/design-system'; import { stopPropagation, useFetchClient } from '@strapi/helper-plugin'; import PropTypes from 'prop-types'; -import React, { useMemo, useState } from 'react'; import { useIntl } from 'react-intl'; import { useQuery } from 'react-query'; import styled from 'styled-components'; + import { getRequestUrl, getTrad } from '../../../../utils'; import CellValue from '../CellValue'; diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/RelationMultiple/tests/index.test.js b/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/RelationMultiple/tests/index.test.js index 80941050c6..a4f688531c 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/RelationMultiple/tests/index.test.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/RelationMultiple/tests/index.test.js @@ -1,10 +1,11 @@ import React from 'react'; -import { render, fireEvent, screen, waitFor } from '@testing-library/react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import { IntlProvider } from 'react-intl'; -import { QueryClientProvider, QueryClient } from 'react-query'; +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { useFetchClient } from '@strapi/helper-plugin'; +import { fireEvent, render, screen, waitFor } from '@testing-library/react'; +import { IntlProvider } from 'react-intl'; +import { QueryClient, QueryClientProvider } from 'react-query'; + import RelationMultiple from '../index'; jest.mock('@strapi/helper-plugin', () => ({ diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/RelationSingle/index.js b/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/RelationSingle/index.js index 1c3f6bfcfb..537e7a2180 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/RelationSingle/index.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/RelationSingle/index.js @@ -1,7 +1,9 @@ import React from 'react'; -import PropTypes from 'prop-types'; + import { Typography } from '@strapi/design-system'; +import PropTypes from 'prop-types'; import styled from 'styled-components'; + import CellValue from '../CellValue'; const TypographyMaxWidth = styled(Typography)` diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/RelationSingle/tests/index.test.js b/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/RelationSingle/tests/index.test.js index 7551f0ff0c..f3b3cd918b 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/RelationSingle/tests/index.test.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/RelationSingle/tests/index.test.js @@ -1,6 +1,7 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render } from '@testing-library/react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; import { IntlProvider } from 'react-intl'; import RelationSingle from '../index'; diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/RepeatableComponent/index.js b/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/RepeatableComponent/index.js index 431a33cf98..d02ffb4e43 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/RepeatableComponent/index.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/RepeatableComponent/index.js @@ -1,9 +1,10 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import styled from 'styled-components'; -import { useIntl } from 'react-intl'; -import { Badge, Box, Typography, SimpleMenu, MenuItem } from '@strapi/design-system'; + +import { Badge, Box, MenuItem, SimpleMenu, Typography } from '@strapi/design-system'; import { stopPropagation } from '@strapi/helper-plugin'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import styled from 'styled-components'; import CellValue from '../CellValue'; diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/SingleComponent/index.js b/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/SingleComponent/index.js index af31e23216..34473b02b6 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/SingleComponent/index.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/SingleComponent/index.js @@ -1,7 +1,8 @@ import React from 'react'; + +import { Tooltip, Typography } from '@strapi/design-system'; import PropTypes from 'prop-types'; import styled from 'styled-components'; -import { Tooltip, Typography } from '@strapi/design-system'; import CellValue from '../CellValue'; diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/index.js b/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/index.js index 99c6f28a0f..2ef15275b9 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/index.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/index.js @@ -1,14 +1,16 @@ import React from 'react'; + +import { Tooltip, Typography } from '@strapi/design-system'; import PropTypes from 'prop-types'; import styled from 'styled-components'; -import { Typography, Tooltip } from '@strapi/design-system'; + +import CellValue from './CellValue'; import Media from './Media'; import MultipleMedias from './MultipleMedias'; import RelationMultiple from './RelationMultiple'; import RelationSingle from './RelationSingle'; import RepeatableComponent from './RepeatableComponent'; import SingleComponent from './SingleComponent'; -import CellValue from './CellValue'; import hasContent from './utils/hasContent'; import isSingleRelation from './utils/isSingleRelation'; diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/tests/CellValue.test.js b/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/tests/CellValue.test.js index e3fb485eb8..35a2dcb9c6 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/tests/CellValue.test.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/tests/CellValue.test.js @@ -1,4 +1,5 @@ import React from 'react'; + import { render } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/utils/hasContent.js b/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/utils/hasContent.js index 8e5c097051..228fe734ae 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/utils/hasContent.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/utils/hasContent.js @@ -1,9 +1,10 @@ import isEmpty from 'lodash/isEmpty'; import isNumber from 'lodash/isNumber'; -import isSingleRelation from './isSingleRelation'; import isFieldTypeNumber from '../../../../utils/isFieldTypeNumber'; +import isSingleRelation from './isSingleRelation'; + export default function hasContent(type, content, metadatas, fieldSchema) { if (type === 'component') { const { diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicTable/ConfirmDialogDelete/index.js b/packages/core/admin/admin/src/content-manager/components/DynamicTable/ConfirmDialogDelete/index.js index 5514cba8e0..9343167c1f 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicTable/ConfirmDialogDelete/index.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicTable/ConfirmDialogDelete/index.js @@ -1,8 +1,10 @@ import React from 'react'; + +import { Button, Dialog, DialogBody, DialogFooter, Flex, Typography } from '@strapi/design-system'; +import { ExclamationMarkCircle, Trash } from '@strapi/icons'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { Dialog, DialogBody, DialogFooter, Flex, Typography, Button } from '@strapi/design-system'; -import { ExclamationMarkCircle, Trash } from '@strapi/icons'; + import InjectionZoneList from '../../InjectionZoneList'; const ConfirmDialogDelete = ({ isConfirmButtonLoading, isOpen, onToggleDialog, onConfirm }) => { diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicTable/TableRows/index.js b/packages/core/admin/admin/src/content-manager/components/DynamicTable/TableRows/index.js index 18b97091d4..89fa6dd133 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicTable/TableRows/index.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicTable/TableRows/index.js @@ -1,18 +1,14 @@ import React from 'react'; + +import { BaseCheckbox, Box, Flex, IconButton, Tbody, Td, Tr } from '@strapi/design-system'; +import { onRowClick, stopPropagation, useTracking } from '@strapi/helper-plugin'; +import { Duplicate, Pencil, Trash } from '@strapi/icons'; import PropTypes from 'prop-types'; -import { Link, useHistory } from 'react-router-dom'; import { useIntl } from 'react-intl'; - -import { BaseCheckbox, Box, IconButton, Tbody, Td, Tr, Flex } from '@strapi/design-system'; - -import { Trash, Duplicate, Pencil } from '@strapi/icons'; - -import { useTracking, stopPropagation, onRowClick } from '@strapi/helper-plugin'; - -import { usePluginsQueryParams } from '../../../hooks'; +import { Link, useHistory } from 'react-router-dom'; import { getFullName } from '../../../../utils'; - +import { usePluginsQueryParams } from '../../../hooks'; import CellContent from '../CellContent'; const TableRows = ({ diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicTable/index.js b/packages/core/admin/admin/src/content-manager/components/DynamicTable/index.js index 9adc757ff4..c2bc4f152c 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicTable/index.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicTable/index.js @@ -1,17 +1,19 @@ import React, { useMemo } from 'react'; + +import { DynamicTable as Table, useStrapiApp } from '@strapi/helper-plugin'; +import getReviewWorkflowsColumn from 'ee_else_ce/content-manager/components/DynamicTable/CellContent/ReviewWorkflowsStage/getTableColumn'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { DynamicTable as Table, useStrapiApp } from '@strapi/helper-plugin'; import { useSelector } from 'react-redux'; -import getReviewWorkflowsColumn from 'ee_else_ce/content-manager/components/DynamicTable/CellContent/ReviewWorkflowsStage/getTableColumn'; import { INJECT_COLUMN_IN_TABLE } from '../../../exposedHooks'; import { selectDisplayedHeaders } from '../../pages/ListView/selectors'; import { getTrad } from '../../utils'; -import TableRows from './TableRows'; -import ConfirmDialogDelete from './ConfirmDialogDelete'; -import { PublicationState } from './CellContent/PublicationState/PublicationState'; + import BulkActionsBar from './BulkActionsBar'; +import { PublicationState } from './CellContent/PublicationState/PublicationState'; +import ConfirmDialogDelete from './ConfirmDialogDelete'; +import TableRows from './TableRows'; const DynamicTable = ({ canCreate, diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/AddComponentButton.js b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/AddComponentButton.js index 9f0860eaba..2f5f27cee4 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/AddComponentButton.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/AddComponentButton.js @@ -5,10 +5,11 @@ */ import React from 'react'; + +import { BaseButton, Flex, Typography } from '@strapi/design-system'; +import { PlusCircle } from '@strapi/icons'; import PropTypes from 'prop-types'; import styled from 'styled-components'; -import { PlusCircle } from '@strapi/icons'; -import { BaseButton, Flex, Typography } from '@strapi/design-system'; export const AddComponentButton = ({ hasError, isDisabled, isOpen, children, onClick }) => { return ( diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/ComponentCard.js b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/ComponentCard.js index e3bfc6c1fc..c84f74e7fc 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/ComponentCard.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/ComponentCard.js @@ -5,12 +5,12 @@ */ import React from 'react'; + +import { Box, Flex, Typography } from '@strapi/design-system'; +import { pxToRem } from '@strapi/helper-plugin'; import PropTypes from 'prop-types'; import styled from 'styled-components'; -import { Box, Typography, Flex } from '@strapi/design-system'; -import { pxToRem } from '@strapi/helper-plugin'; - import { ComponentIcon } from '../../ComponentIcon'; const ComponentBox = styled(Box)` diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/ComponentCategory.js b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/ComponentCategory.js index 0d3c4c3287..44cba930b5 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/ComponentCategory.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/ComponentCategory.js @@ -1,16 +1,17 @@ import React from 'react'; -import PropTypes from 'prop-types'; + import { Accordion, - AccordionToggle, AccordionContent, + AccordionToggle, Box, Flex, Typography, } from '@strapi/design-system'; import { pxToRem } from '@strapi/helper-plugin'; -import styled from 'styled-components'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; +import styled from 'styled-components'; import { ComponentIcon } from '../../ComponentIcon'; diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/ComponentPicker.js b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/ComponentPicker.js index 1eff918632..d96a56678d 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/ComponentPicker.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/ComponentPicker.js @@ -1,7 +1,8 @@ import React, { useEffect, useState } from 'react'; + +import { Box, Flex, KeyboardNavigable, Typography } from '@strapi/design-system'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { KeyboardNavigable, Box, Flex, Typography } from '@strapi/design-system'; import { getTrad } from '../../../utils'; diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/DynamicComponent.js b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/DynamicComponent.js index 80f7fb9d88..f714b3e880 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/DynamicComponent.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/DynamicComponent.js @@ -1,28 +1,27 @@ import React, { useEffect, useMemo, useState } from 'react'; -import PropTypes from 'prop-types'; -import styled from 'styled-components'; -import { useIntl } from 'react-intl'; -import get from 'lodash/get'; -import { getEmptyImage } from 'react-dnd-html5-backend'; import { Accordion, - AccordionToggle, AccordionContent, - IconButton, + AccordionToggle, Box, Flex, + IconButton, VisuallyHidden, } from '@strapi/design-system'; import { Menu, MenuItem } from '@strapi/design-system/v2'; import { useCMEditViewDataManager } from '@strapi/helper-plugin'; -import { Trash, Drag, More } from '@strapi/icons'; +import { Drag, More, Trash } from '@strapi/icons'; +import get from 'lodash/get'; +import PropTypes from 'prop-types'; +import { getEmptyImage } from 'react-dnd-html5-backend'; +import { useIntl } from 'react-intl'; +import styled from 'styled-components'; import { useContentTypeLayout, useDragAndDrop } from '../../../hooks'; import { composeRefs, getTrad, ItemTypes } from '../../../utils'; - -import FieldComponent from '../../FieldComponent'; import { ComponentIcon } from '../../ComponentIcon'; +import FieldComponent from '../../FieldComponent'; export const DynamicComponent = ({ componentUid, diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/DynamicZoneLabel.js b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/DynamicZoneLabel.js index 4df303ef28..316cec5539 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/DynamicZoneLabel.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/DynamicZoneLabel.js @@ -5,10 +5,11 @@ */ import React from 'react'; -import { useIntl } from 'react-intl'; -import PropTypes from 'prop-types'; -import { pxToRem } from '@strapi/helper-plugin'; + import { Box, Flex, Typography } from '@strapi/design-system'; +import { pxToRem } from '@strapi/helper-plugin'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; export const DynamicZoneLabel = ({ label, diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/tests/AddComponentButton.test.js b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/tests/AddComponentButton.test.js index 87d6b50b98..7dfac70631 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/tests/AddComponentButton.test.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/tests/AddComponentButton.test.js @@ -1,7 +1,8 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render as renderRTL } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; import { IntlProvider } from 'react-intl'; import { AddComponentButton } from '../AddComponentButton'; diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/tests/ComponentCard.test.js b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/tests/ComponentCard.test.js index d50b0feeea..7b7dcb2122 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/tests/ComponentCard.test.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/tests/ComponentCard.test.js @@ -1,10 +1,9 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { fireEvent, render } from '@testing-library/react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; - import GlobalStyle from '../../../../../components/GlobalStyle'; - import ComponentCard from '../ComponentCard'; describe('ComponentCard', () => { diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/tests/ComponentCategory.test.js b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/tests/ComponentCategory.test.js index 4f9ad0b022..6379168d31 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/tests/ComponentCategory.test.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/tests/ComponentCategory.test.js @@ -1,7 +1,8 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render as renderRTL } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; import { IntlProvider } from 'react-intl'; import { ComponentCategory } from '../ComponentCategory'; diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/tests/ComponentPicker.test.js b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/tests/ComponentPicker.test.js index 4078d91d97..0b366e2185 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/tests/ComponentPicker.test.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/tests/ComponentPicker.test.js @@ -1,7 +1,8 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render as renderRTL } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; import { IntlProvider } from 'react-intl'; import { ComponentPicker } from '../ComponentPicker'; diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/tests/DynamicComponent.test.js b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/tests/DynamicComponent.test.js index b002fa95d8..27fe6cfbf7 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/tests/DynamicComponent.test.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/tests/DynamicComponent.test.js @@ -1,14 +1,15 @@ import React from 'react'; -import { render as renderRTL, fireEvent } from '@testing-library/react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { fireEvent, render as renderRTL } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import { IntlProvider } from 'react-intl'; import { DndProvider } from 'react-dnd'; import { HTML5Backend } from 'react-dnd-html5-backend'; +import { IntlProvider } from 'react-intl'; import { DynamicComponent } from '../DynamicComponent'; -import { layoutData, dynamicComponentsByCategory } from './fixtures'; +import { dynamicComponentsByCategory, layoutData } from './fixtures'; jest.mock('../../../../hooks', () => ({ ...jest.requireActual('../../../../hooks'), diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/tests/DynamicZoneLabel.test.js b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/tests/DynamicZoneLabel.test.js index dc211ebabd..f03a193357 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/tests/DynamicZoneLabel.test.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/tests/DynamicZoneLabel.test.js @@ -1,9 +1,9 @@ import React from 'react'; -import { IntlProvider } from 'react-intl'; -import { render as renderRTL } from '@testing-library/react'; -import { ThemeProvider, lightTheme, Tooltip } from '@strapi/design-system'; +import { lightTheme, ThemeProvider, Tooltip } from '@strapi/design-system'; import { Earth } from '@strapi/icons'; +import { render as renderRTL } from '@testing-library/react'; +import { IntlProvider } from 'react-intl'; import { DynamicZoneLabel } from '../DynamicZoneLabel'; diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicZone/index.js b/packages/core/admin/admin/src/content-manager/components/DynamicZone/index.js index 58b726bbe5..71ad20c839 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicZone/index.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicZone/index.js @@ -1,17 +1,17 @@ import React, { useMemo, useState } from 'react'; -import PropTypes from 'prop-types'; + import { Box, Flex, VisuallyHidden } from '@strapi/design-system'; -import { NotAllowedInput, useNotification, useCMEditViewDataManager } from '@strapi/helper-plugin'; +import { NotAllowedInput, useCMEditViewDataManager, useNotification } from '@strapi/helper-plugin'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; +import { useContentTypeLayout } from '../../hooks'; import { getTrad } from '../../utils'; -import { DynamicComponent } from './components/DynamicComponent'; import { AddComponentButton } from './components/AddComponentButton'; -import { DynamicZoneLabel } from './components/DynamicZoneLabel'; import { ComponentPicker } from './components/ComponentPicker'; - -import { useContentTypeLayout } from '../../hooks'; +import { DynamicComponent } from './components/DynamicComponent'; +import { DynamicZoneLabel } from './components/DynamicZoneLabel'; const DynamicZone = ({ name, labelAction, fieldSchema, metadatas }) => { // We cannot use the default props here diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicZone/tests/index.test.js b/packages/core/admin/admin/src/content-manager/components/DynamicZone/tests/index.test.js index 9c58f035b7..9557db2f2d 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicZone/tests/index.test.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicZone/tests/index.test.js @@ -1,11 +1,12 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { useCMEditViewDataManager } from '@strapi/helper-plugin'; import { render as renderRTL } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import { useCMEditViewDataManager } from '@strapi/helper-plugin'; -import { IntlProvider } from 'react-intl'; import { DndProvider } from 'react-dnd'; import { HTML5Backend } from 'react-dnd-html5-backend'; +import { IntlProvider } from 'react-intl'; import { DynamicZone } from '../index'; diff --git a/packages/core/admin/admin/src/content-manager/components/EditViewDataManagerProvider/index.js b/packages/core/admin/admin/src/content-manager/components/EditViewDataManagerProvider/index.js index 5a3ba433a3..1e42ca971d 100644 --- a/packages/core/admin/admin/src/content-manager/components/EditViewDataManagerProvider/index.js +++ b/packages/core/admin/admin/src/content-manager/components/EditViewDataManagerProvider/index.js @@ -1,37 +1,35 @@ /* eslint-disable react/jsx-no-constructed-context-values */ -import React, { useCallback, useEffect, useMemo, useRef, useReducer } from 'react'; -import isEmpty from 'lodash/isEmpty'; -import cloneDeep from 'lodash/cloneDeep'; -import get from 'lodash/get'; -import isEqual from 'lodash/isEqual'; -import set from 'lodash/set'; -import PropTypes from 'prop-types'; -import { useIntl } from 'react-intl'; -import { Prompt, Redirect } from 'react-router-dom'; -import { flushSync } from 'react-dom'; -import { useDispatch, useSelector } from 'react-redux'; +import React, { useCallback, useEffect, useMemo, useReducer, useRef } from 'react'; import { Main } from '@strapi/design-system'; import { - LoadingIndicatorPage, ContentManagerEditViewDataManagerContext, + getAPIInnerErrors, + getYupInnerErrors, + LoadingIndicatorPage, useNotification, useOverlayBlocker, useTracking, - getYupInnerErrors, - getAPIInnerErrors, } from '@strapi/helper-plugin'; +import cloneDeep from 'lodash/cloneDeep'; +import get from 'lodash/get'; +import isEmpty from 'lodash/isEmpty'; +import isEqual from 'lodash/isEqual'; +import set from 'lodash/set'; +import PropTypes from 'prop-types'; +import { flushSync } from 'react-dom'; +import { useIntl } from 'react-intl'; +import { useDispatch, useSelector } from 'react-redux'; +import { Prompt, Redirect } from 'react-router-dom'; -import { createYupSchema, getTrad } from '../../utils'; - +import { usePrev } from '../../hooks'; +import { clearSetModifiedDataOnly } from '../../sharedReducers/crudReducer/actions'; import selectCrudReducer from '../../sharedReducers/crudReducer/selectors'; +import { createYupSchema, getTrad } from '../../utils'; import reducer, { initialState } from './reducer'; import { cleanData } from './utils'; -import { clearSetModifiedDataOnly } from '../../sharedReducers/crudReducer/actions'; -import { usePrev } from '../../hooks'; - const EditViewDataManagerProvider = ({ allLayoutData, allowedActions: { canRead, canUpdate }, diff --git a/packages/core/admin/admin/src/content-manager/components/EditViewDataManagerProvider/reducer.js b/packages/core/admin/admin/src/content-manager/components/EditViewDataManagerProvider/reducer.js index 7153d84c20..19d3926275 100644 --- a/packages/core/admin/admin/src/content-manager/components/EditViewDataManagerProvider/reducer.js +++ b/packages/core/admin/admin/src/content-manager/components/EditViewDataManagerProvider/reducer.js @@ -1,14 +1,15 @@ +import { generateNKeysBetween } from 'fractional-indexing'; import produce from 'immer'; -import unset from 'lodash/unset'; +import cloneDeep from 'lodash/cloneDeep'; import get from 'lodash/get'; import set from 'lodash/set'; import take from 'lodash/take'; -import cloneDeep from 'lodash/cloneDeep'; import uniqBy from 'lodash/uniqBy'; -import { generateNKeysBetween } from 'fractional-indexing'; +import unset from 'lodash/unset'; + +import { getMaxTempKey } from '../../utils'; import { findAllAndReplace, moveFields } from './utils'; -import { getMaxTempKey } from '../../utils'; const initialState = { componentsDataStructure: {}, diff --git a/packages/core/admin/admin/src/content-manager/components/EditViewDataManagerProvider/utils/cleanData.js b/packages/core/admin/admin/src/content-manager/components/EditViewDataManagerProvider/utils/cleanData.js index e33eff09fe..7505a15921 100644 --- a/packages/core/admin/admin/src/content-manager/components/EditViewDataManagerProvider/utils/cleanData.js +++ b/packages/core/admin/admin/src/content-manager/components/EditViewDataManagerProvider/utils/cleanData.js @@ -1,6 +1,7 @@ import get from 'lodash/get'; import isArray from 'lodash/isArray'; import isObject from 'lodash/isObject'; + import { getInitialDataPathUsingTempKeys } from '../../../utils/paths'; /* eslint-disable indent */ diff --git a/packages/core/admin/admin/src/content-manager/components/EditViewDataManagerProvider/utils/index.js b/packages/core/admin/admin/src/content-manager/components/EditViewDataManagerProvider/utils/index.js index b978c442f9..261fa85387 100644 --- a/packages/core/admin/admin/src/content-manager/components/EditViewDataManagerProvider/utils/index.js +++ b/packages/core/admin/admin/src/content-manager/components/EditViewDataManagerProvider/utils/index.js @@ -1,3 +1,3 @@ -export { default as moveFields } from './moveFields'; export { default as cleanData } from './cleanData'; export { findAllAndReplace } from './findAllAndReplace'; +export { default as moveFields } from './moveFields'; diff --git a/packages/core/admin/admin/src/content-manager/components/FieldComponent/Label.js b/packages/core/admin/admin/src/content-manager/components/FieldComponent/Label.js index 874689eefb..3af37fc573 100644 --- a/packages/core/admin/admin/src/content-manager/components/FieldComponent/Label.js +++ b/packages/core/admin/admin/src/content-manager/components/FieldComponent/Label.js @@ -1,8 +1,9 @@ import React from 'react'; + +import { Box, Flex, Typography } from '@strapi/design-system'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; import styled from 'styled-components'; -import { Box, Flex, Typography } from '@strapi/design-system'; const LabelAction = styled(Box)` svg path { diff --git a/packages/core/admin/admin/src/content-manager/components/FieldComponent/index.js b/packages/core/admin/admin/src/content-manager/components/FieldComponent/index.js index 6770ba91d4..bc531d3722 100644 --- a/packages/core/admin/admin/src/content-manager/components/FieldComponent/index.js +++ b/packages/core/admin/admin/src/content-manager/components/FieldComponent/index.js @@ -1,22 +1,23 @@ /* eslint-disable import/no-cycle */ import React, { memo, useMemo } from 'react'; -import PropTypes from 'prop-types'; -import size from 'lodash/size'; -import isEqual from 'lodash/isEqual'; -import { useIntl } from 'react-intl'; +import { Box, Flex, IconButton } from '@strapi/design-system'; import { NotAllowedInput } from '@strapi/helper-plugin'; import { Trash } from '@strapi/icons'; -import { Box, IconButton, Flex } from '@strapi/design-system'; +import isEqual from 'lodash/isEqual'; +import size from 'lodash/size'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; -import connect from './utils/connect'; -import select from './utils/select'; -import Label from './Label'; +import { useContentTypeLayout } from '../../hooks'; +import { getTrad } from '../../utils'; import ComponentInitializer from '../ComponentInitializer'; import NonRepeatableComponent from '../NonRepeatableComponent'; import RepeatableComponent from '../RepeatableComponent'; -import { useContentTypeLayout } from '../../hooks'; -import { getTrad } from '../../utils'; + +import Label from './Label'; +import connect from './utils/connect'; +import select from './utils/select'; const FieldComponent = ({ addNonRepeatableComponentToField, diff --git a/packages/core/admin/admin/src/content-manager/components/FieldComponent/utils/select.js b/packages/core/admin/admin/src/content-manager/components/FieldComponent/utils/select.js index 5c084dc4b4..3bc43c1c73 100644 --- a/packages/core/admin/admin/src/content-manager/components/FieldComponent/utils/select.js +++ b/packages/core/admin/admin/src/content-manager/components/FieldComponent/utils/select.js @@ -1,10 +1,11 @@ import { useMemo } from 'react'; + +import { useCMEditViewDataManager } from '@strapi/helper-plugin'; import get from 'lodash/get'; import take from 'lodash/take'; -import { useCMEditViewDataManager } from '@strapi/helper-plugin'; -import { getFieldName } from '../../../utils'; import { useContentTypeLayout } from '../../../hooks'; +import { getFieldName } from '../../../utils'; function useSelect({ isFromDynamicZone, name }) { const { diff --git a/packages/core/admin/admin/src/content-manager/components/FieldTypeIcon/index.js b/packages/core/admin/admin/src/content-manager/components/FieldTypeIcon/index.js index e26b86fc62..988d8dc044 100644 --- a/packages/core/admin/admin/src/content-manager/components/FieldTypeIcon/index.js +++ b/packages/core/admin/admin/src/content-manager/components/FieldTypeIcon/index.js @@ -1,21 +1,22 @@ import React from 'react'; -import PropTypes from 'prop-types'; + import { Box } from '@strapi/design-system'; import { useCustomFields } from '@strapi/helper-plugin'; import { - Date, Boolean, + Component, + Date, + DynamicZone, Email, Enumeration, + Json, Media, + Number, Relation, Text, Uid, - Number, - Json, - Component, - DynamicZone, } from '@strapi/icons'; +import PropTypes from 'prop-types'; const iconByTypes = { biginteger: , diff --git a/packages/core/admin/admin/src/content-manager/components/Hint/index.js b/packages/core/admin/admin/src/content-manager/components/Hint/index.js index 3831bb43f4..e216bb84b6 100644 --- a/packages/core/admin/admin/src/content-manager/components/Hint/index.js +++ b/packages/core/admin/admin/src/content-manager/components/Hint/index.js @@ -1,6 +1,7 @@ import React from 'react'; -import PropTypes from 'prop-types'; + import { Typography } from '@strapi/design-system'; +import PropTypes from 'prop-types'; export const Hint = ({ id, error, name, hint }) => { if (hint.length === 0 || error) { diff --git a/packages/core/admin/admin/src/content-manager/components/InjectionZoneList/index.js b/packages/core/admin/admin/src/content-manager/components/InjectionZoneList/index.js index daa5fb62ff..92b16595cc 100644 --- a/packages/core/admin/admin/src/content-manager/components/InjectionZoneList/index.js +++ b/packages/core/admin/admin/src/content-manager/components/InjectionZoneList/index.js @@ -1,6 +1,8 @@ import React from 'react'; -import PropTypes from 'prop-types'; + import { Box } from '@strapi/design-system'; +import PropTypes from 'prop-types'; + import { useInjectionZone } from '../../../shared/hooks'; const InjectionZoneList = ({ area, ...props }) => { diff --git a/packages/core/admin/admin/src/content-manager/components/InputUID/endActionStyle.js b/packages/core/admin/admin/src/content-manager/components/InputUID/endActionStyle.js index 88da2f7ff1..468a043a85 100644 --- a/packages/core/admin/admin/src/content-manager/components/InputUID/endActionStyle.js +++ b/packages/core/admin/admin/src/content-manager/components/InputUID/endActionStyle.js @@ -1,5 +1,5 @@ +import { FieldAction, Flex } from '@strapi/design-system'; import styled, { keyframes } from 'styled-components'; -import { Flex, FieldAction } from '@strapi/design-system'; export const FieldActionWrapper = styled(FieldAction)` svg { diff --git a/packages/core/admin/admin/src/content-manager/components/InputUID/index.js b/packages/core/admin/admin/src/content-manager/components/InputUID/index.js index 7b8d6401a4..63f36fc449 100644 --- a/packages/core/admin/admin/src/content-manager/components/InputUID/index.js +++ b/packages/core/admin/admin/src/content-manager/components/InputUID/index.js @@ -1,19 +1,21 @@ -import React, { useEffect, useState, useRef } from 'react'; -import PropTypes from 'prop-types'; +import React, { useEffect, useRef, useState } from 'react'; + +import { Flex, TextInput, Typography } from '@strapi/design-system'; import { + useAPIErrorHandler, useCMEditViewDataManager, useFetchClient, useNotification, - useAPIErrorHandler, } from '@strapi/helper-plugin'; +import { CheckCircle, ExclamationMarkCircle, Loader, Refresh } from '@strapi/icons'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { Flex, TextInput, Typography } from '@strapi/design-system'; -import { Refresh, CheckCircle, ExclamationMarkCircle, Loader } from '@strapi/icons'; -import { getRequestUrl } from '../../utils'; import useDebounce from '../../../hooks/useDebounce'; +import { getRequestUrl } from '../../utils'; + +import { FieldActionWrapper, LoadingWrapper, TextValidation } from './endActionStyle'; import UID_REGEX from './regex'; -import { FieldActionWrapper, TextValidation, LoadingWrapper } from './endActionStyle'; const InputUID = ({ attribute, diff --git a/packages/core/admin/admin/src/content-manager/components/InputUID/tests/index.test.js b/packages/core/admin/admin/src/content-manager/components/InputUID/tests/index.test.js index 77a5aa8109..5ec41224d3 100644 --- a/packages/core/admin/admin/src/content-manager/components/InputUID/tests/index.test.js +++ b/packages/core/admin/admin/src/content-manager/components/InputUID/tests/index.test.js @@ -1,10 +1,11 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { fireEvent, render, waitFor } from '@testing-library/react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import { IntlProvider } from 'react-intl'; import userEvent from '@testing-library/user-event'; import { rest } from 'msw'; import { setupServer } from 'msw/node'; +import { IntlProvider } from 'react-intl'; import InputUID from '../index'; diff --git a/packages/core/admin/admin/src/content-manager/components/Inputs/index.js b/packages/core/admin/admin/src/content-manager/components/Inputs/index.js index d52a6ce20a..90057cfc1b 100644 --- a/packages/core/admin/admin/src/content-manager/components/Inputs/index.js +++ b/packages/core/admin/admin/src/content-manager/components/Inputs/index.js @@ -1,16 +1,18 @@ import React, { memo, useMemo } from 'react'; -import PropTypes from 'prop-types'; -import { useIntl } from 'react-intl'; + +import { GenericInput, NotAllowedInput, useLibrary } from '@strapi/helper-plugin'; import get from 'lodash/get'; +import isEqual from 'lodash/isEqual'; import omit from 'lodash/omit'; import take from 'lodash/take'; -import isEqual from 'lodash/isEqual'; -import { GenericInput, NotAllowedInput, useLibrary } from '@strapi/helper-plugin'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; + import { useContentTypeLayout } from '../../hooks'; import { getFieldName } from '../../utils'; -import Wysiwyg from '../Wysiwyg'; import InputUID from '../InputUID'; import { RelationInputDataManager } from '../RelationInputDataManager'; +import Wysiwyg from '../Wysiwyg'; import { connect, generateOptions, getInputType, select, VALIDATIONS_TO_OMIT } from './utils'; diff --git a/packages/core/admin/admin/src/content-manager/components/Inputs/utils/select.js b/packages/core/admin/admin/src/content-manager/components/Inputs/utils/select.js index 017e6cfa10..dc2dd88a3d 100644 --- a/packages/core/admin/admin/src/content-manager/components/Inputs/utils/select.js +++ b/packages/core/admin/admin/src/content-manager/components/Inputs/utils/select.js @@ -1,6 +1,7 @@ import { useMemo } from 'react'; -import get from 'lodash/get'; + import { useCMEditViewDataManager } from '@strapi/helper-plugin'; +import get from 'lodash/get'; function useSelect(keys) { const { diff --git a/packages/core/admin/admin/src/content-manager/components/NonRepeatableComponent/index.js b/packages/core/admin/admin/src/content-manager/components/NonRepeatableComponent/index.js index 086da55f94..ea029fc64c 100644 --- a/packages/core/admin/admin/src/content-manager/components/NonRepeatableComponent/index.js +++ b/packages/core/admin/admin/src/content-manager/components/NonRepeatableComponent/index.js @@ -2,12 +2,14 @@ /* eslint-disable import/no-cycle */ import React, { useMemo } from 'react'; + +import { Box, Flex, Grid, GridItem } from '@strapi/design-system'; import PropTypes from 'prop-types'; -import { Box, Grid, GridItem, Flex } from '@strapi/design-system'; + import { useContentTypeLayout } from '../../hooks'; +import useLazyComponents from '../../hooks/useLazyComponents'; import FieldComponent from '../FieldComponent'; import Inputs from '../Inputs'; -import useLazyComponents from '../../hooks/useLazyComponents'; const NonRepeatableComponent = ({ componentUid, isFromDynamicZone, isNested, name }) => { const { getComponentLayout } = useContentTypeLayout(); diff --git a/packages/core/admin/admin/src/content-manager/components/PreviewWysiwyg/index.js b/packages/core/admin/admin/src/content-manager/components/PreviewWysiwyg/index.js index 42fc3845bb..94b04195ee 100644 --- a/packages/core/admin/admin/src/content-manager/components/PreviewWysiwyg/index.js +++ b/packages/core/admin/admin/src/content-manager/components/PreviewWysiwyg/index.js @@ -6,6 +6,7 @@ */ import React, { memo, useMemo } from 'react'; + import PropTypes from 'prop-types'; import md from './utils/mdRenderer'; diff --git a/packages/core/admin/admin/src/content-manager/components/PreviewWysiwyg/utils/mdRenderer.js b/packages/core/admin/admin/src/content-manager/components/PreviewWysiwyg/utils/mdRenderer.js index b8c2cf212b..d7770fa766 100644 --- a/packages/core/admin/admin/src/content-manager/components/PreviewWysiwyg/utils/mdRenderer.js +++ b/packages/core/admin/admin/src/content-manager/components/PreviewWysiwyg/utils/mdRenderer.js @@ -1,6 +1,6 @@ /* eslint-disable prefer-template */ +import { getLanguage, highlight, highlightAuto } from 'highlight.js'; import Markdown from 'markdown-it'; -import { getLanguage, highlightAuto, highlight } from 'highlight.js'; import abbr from 'markdown-it-abbr'; import container from 'markdown-it-container'; import deflist from 'markdown-it-deflist'; diff --git a/packages/core/admin/admin/src/content-manager/components/RelationInput/RelationInput.js b/packages/core/admin/admin/src/content-manager/components/RelationInput/RelationInput.js index 2dea8bb112..712cd4ed46 100644 --- a/packages/core/admin/admin/src/content-manager/components/RelationInput/RelationInput.js +++ b/packages/core/admin/admin/src/content-manager/components/RelationInput/RelationInput.js @@ -1,37 +1,37 @@ -import React, { useRef, useState, useMemo, useEffect } from 'react'; -import PropTypes from 'prop-types'; -import styled from 'styled-components'; -import { FixedSizeList as List } from 'react-window'; +import React, { useEffect, useMemo, useRef, useState } from 'react'; + +import { + Box, + Field, + FieldError, + FieldHint, + FieldLabel, + Icon, + Link, + Status, + TextButton, + Tooltip, + Typography, + VisuallyHidden, +} from '@strapi/design-system'; /** * TODO: this will come in another PR. */ // eslint-disable-next-line no-restricted-imports import { ReactSelect } from '@strapi/helper-plugin'; -import { - Status, - Box, - Link, - Icon, - FieldLabel, - FieldError, - FieldHint, - Field, - TextButton, - Typography, - Tooltip, - VisuallyHidden, -} from '@strapi/design-system'; - import { Cross, Refresh } from '@strapi/icons'; +import PropTypes from 'prop-types'; +import { FixedSizeList as List } from 'react-window'; +import styled from 'styled-components'; +import { usePrev } from '../../hooks'; + +import { Option } from './components/Option'; import { Relation } from './components/Relation'; import { RelationItem } from './components/RelationItem'; import { RelationList } from './components/RelationList'; -import { Option } from './components/Option'; import { RELATION_GUTTER, RELATION_ITEM_HEIGHT } from './constants'; -import { usePrev } from '../../hooks'; - export const LinkEllipsis = styled(Link)` display: block; diff --git a/packages/core/admin/admin/src/content-manager/components/RelationInput/components/Option.js b/packages/core/admin/admin/src/content-manager/components/RelationInput/components/Option.js index 9b3ef0cfc6..9f4f88c0e7 100644 --- a/packages/core/admin/admin/src/content-manager/components/RelationInput/components/Option.js +++ b/packages/core/admin/admin/src/content-manager/components/RelationInput/components/Option.js @@ -1,11 +1,11 @@ import React from 'react'; -import styled from 'styled-components'; -import { components } from 'react-select'; -import { useIntl } from 'react-intl'; -import PropTypes from 'prop-types'; -import { pxToRem } from '@strapi/helper-plugin'; import { Flex, Typography } from '@strapi/design-system'; +import { pxToRem } from '@strapi/helper-plugin'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import { components } from 'react-select'; +import styled from 'styled-components'; import { getTrad } from '../../../utils'; diff --git a/packages/core/admin/admin/src/content-manager/components/RelationInput/components/Relation.js b/packages/core/admin/admin/src/content-manager/components/RelationInput/components/Relation.js index 71dd4b3f1f..606e90742d 100644 --- a/packages/core/admin/admin/src/content-manager/components/RelationInput/components/Relation.js +++ b/packages/core/admin/admin/src/content-manager/components/RelationInput/components/Relation.js @@ -1,7 +1,7 @@ -import PropTypes from 'prop-types'; import React from 'react'; import { Flex } from '@strapi/design-system'; +import PropTypes from 'prop-types'; export const Relation = ({ children, diff --git a/packages/core/admin/admin/src/content-manager/components/RelationInput/components/RelationItem.js b/packages/core/admin/admin/src/content-manager/components/RelationInput/components/RelationItem.js index e557339511..16a30d517f 100644 --- a/packages/core/admin/admin/src/content-manager/components/RelationInput/components/RelationItem.js +++ b/packages/core/admin/admin/src/content-manager/components/RelationInput/components/RelationItem.js @@ -1,15 +1,13 @@ import React, { useEffect } from 'react'; -import PropTypes from 'prop-types'; -import styled from 'styled-components'; -import { getEmptyImage } from 'react-dnd-html5-backend'; import { Box, Flex, IconButton } from '@strapi/design-system'; import { Drag } from '@strapi/icons'; +import PropTypes from 'prop-types'; +import { getEmptyImage } from 'react-dnd-html5-backend'; +import styled from 'styled-components'; import { useDragAndDrop } from '../../../hooks/useDragAndDrop'; - import { composeRefs, ItemTypes } from '../../../utils'; - import { RELATION_GUTTER } from '../constants'; export const FlexWrapper = styled(Flex)` diff --git a/packages/core/admin/admin/src/content-manager/components/RelationInput/components/RelationList.js b/packages/core/admin/admin/src/content-manager/components/RelationInput/components/RelationList.js index 32e3218efd..1aee2f977d 100644 --- a/packages/core/admin/admin/src/content-manager/components/RelationInput/components/RelationList.js +++ b/packages/core/admin/admin/src/content-manager/components/RelationInput/components/RelationList.js @@ -1,7 +1,8 @@ import React from 'react'; + +import { Box } from '@strapi/design-system'; import PropTypes from 'prop-types'; import styled from 'styled-components'; -import { Box } from '@strapi/design-system'; const ShadowBox = styled(Box)` position: relative; diff --git a/packages/core/admin/admin/src/content-manager/components/RelationInput/components/tests/Option.test.js b/packages/core/admin/admin/src/content-manager/components/RelationInput/components/tests/Option.test.js index 55cf7bbf0c..df1a401b19 100644 --- a/packages/core/admin/admin/src/content-manager/components/RelationInput/components/tests/Option.test.js +++ b/packages/core/admin/admin/src/content-manager/components/RelationInput/components/tests/Option.test.js @@ -1,13 +1,13 @@ import React from 'react'; -import { render, screen, fireEvent, act } from '@testing-library/react'; -import { IntlProvider } from 'react-intl'; +import { lightTheme, ThemeProvider } from '@strapi/design-system'; /** * TODO: this will come in another PR. */ // eslint-disable-next-line no-restricted-imports import { ReactSelect } from '@strapi/helper-plugin'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; +import { act, fireEvent, render, screen } from '@testing-library/react'; +import { IntlProvider } from 'react-intl'; import { Option } from '../Option'; diff --git a/packages/core/admin/admin/src/content-manager/components/RelationInput/components/tests/RelationItem.test.js b/packages/core/admin/admin/src/content-manager/components/RelationInput/components/tests/RelationItem.test.js index 3616ab8dd6..44bd936aaa 100644 --- a/packages/core/admin/admin/src/content-manager/components/RelationInput/components/tests/RelationItem.test.js +++ b/packages/core/admin/admin/src/content-manager/components/RelationInput/components/tests/RelationItem.test.js @@ -1,6 +1,7 @@ import React from 'react'; -import { render, screen, fireEvent } from '@testing-library/react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { fireEvent, render, screen } from '@testing-library/react'; import { DndProvider } from 'react-dnd'; import { HTML5Backend } from 'react-dnd-html5-backend'; diff --git a/packages/core/admin/admin/src/content-manager/components/RelationInput/components/tests/RelationList.test.js b/packages/core/admin/admin/src/content-manager/components/RelationInput/components/tests/RelationList.test.js index 1b935bf413..13f4526fd1 100644 --- a/packages/core/admin/admin/src/content-manager/components/RelationInput/components/tests/RelationList.test.js +++ b/packages/core/admin/admin/src/content-manager/components/RelationInput/components/tests/RelationList.test.js @@ -1,6 +1,7 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render } from '@testing-library/react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; import { DndProvider } from 'react-dnd'; import { HTML5Backend } from 'react-dnd-html5-backend'; diff --git a/packages/core/admin/admin/src/content-manager/components/RelationInput/tests/RelationInput.test.js b/packages/core/admin/admin/src/content-manager/components/RelationInput/tests/RelationInput.test.js index 20a79f7d56..5d4c253eb7 100644 --- a/packages/core/admin/admin/src/content-manager/components/RelationInput/tests/RelationInput.test.js +++ b/packages/core/admin/admin/src/content-manager/components/RelationInput/tests/RelationInput.test.js @@ -1,10 +1,11 @@ import React from 'react'; -import { IntlProvider } from 'react-intl'; -import { MemoryRouter } from 'react-router-dom'; -import { render, screen, fireEvent, waitFor } from '@testing-library/react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { fireEvent, render, screen, waitFor } from '@testing-library/react'; import { DndProvider } from 'react-dnd'; import { HTML5Backend } from 'react-dnd-html5-backend'; +import { IntlProvider } from 'react-intl'; +import { MemoryRouter } from 'react-router-dom'; import { RelationInput } from '../index'; diff --git a/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/RelationInputDataManager.js b/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/RelationInputDataManager.js index ad795e03df..7d7fab9040 100644 --- a/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/RelationInputDataManager.js +++ b/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/RelationInputDataManager.js @@ -1,21 +1,19 @@ /* eslint-disable no-nested-ternary */ -import PropTypes from 'prop-types'; import React, { memo, useMemo, useState } from 'react'; -import { useIntl } from 'react-intl'; + +import { NotAllowedInput, useCMEditViewDataManager } from '@strapi/helper-plugin'; import get from 'lodash/get'; import pick from 'lodash/pick'; - -import { useCMEditViewDataManager, NotAllowedInput } from '@strapi/helper-plugin'; - -import { RelationInput } from '../RelationInput'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; import { useRelation } from '../../hooks/useRelation'; - import { getTrad } from '../../utils'; +import { getInitialDataPathUsingTempKeys } from '../../utils/paths'; +import { RelationInput } from '../RelationInput'; import { PUBLICATION_STATES, RELATIONS_TO_DISPLAY, SEARCH_RESULTS_TO_DISPLAY } from './constants'; -import { connect, select, normalizeSearchResults, diffRelations, normalizeRelation } from './utils'; -import { getInitialDataPathUsingTempKeys } from '../../utils/paths'; +import { connect, diffRelations, normalizeRelation, normalizeSearchResults, select } from './utils'; export const RelationInputDataManager = ({ error, diff --git a/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/tests/RelationInputDataManger.test.js b/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/tests/RelationInputDataManger.test.js index d1180baec0..da8db36c1a 100644 --- a/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/tests/RelationInputDataManger.test.js +++ b/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/tests/RelationInputDataManger.test.js @@ -1,16 +1,16 @@ import React from 'react'; -import { IntlProvider } from 'react-intl'; -import { fireEvent, render, act, screen } from '@testing-library/react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import { QueryClientProvider, QueryClient } from 'react-query'; -import { MemoryRouter } from 'react-router-dom'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { useCMEditViewDataManager } from '@strapi/helper-plugin'; +import { act, fireEvent, render, screen } from '@testing-library/react'; import { DndProvider } from 'react-dnd'; import { HTML5Backend } from 'react-dnd-html5-backend'; - -import { useCMEditViewDataManager } from '@strapi/helper-plugin'; -import { useRelation } from '../../../hooks/useRelation'; +import { IntlProvider } from 'react-intl'; +import { QueryClient, QueryClientProvider } from 'react-query'; +import { MemoryRouter } from 'react-router-dom'; import { RelationInputDataManager } from '..'; +import { useRelation } from '../../../hooks/useRelation'; const queryClient = new QueryClient({ defaultOptions: { diff --git a/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/index.js b/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/index.js index 682a3045da..614c90551a 100644 --- a/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/index.js +++ b/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/index.js @@ -1,5 +1,5 @@ export { default as connect } from './connect'; -export { default as select } from './select'; -export { normalizeRelations, normalizeRelation } from './normalizeRelations'; -export { normalizeSearchResults } from './normalizeSearchResults'; export { diffRelations } from './diffRelations'; +export { normalizeRelation, normalizeRelations } from './normalizeRelations'; +export { normalizeSearchResults } from './normalizeSearchResults'; +export { default as select } from './select'; diff --git a/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/normalizeRelations.js b/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/normalizeRelations.js index 664790f9bc..74dfbde17c 100644 --- a/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/normalizeRelations.js +++ b/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/normalizeRelations.js @@ -1,7 +1,7 @@ -import { getRelationLink } from './getRelationLink'; - import { PUBLICATION_STATES } from '../constants'; +import { getRelationLink } from './getRelationLink'; + export const normalizeRelation = (relation, { shouldAddLink, mainFieldName, targetModel }) => { const nextRelation = { ...relation }; diff --git a/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/select.js b/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/select.js index aebfc85bc6..92315db9b2 100644 --- a/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/select.js +++ b/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/select.js @@ -1,6 +1,7 @@ import { useMemo } from 'react'; -import get from 'lodash/get'; + import { useCMEditViewDataManager } from '@strapi/helper-plugin'; +import get from 'lodash/get'; import { getRequestUrl } from '../../../utils'; diff --git a/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/tests/select.test.js b/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/tests/select.test.js index 00f8c6a9b9..85ac326c54 100644 --- a/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/tests/select.test.js +++ b/packages/core/admin/admin/src/content-manager/components/RelationInputDataManager/utils/tests/select.test.js @@ -1,5 +1,5 @@ import { useCMEditViewDataManager } from '@strapi/helper-plugin'; -import { renderHook, act } from '@testing-library/react'; +import { act, renderHook } from '@testing-library/react'; import useSelect from '../select'; diff --git a/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/components/Accordion.js b/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/components/Accordion.js index 0418aa8baa..c734f89b3d 100644 --- a/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/components/Accordion.js +++ b/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/components/Accordion.js @@ -1,8 +1,9 @@ import React from 'react'; + +import { Box, KeyboardNavigable, Typography } from '@strapi/design-system'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; import styled from 'styled-components'; -import { Box, Typography, KeyboardNavigable } from '@strapi/design-system'; export const Footer = styled(Box)` overflow: hidden; diff --git a/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/components/Component.js b/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/components/Component.js index 249db3fcad..7b95a01fe3 100644 --- a/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/components/Component.js +++ b/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/components/Component.js @@ -1,34 +1,32 @@ /* eslint-disable import/no-cycle */ import React, { memo, useEffect, useRef } from 'react'; -import PropTypes from 'prop-types'; -import { getEmptyImage } from 'react-dnd-html5-backend'; -import styled from 'styled-components'; -import { useIntl } from 'react-intl'; -import toString from 'lodash/toString'; -import get from 'lodash/get'; -import { useCMEditViewDataManager } from '@strapi/helper-plugin'; import { Accordion, - AccordionToggle, AccordionContent, + AccordionToggle, + Box, + Flex, Grid, GridItem, - Flex, - Box, IconButton, } from '@strapi/design-system'; -import { Trash, Drag } from '@strapi/icons'; +import { useCMEditViewDataManager } from '@strapi/helper-plugin'; +import { Drag, Trash } from '@strapi/icons'; +import get from 'lodash/get'; +import toString from 'lodash/toString'; +import PropTypes from 'prop-types'; +import { getEmptyImage } from 'react-dnd-html5-backend'; +import { useIntl } from 'react-intl'; +import styled from 'styled-components'; import { useDragAndDrop } from '../../../hooks/useDragAndDrop'; - +import useLazyComponents from '../../../hooks/useLazyComponents'; import { composeRefs, getTrad, ItemTypes } from '../../../utils'; - -import Inputs from '../../Inputs'; import FieldComponent from '../../FieldComponent'; +import Inputs from '../../Inputs'; import Preview from './Preview'; -import useLazyComponents from '../../../hooks/useLazyComponents'; const CustomIconButton = styled(IconButton)` background-color: transparent; diff --git a/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/components/Preview.js b/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/components/Preview.js index 08055e08b6..209690f6c6 100644 --- a/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/components/Preview.js +++ b/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/components/Preview.js @@ -1,4 +1,5 @@ import React from 'react'; + import styled from 'styled-components'; const StyledSpan = styled.span` diff --git a/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/components/tests/Accordion.test.js b/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/components/tests/Accordion.test.js index 1eae41339b..f08fcf75a0 100644 --- a/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/components/tests/Accordion.test.js +++ b/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/components/tests/Accordion.test.js @@ -1,7 +1,8 @@ import * as React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; import { IntlProvider } from 'react-intl'; import * as Accordion from '../Accordion'; diff --git a/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/components/tests/Component.test.js b/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/components/tests/Component.test.js index b1e75b41a4..bf6c3ead7c 100644 --- a/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/components/tests/Component.test.js +++ b/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/components/tests/Component.test.js @@ -1,9 +1,10 @@ import * as React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { fireEvent, render, screen } from '@testing-library/react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import { IntlProvider } from 'react-intl'; import { DndProvider } from 'react-dnd'; import { HTML5Backend } from 'react-dnd-html5-backend'; +import { IntlProvider } from 'react-intl'; import Component from '../Component'; diff --git a/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/components/tests/Preview.test.js b/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/components/tests/Preview.test.js index 1cc0e6f3f7..65627ec50d 100644 --- a/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/components/tests/Preview.test.js +++ b/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/components/tests/Preview.test.js @@ -1,6 +1,7 @@ import * as React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render } from '@testing-library/react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; import Preview from '../Preview'; diff --git a/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/index.js b/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/index.js index ffa517c932..fbb6992239 100644 --- a/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/index.js +++ b/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/index.js @@ -1,21 +1,20 @@ /* eslint-disable import/no-cycle */ import React, { memo, useMemo, useState } from 'react'; + +import { Box, Flex, TextButton, VisuallyHidden } from '@strapi/design-system'; +import { useCMEditViewDataManager, useNotification } from '@strapi/helper-plugin'; +import { Plus } from '@strapi/icons'; +import get from 'lodash/get'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; import styled from 'styled-components'; -import PropTypes from 'prop-types'; -import get from 'lodash/get'; -import { useNotification, useCMEditViewDataManager } from '@strapi/helper-plugin'; -import { Box, Flex, TextButton, VisuallyHidden } from '@strapi/design-system'; -import { Plus } from '@strapi/icons'; - -import { getMaxTempKey, getTrad } from '../../utils'; import { useContentTypeLayout } from '../../hooks'; - +import { getMaxTempKey, getTrad } from '../../utils'; import ComponentInitializer from '../ComponentInitializer'; -import Component from './components/Component'; -import * as Accordion from './components/Accordion'; +import * as Accordion from './components/Accordion'; +import Component from './components/Component'; import getComponentErrorKeys from './utils/getComponentErrorKeys'; const TextButtonCustom = styled(TextButton)` diff --git a/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/tests/index.test.js b/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/tests/index.test.js index ba6b2b3e5d..2fa921c1a7 100644 --- a/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/tests/index.test.js +++ b/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/tests/index.test.js @@ -1,17 +1,17 @@ import * as React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { useCMEditViewDataManager, useNotification } from '@strapi/helper-plugin'; import { fireEvent, render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { IntlProvider } from 'react-intl'; import { DndProvider } from 'react-dnd'; import { HTML5Backend } from 'react-dnd-html5-backend'; - -import { useCMEditViewDataManager, useNotification } from '@strapi/helper-plugin'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; - -import { layoutData } from './fixtures'; +import { IntlProvider } from 'react-intl'; import RepeatableComponent from '../index'; +import { layoutData } from './fixtures'; + jest.mock('../../FieldComponent', () => () => "I'm a field component"); jest.mock('../../Inputs', () => () => "I'm inputs"); diff --git a/packages/core/admin/admin/src/content-manager/components/SingleTypeFormWrapper/index.js b/packages/core/admin/admin/src/content-manager/components/SingleTypeFormWrapper/index.js index bb8976c5b5..b8b14baf58 100644 --- a/packages/core/admin/admin/src/content-manager/components/SingleTypeFormWrapper/index.js +++ b/packages/core/admin/admin/src/content-manager/components/SingleTypeFormWrapper/index.js @@ -1,20 +1,22 @@ import { memo, useCallback, useEffect, useRef, useState } from 'react'; -import { useHistory } from 'react-router-dom'; -import { useQueryClient } from 'react-query'; -import get from 'lodash/get'; + import { - useTracking, formatContentTypeData, - useQueryParams, - useNotification, - useGuidedTour, useAPIErrorHandler, useFetchClient, + useGuidedTour, + useNotification, + useQueryParams, + useTracking, } from '@strapi/helper-plugin'; -import { useSelector, useDispatch } from 'react-redux'; -import PropTypes from 'prop-types'; import axios from 'axios'; -import { createDefaultForm, getTrad, removePasswordFieldsFromData } from '../../utils'; +import get from 'lodash/get'; +import PropTypes from 'prop-types'; +import { useQueryClient } from 'react-query'; +import { useDispatch, useSelector } from 'react-redux'; +import { useHistory } from 'react-router-dom'; + +import buildQueryString from '../../pages/ListView/utils/buildQueryString'; import { getData, getDataSucceeded, @@ -25,8 +27,9 @@ import { submitSucceeded, } from '../../sharedReducers/crudReducer/actions'; import selectCrudReducer from '../../sharedReducers/crudReducer/selectors'; +import { createDefaultForm, getTrad, removePasswordFieldsFromData } from '../../utils'; + import { getRequestUrl } from './utils'; -import buildQueryString from '../../pages/ListView/utils/buildQueryString'; // This container is used to handle the CRUD const SingleTypeFormWrapper = ({ allLayoutData, children, slug }) => { diff --git a/packages/core/admin/admin/src/content-manager/components/Wysiwyg/Editor.js b/packages/core/admin/admin/src/content-manager/components/Wysiwyg/Editor.js index a3213da5d2..a470857dea 100644 --- a/packages/core/admin/admin/src/content-manager/components/Wysiwyg/Editor.js +++ b/packages/core/admin/admin/src/content-manager/components/Wysiwyg/Editor.js @@ -1,11 +1,15 @@ import React, { useEffect, useRef } from 'react'; -import PropTypes from 'prop-types'; + import CodeMirror from 'codemirror5'; -import 'codemirror5/addon/display/placeholder'; +import PropTypes from 'prop-types'; + import PreviewWysiwyg from '../PreviewWysiwyg'; + import { EditorStylesContainer } from './EditorStylesContainer'; -import { EditorAndPreviewWrapper } from './WysiwygStyles'; import newlineAndIndentContinueMarkdownList from './utils/continueList'; +import { EditorAndPreviewWrapper } from './WysiwygStyles'; + +import 'codemirror5/addon/display/placeholder'; const Editor = ({ disabled, diff --git a/packages/core/admin/admin/src/content-manager/components/Wysiwyg/EditorLayout.js b/packages/core/admin/admin/src/content-manager/components/Wysiwyg/EditorLayout.js index 3d15eca963..787f96b1f2 100644 --- a/packages/core/admin/admin/src/content-manager/components/Wysiwyg/EditorLayout.js +++ b/packages/core/admin/admin/src/content-manager/components/Wysiwyg/EditorLayout.js @@ -1,10 +1,11 @@ import React from 'react'; -import { useIntl } from 'react-intl'; -import PropTypes from 'prop-types'; -import styled from 'styled-components'; + import { BaseButton, Box, Flex, FocusTrap, Portal, Typography } from '@strapi/design-system'; -import { Collapse } from '@strapi/icons'; import { pxToRem, useLockScroll } from '@strapi/helper-plugin'; +import { Collapse } from '@strapi/icons'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import styled from 'styled-components'; import PreviewWysiwyg from '../PreviewWysiwyg'; diff --git a/packages/core/admin/admin/src/content-manager/components/Wysiwyg/WysiwygFooter.js b/packages/core/admin/admin/src/content-manager/components/Wysiwyg/WysiwygFooter.js index 8d3ea1c01f..b85d39db35 100644 --- a/packages/core/admin/admin/src/content-manager/components/Wysiwyg/WysiwygFooter.js +++ b/packages/core/admin/admin/src/content-manager/components/Wysiwyg/WysiwygFooter.js @@ -1,8 +1,10 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import { useIntl } from 'react-intl'; + import { Box, Flex, Typography } from '@strapi/design-system'; import { Expand } from '@strapi/icons'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; + import { ExpandButton } from './WysiwygStyles'; const WysiwygFooter = ({ onToggleExpand }) => { diff --git a/packages/core/admin/admin/src/content-manager/components/Wysiwyg/WysiwygNav.js b/packages/core/admin/admin/src/content-manager/components/Wysiwyg/WysiwygNav.js index 6f431af831..b9a989cf0c 100644 --- a/packages/core/admin/admin/src/content-manager/components/Wysiwyg/WysiwygNav.js +++ b/packages/core/admin/admin/src/content-manager/components/Wysiwyg/WysiwygNav.js @@ -1,28 +1,29 @@ import React, { useRef, useState } from 'react'; -import PropTypes from 'prop-types'; -import styled from 'styled-components'; -import { useIntl } from 'react-intl'; -import { Button, IconButtonGroup, Option, Select, Popover, Flex } from '@strapi/design-system'; + +import { Button, Flex, IconButtonGroup, Option, Popover, Select } from '@strapi/design-system'; import { Bold, - Italic, - Underline, - StrikeThrough, BulletList, - NumberList, Code, - Picture as Image, + Italic, Link, - Quote, More, + NumberList, + Picture as Image, + Quote, + StrikeThrough, + Underline, } from '@strapi/icons'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import styled from 'styled-components'; import { - MainButtons, CustomIconButton, - MoreButton, - IconButtonGroupMargin, CustomLinkIconButton, + IconButtonGroupMargin, + MainButtons, + MoreButton, } from './WysiwygStyles'; /** diff --git a/packages/core/admin/admin/src/content-manager/components/Wysiwyg/WysiwygStyles.js b/packages/core/admin/admin/src/content-manager/components/Wysiwyg/WysiwygStyles.js index f7e735ad6f..987996cd78 100644 --- a/packages/core/admin/admin/src/content-manager/components/Wysiwyg/WysiwygStyles.js +++ b/packages/core/admin/admin/src/content-manager/components/Wysiwyg/WysiwygStyles.js @@ -1,5 +1,5 @@ +import { BaseButton, IconButton, IconButtonGroup } from '@strapi/design-system'; import styled from 'styled-components'; -import { IconButtonGroup, IconButton, BaseButton } from '@strapi/design-system'; // NAV BUTTONS export const CustomIconButton = styled(IconButton)` diff --git a/packages/core/admin/admin/src/content-manager/components/Wysiwyg/index.js b/packages/core/admin/admin/src/content-manager/components/Wysiwyg/index.js index 0cf3c8fe02..6a5d082887 100644 --- a/packages/core/admin/admin/src/content-manager/components/Wysiwyg/index.js +++ b/packages/core/admin/admin/src/content-manager/components/Wysiwyg/index.js @@ -1,22 +1,24 @@ import React, { useRef, useState } from 'react'; -import PropTypes from 'prop-types'; -import styled from 'styled-components'; -import { useIntl } from 'react-intl'; -import { Typography, Box, Flex } from '@strapi/design-system'; + +import { Box, Flex, Typography } from '@strapi/design-system'; import { prefixFileUrlWithBackendUrl, useLibrary } from '@strapi/helper-plugin'; -import Editor from './Editor'; -import WysiwygNav from './WysiwygNav'; -import WysiwygFooter from './WysiwygFooter'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import styled from 'styled-components'; + import Hint from '../Hint'; -import { - markdownHandler, - listHandler, - titleHandler, - insertFile, - quoteAndCodeHandler, -} from './utils/utils'; +import Editor from './Editor'; import { EditorLayout } from './EditorLayout'; +import { + insertFile, + listHandler, + markdownHandler, + quoteAndCodeHandler, + titleHandler, +} from './utils/utils'; +import WysiwygFooter from './WysiwygFooter'; +import WysiwygNav from './WysiwygNav'; const LabelAction = styled(Box)` svg path { diff --git a/packages/core/admin/admin/src/content-manager/components/Wysiwyg/tests/index.test.js b/packages/core/admin/admin/src/content-manager/components/Wysiwyg/tests/index.test.js index 62166ac669..c6c4b68012 100644 --- a/packages/core/admin/admin/src/content-manager/components/Wysiwyg/tests/index.test.js +++ b/packages/core/admin/admin/src/content-manager/components/Wysiwyg/tests/index.test.js @@ -1,8 +1,10 @@ import * as React from 'react'; -import { IntlProvider } from 'react-intl'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render as renderRTL } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; +import { IntlProvider } from 'react-intl'; + import Wysiwyg from '../index'; jest.mock('@strapi/helper-plugin', () => ({ diff --git a/packages/core/admin/admin/src/content-manager/hooks/index.js b/packages/core/admin/admin/src/content-manager/hooks/index.js index ff6e0bf5e9..e2662d6f5e 100644 --- a/packages/core/admin/admin/src/content-manager/hooks/index.js +++ b/packages/core/admin/admin/src/content-manager/hooks/index.js @@ -1,9 +1,9 @@ export { default as useContentTypeLayout } from './useContentTypeLayout'; +export { useDragAndDrop } from './useDragAndDrop'; export { default as useFetchContentTypeLayout } from './useFetchContentTypeLayout'; export { default as useFindRedirectionLink } from './useFindRedirectionLink'; +export { useKeyboardDragAndDrop } from './useKeyboardDragAndDrop'; export { default as usePluginsQueryParams } from './usePluginsQueryParams'; +export { usePrev } from './usePrev'; export { default as useSyncRbac } from './useSyncRbac'; export { default as useWysiwyg } from './useWysiwyg'; -export { usePrev } from './usePrev'; -export { useDragAndDrop } from './useDragAndDrop'; -export { useKeyboardDragAndDrop } from './useKeyboardDragAndDrop'; diff --git a/packages/core/admin/admin/src/content-manager/hooks/useContentTypeLayout/index.js b/packages/core/admin/admin/src/content-manager/hooks/useContentTypeLayout/index.js index fa5661af45..baf67be30a 100644 --- a/packages/core/admin/admin/src/content-manager/hooks/useContentTypeLayout/index.js +++ b/packages/core/admin/admin/src/content-manager/hooks/useContentTypeLayout/index.js @@ -1,5 +1,7 @@ import { useCallback } from 'react'; + import { useSelector } from 'react-redux'; + import selectLayout from '../../pages/EditViewLayoutManager/selectors'; const useContentTypeLayout = () => { diff --git a/packages/core/admin/admin/src/content-manager/hooks/useDragAndDrop.js b/packages/core/admin/admin/src/content-manager/hooks/useDragAndDrop.js index 2371810036..6ea46e4891 100644 --- a/packages/core/admin/admin/src/content-manager/hooks/useDragAndDrop.js +++ b/packages/core/admin/admin/src/content-manager/hooks/useDragAndDrop.js @@ -1,4 +1,5 @@ import { useRef } from 'react'; + import { useDrag, useDrop } from 'react-dnd'; import { useKeyboardDragAndDrop } from './useKeyboardDragAndDrop'; diff --git a/packages/core/admin/admin/src/content-manager/hooks/useFetchContentTypeLayout/index.js b/packages/core/admin/admin/src/content-manager/hooks/useFetchContentTypeLayout/index.js index 0d34d5dec9..23ed5dbb31 100644 --- a/packages/core/admin/admin/src/content-manager/hooks/useFetchContentTypeLayout/index.js +++ b/packages/core/admin/admin/src/content-manager/hooks/useFetchContentTypeLayout/index.js @@ -1,11 +1,14 @@ import { useCallback, useEffect, useMemo, useReducer, useRef } from 'react'; -import { useSelector, shallowEqual } from 'react-redux'; -import axios from 'axios'; + import { useFetchClient } from '@strapi/helper-plugin'; -import formatLayouts from './utils/formatLayouts'; -import reducer, { initialState } from './reducer'; +import axios from 'axios'; +import { shallowEqual, useSelector } from 'react-redux'; + import { makeSelectModelAndComponentSchemas } from '../../pages/App/selectors'; +import reducer, { initialState } from './reducer'; +import formatLayouts from './utils/formatLayouts'; + const useFetchContentTypeLayout = (contentTypeUID) => { const [{ error, isLoading, layout, layouts }, dispatch] = useReducer(reducer, initialState); const schemasSelector = useMemo(makeSelectModelAndComponentSchemas, []); diff --git a/packages/core/admin/admin/src/content-manager/hooks/useFetchContentTypeLayout/tests/reducer.test.js b/packages/core/admin/admin/src/content-manager/hooks/useFetchContentTypeLayout/tests/reducer.test.js index ce10c20009..07f3780495 100644 --- a/packages/core/admin/admin/src/content-manager/hooks/useFetchContentTypeLayout/tests/reducer.test.js +++ b/packages/core/admin/admin/src/content-manager/hooks/useFetchContentTypeLayout/tests/reducer.test.js @@ -1,4 +1,5 @@ import produce from 'immer'; + import reducer from '../reducer'; describe('CONTENT MANAGER | hooks | useFetchContentTypeLayout | reducer', () => { diff --git a/packages/core/admin/admin/src/content-manager/hooks/useFetchContentTypeLayout/utils/formatLayouts.js b/packages/core/admin/admin/src/content-manager/hooks/useFetchContentTypeLayout/utils/formatLayouts.js index 1bbaf4e7ce..c173db6fe4 100644 --- a/packages/core/admin/admin/src/content-manager/hooks/useFetchContentTypeLayout/utils/formatLayouts.js +++ b/packages/core/admin/admin/src/content-manager/hooks/useFetchContentTypeLayout/utils/formatLayouts.js @@ -162,6 +162,6 @@ export default formatLayouts; export { formatLayoutWithMetas, formatListLayoutWithMetas, - shouldDisplayRelationLink, getDisplayedModels, + shouldDisplayRelationLink, }; diff --git a/packages/core/admin/admin/src/content-manager/hooks/useFetchContentTypeLayout/utils/tests/formatLayouts.test.js b/packages/core/admin/admin/src/content-manager/hooks/useFetchContentTypeLayout/utils/tests/formatLayouts.test.js index 41874ad139..3a1f2c770c 100644 --- a/packages/core/admin/admin/src/content-manager/hooks/useFetchContentTypeLayout/utils/tests/formatLayouts.test.js +++ b/packages/core/admin/admin/src/content-manager/hooks/useFetchContentTypeLayout/utils/tests/formatLayouts.test.js @@ -1,8 +1,8 @@ import formatLayouts, { formatLayoutWithMetas, formatListLayoutWithMetas, - shouldDisplayRelationLink, getDisplayedModels, + shouldDisplayRelationLink, } from '../formatLayouts'; describe('Content Manager | hooks | useFetchContentTypeLayout | utils ', () => { diff --git a/packages/core/admin/admin/src/content-manager/hooks/useFindRedirectionLink/index.js b/packages/core/admin/admin/src/content-manager/hooks/useFindRedirectionLink/index.js index 124fa0a7a1..fdfa17d2e0 100644 --- a/packages/core/admin/admin/src/content-manager/hooks/useFindRedirectionLink/index.js +++ b/packages/core/admin/admin/src/content-manager/hooks/useFindRedirectionLink/index.js @@ -1,5 +1,6 @@ -import { useSelector } from 'react-redux'; import { useQueryParams } from '@strapi/helper-plugin'; +import { useSelector } from 'react-redux'; + import selectMenuLinks from './selectors'; import getRedirectionLink from './utils/getRedirectionLink'; diff --git a/packages/core/admin/admin/src/content-manager/hooks/useFindRedirectionLink/tests/selectors.test.js b/packages/core/admin/admin/src/content-manager/hooks/useFindRedirectionLink/tests/selectors.test.js index 9d455fc07d..7e30a13cd8 100644 --- a/packages/core/admin/admin/src/content-manager/hooks/useFindRedirectionLink/tests/selectors.test.js +++ b/packages/core/admin/admin/src/content-manager/hooks/useFindRedirectionLink/tests/selectors.test.js @@ -1,4 +1,5 @@ import { fixtures } from '@strapi/admin-test-utils'; + import selectMenuLinks from '../selectors'; describe('CONTENT MANAGER | Containers | CollectionTypeFormWrapper | selectors', () => { diff --git a/packages/core/admin/admin/src/content-manager/hooks/useFindRedirectionLink/utils/getRedirectionLink.js b/packages/core/admin/admin/src/content-manager/hooks/useFindRedirectionLink/utils/getRedirectionLink.js index 869d8f0db0..0d1f5caf3d 100644 --- a/packages/core/admin/admin/src/content-manager/hooks/useFindRedirectionLink/utils/getRedirectionLink.js +++ b/packages/core/admin/admin/src/content-manager/hooks/useFindRedirectionLink/utils/getRedirectionLink.js @@ -1,6 +1,6 @@ -import { stringify, parse } from 'qs'; import get from 'lodash/get'; import isObject from 'lodash/isObject'; +import { parse, stringify } from 'qs'; /** * Updates the leafs of the first argument diff --git a/packages/core/admin/admin/src/content-manager/hooks/useLazyComponents/index.js b/packages/core/admin/admin/src/content-manager/hooks/useLazyComponents/index.js index 4aedef5905..0961b299cd 100644 --- a/packages/core/admin/admin/src/content-manager/hooks/useLazyComponents/index.js +++ b/packages/core/admin/admin/src/content-manager/hooks/useLazyComponents/index.js @@ -1,4 +1,5 @@ import { useCallback, useEffect, useState } from 'react'; + import { useCustomFields } from '@strapi/helper-plugin'; const componentStore = new Map(); diff --git a/packages/core/admin/admin/src/content-manager/hooks/useLazyComponents/tests/useLazyComponents.test.js b/packages/core/admin/admin/src/content-manager/hooks/useLazyComponents/tests/useLazyComponents.test.js index 87de6481f4..c04a06931c 100644 --- a/packages/core/admin/admin/src/content-manager/hooks/useLazyComponents/tests/useLazyComponents.test.js +++ b/packages/core/admin/admin/src/content-manager/hooks/useLazyComponents/tests/useLazyComponents.test.js @@ -1,4 +1,5 @@ import { renderHook, waitFor } from '@testing-library/react'; + import useLazyComponents from '../index'; const mockCustomField = { diff --git a/packages/core/admin/admin/src/content-manager/hooks/usePluginsQueryParams/index.js b/packages/core/admin/admin/src/content-manager/hooks/usePluginsQueryParams/index.js index f08e747395..381088c2c9 100644 --- a/packages/core/admin/admin/src/content-manager/hooks/usePluginsQueryParams/index.js +++ b/packages/core/admin/admin/src/content-manager/hooks/usePluginsQueryParams/index.js @@ -1,5 +1,5 @@ -import { useLocation } from 'react-router-dom'; import { parse, stringify } from 'qs'; +import { useLocation } from 'react-router-dom'; const usePluginsQueryParams = () => { const { search } = useLocation(); diff --git a/packages/core/admin/admin/src/content-manager/hooks/useRelation/tests/useRelation.test.js b/packages/core/admin/admin/src/content-manager/hooks/useRelation/tests/useRelation.test.js index d86214fb70..8d61b11612 100644 --- a/packages/core/admin/admin/src/content-manager/hooks/useRelation/tests/useRelation.test.js +++ b/packages/core/admin/admin/src/content-manager/hooks/useRelation/tests/useRelation.test.js @@ -1,8 +1,9 @@ import React from 'react'; -import { QueryClientProvider, QueryClient } from 'react-query'; -import { renderHook, act, waitFor } from '@testing-library/react'; import { useFetchClient } from '@strapi/helper-plugin'; +import { act, renderHook, waitFor } from '@testing-library/react'; +import { QueryClient, QueryClientProvider } from 'react-query'; + import { useRelation } from '../useRelation'; jest.mock('@strapi/helper-plugin', () => ({ diff --git a/packages/core/admin/admin/src/content-manager/hooks/useRelation/useRelation.js b/packages/core/admin/admin/src/content-manager/hooks/useRelation/useRelation.js index 7ab2e7cc3a..97bb9693f8 100644 --- a/packages/core/admin/admin/src/content-manager/hooks/useRelation/useRelation.js +++ b/packages/core/admin/admin/src/content-manager/hooks/useRelation/useRelation.js @@ -1,7 +1,7 @@ -import { useState, useEffect } from 'react'; -import { useInfiniteQuery } from 'react-query'; +import { useEffect, useState } from 'react'; -import { useFetchClient, useCallbackRef } from '@strapi/helper-plugin'; +import { useCallbackRef, useFetchClient } from '@strapi/helper-plugin'; +import { useInfiniteQuery } from 'react-query'; import { normalizeRelations } from '../../components/RelationInputDataManager/utils'; diff --git a/packages/core/admin/admin/src/content-manager/hooks/useSyncRbac/index.js b/packages/core/admin/admin/src/content-manager/hooks/useSyncRbac/index.js index 64e8f6c1b3..e88b664f7f 100644 --- a/packages/core/admin/admin/src/content-manager/hooks/useSyncRbac/index.js +++ b/packages/core/admin/admin/src/content-manager/hooks/useSyncRbac/index.js @@ -1,7 +1,9 @@ import { useEffect } from 'react'; + import { useDispatch, useSelector } from 'react-redux'; + import { resetPermissions, setPermissions } from './actions'; -import { selectPermissions, selectCollectionTypePermissions } from './selectors'; +import { selectCollectionTypePermissions, selectPermissions } from './selectors'; const useSyncRbac = (query, collectionTypeUID, containerName = 'listView') => { const collectionTypesRelatedPermissions = useSelector(selectCollectionTypePermissions); diff --git a/packages/core/admin/admin/src/content-manager/hooks/useSyncRbac/reducer.js b/packages/core/admin/admin/src/content-manager/hooks/useSyncRbac/reducer.js index 42a3cad550..223c75b736 100644 --- a/packages/core/admin/admin/src/content-manager/hooks/useSyncRbac/reducer.js +++ b/packages/core/admin/admin/src/content-manager/hooks/useSyncRbac/reducer.js @@ -4,7 +4,8 @@ */ import produce from 'immer'; -import { SET_PERMISSIONS, RESET_PERMISSIONS } from './constants'; + +import { RESET_PERMISSIONS, SET_PERMISSIONS } from './constants'; export const initialState = { permissions: null, diff --git a/packages/core/admin/admin/src/content-manager/hooks/useSyncRbac/tests/selectors.test.js b/packages/core/admin/admin/src/content-manager/hooks/useSyncRbac/tests/selectors.test.js index 773ece61ec..8d73461177 100644 --- a/packages/core/admin/admin/src/content-manager/hooks/useSyncRbac/tests/selectors.test.js +++ b/packages/core/admin/admin/src/content-manager/hooks/useSyncRbac/tests/selectors.test.js @@ -1,5 +1,6 @@ import { fixtures } from '@strapi/admin-test-utils'; -import { selectPermissions, selectCollectionTypePermissions } from '../selectors'; + +import { selectCollectionTypePermissions, selectPermissions } from '../selectors'; describe('Admin | content manager | hooks | useSyncRbac | selectors', () => { let store; diff --git a/packages/core/admin/admin/src/content-manager/hooks/useWysiwyg.js b/packages/core/admin/admin/src/content-manager/hooks/useWysiwyg.js index 44717dac05..382c5af775 100644 --- a/packages/core/admin/admin/src/content-manager/hooks/useWysiwyg.js +++ b/packages/core/admin/admin/src/content-manager/hooks/useWysiwyg.js @@ -1,4 +1,5 @@ import { useContext } from 'react'; + import WysiwygContext from '../contexts/Wysiwyg'; const useWysiwyg = () => useContext(WysiwygContext); diff --git a/packages/core/admin/admin/src/content-manager/pages/App/LeftMenu/index.js b/packages/core/admin/admin/src/content-manager/pages/App/LeftMenu/index.js index 3f53c956bf..9e6f8a7e19 100644 --- a/packages/core/admin/admin/src/content-manager/pages/App/LeftMenu/index.js +++ b/packages/core/admin/admin/src/content-manager/pages/App/LeftMenu/index.js @@ -5,18 +5,18 @@ */ import React, { useMemo, useState } from 'react'; -import { useSelector, shallowEqual } from 'react-redux'; -import { useIntl } from 'react-intl'; -import { NavLink } from 'react-router-dom'; import { SubNav, SubNavHeader, + SubNavLink, SubNavSection, SubNavSections, - SubNavLink, } from '@strapi/design-system/v2'; -import { useFilter, useCollator } from '@strapi/helper-plugin'; +import { useCollator, useFilter } from '@strapi/helper-plugin'; +import { useIntl } from 'react-intl'; +import { shallowEqual, useSelector } from 'react-redux'; +import { NavLink } from 'react-router-dom'; import getTrad from '../../../utils/getTrad'; import { makeSelectModelLinks } from '../selectors'; diff --git a/packages/core/admin/admin/src/content-manager/pages/App/components/CardDragPreview.js b/packages/core/admin/admin/src/content-manager/pages/App/components/CardDragPreview.js index 326cc50910..843e2a3950 100644 --- a/packages/core/admin/admin/src/content-manager/pages/App/components/CardDragPreview.js +++ b/packages/core/admin/admin/src/content-manager/pages/App/components/CardDragPreview.js @@ -1,9 +1,10 @@ import React from 'react'; + +import { Flex, Typography } from '@strapi/design-system'; +import { pxToRem } from '@strapi/helper-plugin'; +import { Cross, Drag, Pencil } from '@strapi/icons'; import PropTypes from 'prop-types'; import styled from 'styled-components'; -import { Flex, Typography } from '@strapi/design-system'; -import { Pencil, Cross, Drag } from '@strapi/icons'; -import { pxToRem } from '@strapi/helper-plugin'; const ActionBox = styled(Flex)` height: ${({ theme }) => theme.spaces[7]}; diff --git a/packages/core/admin/admin/src/content-manager/pages/App/components/ComponentDragPreview.js b/packages/core/admin/admin/src/content-manager/pages/App/components/ComponentDragPreview.js index 11ad22671c..8230125a24 100644 --- a/packages/core/admin/admin/src/content-manager/pages/App/components/ComponentDragPreview.js +++ b/packages/core/admin/admin/src/content-manager/pages/App/components/ComponentDragPreview.js @@ -1,9 +1,10 @@ import React from 'react'; + +import { Flex, IconButton, Typography } from '@strapi/design-system'; +import { pxToRem } from '@strapi/helper-plugin'; +import { CarretDown, Drag, Trash } from '@strapi/icons'; import PropTypes from 'prop-types'; import styled from 'styled-components'; -import { pxToRem } from '@strapi/helper-plugin'; -import { Flex, Typography, IconButton } from '@strapi/design-system'; -import { Trash, Drag, CarretDown } from '@strapi/icons'; const DropdownIconWrapper = styled(Flex)` border-radius: 50%; diff --git a/packages/core/admin/admin/src/content-manager/pages/App/components/RelationDragPreview.js b/packages/core/admin/admin/src/content-manager/pages/App/components/RelationDragPreview.js index 44ca070944..51561f25d0 100644 --- a/packages/core/admin/admin/src/content-manager/pages/App/components/RelationDragPreview.js +++ b/packages/core/admin/admin/src/content-manager/pages/App/components/RelationDragPreview.js @@ -1,16 +1,17 @@ import * as React from 'react'; -import { useIntl } from 'react-intl'; -import PropTypes from 'prop-types'; -import { Box, Flex, IconButton, Typography, Status, Icon } from '@strapi/design-system'; -import { Drag, Cross } from '@strapi/icons'; -import { getTrad } from '../../../utils'; -import { PUBLICATION_STATES } from '../../../components/RelationInputDataManager/constants'; +import { Box, Flex, Icon, IconButton, Status, Typography } from '@strapi/design-system'; +import { Cross, Drag } from '@strapi/icons'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; + +import { DisconnectButton, LinkEllipsis } from '../../../components/RelationInput'; import { ChildrenWrapper, FlexWrapper, } from '../../../components/RelationInput/components/RelationItem'; -import { LinkEllipsis, DisconnectButton } from '../../../components/RelationInput'; +import { PUBLICATION_STATES } from '../../../components/RelationInputDataManager/constants'; +import { getTrad } from '../../../utils'; export const RelationDragPreview = ({ status, displayedValue, width }) => { const { formatMessage } = useIntl(); diff --git a/packages/core/admin/admin/src/content-manager/pages/App/index.js b/packages/core/admin/admin/src/content-manager/pages/App/index.js index 4d13a8f6b0..0f94e8b73a 100644 --- a/packages/core/admin/admin/src/content-manager/pages/App/index.js +++ b/packages/core/admin/admin/src/content-manager/pages/App/index.js @@ -1,32 +1,33 @@ import React, { useEffect, useRef } from 'react'; -import { Helmet } from 'react-helmet'; -import { Switch, Route, useRouteMatch, Redirect, useLocation } from 'react-router-dom'; + +import { HeaderLayout, Layout, Main } from '@strapi/design-system'; import { + AnErrorOccurred, CheckPagePermissions, LoadingIndicatorPage, - AnErrorOccurred, useGuidedTour, } from '@strapi/helper-plugin'; -import { Layout, HeaderLayout, Main } from '@strapi/design-system'; -import { useIntl } from 'react-intl'; import sortBy from 'lodash/sortBy'; -import permissions from '../../../permissions'; -import getTrad from '../../utils/getTrad'; +import { Helmet } from 'react-helmet'; +import { useIntl } from 'react-intl'; +import { Redirect, Route, Switch, useLocation, useRouteMatch } from 'react-router-dom'; + import { DragLayer } from '../../../components/DragLayer'; +import permissions from '../../../permissions'; import ModelsContext from '../../contexts/ModelsContext'; +import getTrad from '../../utils/getTrad'; +import ItemTypes from '../../utils/ItemTypes'; import CollectionTypeRecursivePath from '../CollectionTypeRecursivePath'; import ComponentSettingsView from '../ComponentSetttingsView'; import NoContentType from '../NoContentType'; import NoPermissions from '../NoPermissions'; import SingleTypeRecursivePath from '../SingleTypeRecursivePath'; -import LeftMenu from './LeftMenu'; -import useContentManagerInitData from './useContentManagerInitData'; - -import ItemTypes from '../../utils/ItemTypes'; import { CardDragPreview } from './components/CardDragPreview'; import { ComponentDragPreview } from './components/ComponentDragPreview'; import { RelationDragPreview } from './components/RelationDragPreview'; +import LeftMenu from './LeftMenu'; +import useContentManagerInitData from './useContentManagerInitData'; const cmPermissions = permissions.contentManager; diff --git a/packages/core/admin/admin/src/content-manager/pages/App/reducer.js b/packages/core/admin/admin/src/content-manager/pages/App/reducer.js index e3dbd20f2f..fdc3ba4f24 100644 --- a/packages/core/admin/admin/src/content-manager/pages/App/reducer.js +++ b/packages/core/admin/admin/src/content-manager/pages/App/reducer.js @@ -4,6 +4,7 @@ */ /* eslint-disable consistent-return */ import produce from 'immer'; + import { GET_INIT_DATA, RESET_INIT_DATA, SET_INIT_DATA } from './constants'; const initialState = { diff --git a/packages/core/admin/admin/src/content-manager/pages/App/selectors.js b/packages/core/admin/admin/src/content-manager/pages/App/selectors.js index 8096c8e87a..17f9d642d9 100644 --- a/packages/core/admin/admin/src/content-manager/pages/App/selectors.js +++ b/packages/core/admin/admin/src/content-manager/pages/App/selectors.js @@ -1,4 +1,5 @@ import { createSelector } from 'reselect'; + import { initialState } from './reducer'; const selectAppDomain = () => (state) => { @@ -30,6 +31,6 @@ export { makeSelectModelAndComponentSchemas, makeSelectModelLinks, makeSelectModels, - selectFieldSizes, selectAppDomain, + selectFieldSizes, }; diff --git a/packages/core/admin/admin/src/content-manager/pages/App/tests/index.test.js b/packages/core/admin/admin/src/content-manager/pages/App/tests/index.test.js index 1a9d244088..3e4ae0c003 100644 --- a/packages/core/admin/admin/src/content-manager/pages/App/tests/index.test.js +++ b/packages/core/admin/admin/src/content-manager/pages/App/tests/index.test.js @@ -1,17 +1,19 @@ /* eslint-disable no-irregular-whitespace */ import React from 'react'; -import { createStore, combineReducers } from 'redux'; -import { Router } from 'react-router-dom'; + +import { darkTheme, lightTheme } from '@strapi/design-system'; +import { act, render, screen } from '@testing-library/react'; import { createMemoryHistory } from 'history'; -import { Provider } from 'react-redux'; import { DndProvider } from 'react-dnd'; import { HTML5Backend } from 'react-dnd-html5-backend'; -import { act, render, screen } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; -import { lightTheme, darkTheme } from '@strapi/design-system'; +import { Provider } from 'react-redux'; +import { Router } from 'react-router-dom'; +import { combineReducers, createStore } from 'redux'; + +import { App as ContentManagerApp } from '..'; import Theme from '../../../../components/Theme'; import ThemeToggleProvider from '../../../../components/ThemeToggleProvider'; -import { App as ContentManagerApp } from '..'; import cmReducers from '../../../../reducers'; import useContentManagerInitData from '../useContentManagerInitData'; diff --git a/packages/core/admin/admin/src/content-manager/pages/App/tests/reducer.test.js b/packages/core/admin/admin/src/content-manager/pages/App/tests/reducer.test.js index de21071bff..7848a8c338 100644 --- a/packages/core/admin/admin/src/content-manager/pages/App/tests/reducer.test.js +++ b/packages/core/admin/admin/src/content-manager/pages/App/tests/reducer.test.js @@ -1,5 +1,6 @@ import produce from 'immer'; -import { getInitData, setInitData, resetInitData } from '../actions'; + +import { getInitData, resetInitData, setInitData } from '../actions'; import mainReducer from '../reducer'; describe('Content Manager | App | reducer', () => { diff --git a/packages/core/admin/admin/src/content-manager/pages/App/tests/selectors.test.js b/packages/core/admin/admin/src/content-manager/pages/App/tests/selectors.test.js index ef87d82c6f..83523366d1 100644 --- a/packages/core/admin/admin/src/content-manager/pages/App/tests/selectors.test.js +++ b/packages/core/admin/admin/src/content-manager/pages/App/tests/selectors.test.js @@ -1,4 +1,5 @@ import { fixtures } from '@strapi/admin-test-utils'; + import { makeSelectModels } from '../selectors'; describe('Content Manager | App | selectors', () => { diff --git a/packages/core/admin/admin/src/content-manager/pages/App/useContentManagerInitData.js b/packages/core/admin/admin/src/content-manager/pages/App/useContentManagerInitData.js index 6d5a679974..27f69a6137 100644 --- a/packages/core/admin/admin/src/content-manager/pages/App/useContentManagerInitData.js +++ b/packages/core/admin/admin/src/content-manager/pages/App/useContentManagerInitData.js @@ -1,16 +1,19 @@ +import { useEffect, useRef } from 'react'; + +import { useNotifyAT } from '@strapi/design-system'; import { + useFetchClient, useNotification, useRBACProvider, useStrapiApp, - useFetchClient, } from '@strapi/helper-plugin'; -import { useEffect, useRef } from 'react'; -import { useDispatch, useSelector } from 'react-redux'; -import { useNotifyAT } from '@strapi/design-system'; import axios from 'axios'; import { useIntl } from 'react-intl'; +import { useDispatch, useSelector } from 'react-redux'; + import { MUTATE_COLLECTION_TYPES_LINKS, MUTATE_SINGLE_TYPES_LINKS } from '../../../exposedHooks'; import { getTrad } from '../../utils'; + import { getInitData, resetInitData, setInitData } from './actions'; import { selectAppDomain } from './selectors'; import getContentTypeLinks from './utils/getContentTypeLinks'; diff --git a/packages/core/admin/admin/src/content-manager/pages/App/utils/getContentTypeLinks.js b/packages/core/admin/admin/src/content-manager/pages/App/utils/getContentTypeLinks.js index 44a5084740..c52e0344f6 100644 --- a/packages/core/admin/admin/src/content-manager/pages/App/utils/getContentTypeLinks.js +++ b/packages/core/admin/admin/src/content-manager/pages/App/utils/getContentTypeLinks.js @@ -1,8 +1,10 @@ import { getFetchClient } from '@strapi/helper-plugin'; -import generateModelsLinks from './generateModelsLinks'; -import checkPermissions from './checkPermissions'; + import { getRequestUrl } from '../../../utils'; +import checkPermissions from './checkPermissions'; +import generateModelsLinks from './generateModelsLinks'; + const getContentTypeLinks = async ({ models, userPermissions, toggleNotification }) => { const { get } = getFetchClient(); try { diff --git a/packages/core/admin/admin/src/content-manager/pages/App/utils/tests/getContentTypeLinks.test.js b/packages/core/admin/admin/src/content-manager/pages/App/utils/tests/getContentTypeLinks.test.js index 71a65d5f02..841e4b8eda 100644 --- a/packages/core/admin/admin/src/content-manager/pages/App/utils/tests/getContentTypeLinks.test.js +++ b/packages/core/admin/admin/src/content-manager/pages/App/utils/tests/getContentTypeLinks.test.js @@ -1,4 +1,5 @@ import { getFetchClient, hasPermissions } from '@strapi/helper-plugin'; + import getContentTypeLinks from '../getContentTypeLinks'; // FIXME diff --git a/packages/core/admin/admin/src/content-manager/pages/CollectionTypeRecursivePath/components/ErrorFallback.js b/packages/core/admin/admin/src/content-manager/pages/CollectionTypeRecursivePath/components/ErrorFallback.js index 924d39a5d4..b232d1e4a3 100644 --- a/packages/core/admin/admin/src/content-manager/pages/CollectionTypeRecursivePath/components/ErrorFallback.js +++ b/packages/core/admin/admin/src/content-manager/pages/CollectionTypeRecursivePath/components/ErrorFallback.js @@ -1,6 +1,7 @@ import React from 'react'; -import { AnErrorOccurred } from '@strapi/helper-plugin'; + import { Box } from '@strapi/design-system'; +import { AnErrorOccurred } from '@strapi/helper-plugin'; const ErrorFallback = () => { return ( diff --git a/packages/core/admin/admin/src/content-manager/pages/CollectionTypeRecursivePath/index.js b/packages/core/admin/admin/src/content-manager/pages/CollectionTypeRecursivePath/index.js index ad04169ecf..412d06a388 100644 --- a/packages/core/admin/admin/src/content-manager/pages/CollectionTypeRecursivePath/index.js +++ b/packages/core/admin/admin/src/content-manager/pages/CollectionTypeRecursivePath/index.js @@ -1,16 +1,19 @@ import React, { memo, useMemo } from 'react'; -import { Switch, Route } from 'react-router-dom'; -import { ErrorBoundary } from 'react-error-boundary'; + +import { CheckPagePermissions, LoadingIndicatorPage } from '@strapi/helper-plugin'; import PropTypes from 'prop-types'; -import { LoadingIndicatorPage, CheckPagePermissions } from '@strapi/helper-plugin'; +import { ErrorBoundary } from 'react-error-boundary'; +import { Route, Switch } from 'react-router-dom'; + import permissions from '../../../permissions'; import { ContentTypeLayoutContext } from '../../contexts'; import { useFetchContentTypeLayout } from '../../hooks'; import { formatLayoutToApi } from '../../utils'; -import EditViewLayoutManager from '../EditViewLayoutManager'; import EditSettingsView from '../EditSettingsView'; -import ListViewLayout from '../ListViewLayoutManager'; +import EditViewLayoutManager from '../EditViewLayoutManager'; import ListSettingsView from '../ListSettingsView'; +import ListViewLayout from '../ListViewLayoutManager'; + import ErrorFallback from './components/ErrorFallback'; const cmPermissions = permissions.contentManager; diff --git a/packages/core/admin/admin/src/content-manager/pages/ComponentSetttingsView/index.js b/packages/core/admin/admin/src/content-manager/pages/ComponentSetttingsView/index.js index 3b6810d5f8..51bb0b961c 100644 --- a/packages/core/admin/admin/src/content-manager/pages/ComponentSetttingsView/index.js +++ b/packages/core/admin/admin/src/content-manager/pages/ComponentSetttingsView/index.js @@ -1,13 +1,15 @@ import React, { memo, useEffect, useMemo, useReducer } from 'react'; -import { useParams } from 'react-router-dom'; + import { CheckPagePermissions, LoadingIndicatorPage, useFetchClient } from '@strapi/helper-plugin'; -import { useSelector, shallowEqual } from 'react-redux'; import axios from 'axios'; +import { shallowEqual, useSelector } from 'react-redux'; +import { useParams } from 'react-router-dom'; + +import permissions from '../../../permissions'; +import { getData, getDataSucceeded } from '../../sharedReducers/crudReducer/actions'; +import crudReducer, { crudInitialState } from '../../sharedReducers/crudReducer/reducer'; import { mergeMetasWithSchema } from '../../utils'; import { makeSelectModelAndComponentSchemas } from '../App/selectors'; -import permissions from '../../../permissions'; -import crudReducer, { crudInitialState } from '../../sharedReducers/crudReducer/reducer'; -import { getData, getDataSucceeded } from '../../sharedReducers/crudReducer/actions'; import EditSettingsView from '../EditSettingsView'; const cmPermissions = permissions.contentManager; diff --git a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/ComponentFieldList.js b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/ComponentFieldList.js index 94be7071bf..59061382d6 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/ComponentFieldList.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/ComponentFieldList.js @@ -1,12 +1,14 @@ import React from 'react'; -import PropTypes from 'prop-types'; + +import { Box, Flex, Grid, GridItem, Typography } from '@strapi/design-system'; import { Link } from '@strapi/helper-plugin'; -import { Box, Flex, Typography, Grid, GridItem } from '@strapi/design-system'; import { Cog } from '@strapi/icons'; -import { useIntl } from 'react-intl'; import get from 'lodash/get'; -import { useLayoutDnd } from '../hooks/useLayoutDnd'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; + import getTrad from '../../../utils/getTrad'; +import { useLayoutDnd } from '../hooks/useLayoutDnd'; const ComponentFieldList = ({ componentUid }) => { const { componentLayouts } = useLayoutDnd(); diff --git a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/DisplayedFieldButton.js b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/DisplayedFieldButton.js index 96fe848610..4a9793785e 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/DisplayedFieldButton.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/DisplayedFieldButton.js @@ -1,14 +1,17 @@ -import React, { useRef, useEffect, useState } from 'react'; -import styled from 'styled-components'; -import PropTypes from 'prop-types'; -import { useDrop, useDrag } from 'react-dnd'; -import { getEmptyImage } from 'react-dnd-html5-backend'; -import { Flex, Box, GridItem } from '@strapi/design-system'; +import React, { useEffect, useRef, useState } from 'react'; + +import { Box, Flex, GridItem } from '@strapi/design-system'; import { Drag } from '@strapi/icons'; +import PropTypes from 'prop-types'; +import { useDrag, useDrop } from 'react-dnd'; +import { getEmptyImage } from 'react-dnd-html5-backend'; +import styled from 'styled-components'; + import { ItemTypes } from '../../../utils'; -import FieldButtonContent from './FieldButtonContent'; import { useLayoutDnd } from '../hooks/useLayoutDnd'; +import FieldButtonContent from './FieldButtonContent'; + const Wrapper = styled(Flex)` position: relative; ${({ isFirst, isLast, hasHorizontalPadding }) => { diff --git a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/DisplayedFields.js b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/DisplayedFields.js index b74cb935e1..bf678e3861 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/DisplayedFields.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/DisplayedFields.js @@ -1,11 +1,14 @@ import React from 'react'; + +import { Box, Button, Flex, MenuItem, SimpleMenu, Typography } from '@strapi/design-system'; +import { Plus } from '@strapi/icons'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { Button, Box, Typography, Flex, SimpleMenu, MenuItem } from '@strapi/design-system'; -import { Plus } from '@strapi/icons'; + import { getTrad } from '../../../utils'; -import RowsLayout from './RowsLayout'; + import LinkToCTB from './LinkToCTB'; +import RowsLayout from './RowsLayout'; const DisplayedFields = ({ editLayout, fields, onRemoveField, onAddField }) => { const { formatMessage } = useIntl(); diff --git a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/DynamicZoneList.js b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/DynamicZoneList.js index ce0b5dd500..c082e5af87 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/DynamicZoneList.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/DynamicZoneList.js @@ -1,8 +1,9 @@ import React from 'react'; -import styled from 'styled-components'; -import { Link } from 'react-router-dom'; -import PropTypes from 'prop-types'; + import { Box, Flex, Typography } from '@strapi/design-system'; +import PropTypes from 'prop-types'; +import { Link } from 'react-router-dom'; +import styled from 'styled-components'; import { ComponentIcon } from '../../../components/ComponentIcon'; import { useLayoutDnd } from '../hooks/useLayoutDnd'; diff --git a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/FieldButtonContent.js b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/FieldButtonContent.js index b92fdc16af..9ad4820f7b 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/FieldButtonContent.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/FieldButtonContent.js @@ -1,10 +1,13 @@ import React from 'react'; -import styled from 'styled-components'; -import PropTypes from 'prop-types'; -import { useIntl } from 'react-intl'; + import { Box, Flex, IconButton, Typography } from '@strapi/design-system'; import { Pencil, Trash } from '@strapi/icons'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import styled from 'styled-components'; + import { getTrad } from '../../../utils'; + import ComponentFieldList from './ComponentFieldList'; import DynamicZoneList from './DynamicZoneList'; diff --git a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/FormModal.js b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/FormModal.js index fcc2dae6ad..57fb018096 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/FormModal.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/FormModal.js @@ -1,21 +1,24 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import { useIntl } from 'react-intl'; -import upperFirst from 'lodash/upperFirst'; + import { - ModalLayout, - ModalHeader, - ModalFooter, - ModalBody, - Typography, Button, Flex, Grid, + ModalBody, + ModalFooter, + ModalHeader, + ModalLayout, + Typography, } from '@strapi/design-system'; +import upperFirst from 'lodash/upperFirst'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; import styled from 'styled-components'; + +import FieldTypeIcon from '../../../components/FieldTypeIcon'; import { getTrad } from '../../../utils'; import { useLayoutDnd } from '../hooks/useLayoutDnd'; -import FieldTypeIcon from '../../../components/FieldTypeIcon'; + import ModalForm from './ModalForm'; const HeaderContainer = styled(Flex)` diff --git a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/GenericInput.js b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/GenericInput.js index 4aa41925c5..8ecfd6ae8a 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/GenericInput.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/GenericInput.js @@ -1,6 +1,7 @@ import React from 'react'; + +import { Option, Select, TextInput, ToggleInput } from '@strapi/design-system'; import PropTypes from 'prop-types'; -import { TextInput, ToggleInput, Select, Option } from '@strapi/design-system'; import { useIntl } from 'react-intl'; const GenericInput = ({ type, options, onChange, value, name, ...inputProps }) => { diff --git a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/LayoutDndProvider/index.js b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/LayoutDndProvider/index.js index 3835cb9fa9..223d0e412b 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/LayoutDndProvider/index.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/LayoutDndProvider/index.js @@ -1,4 +1,5 @@ import React from 'react'; + import PropTypes from 'prop-types'; export const LayoutDndContext = React.createContext(); diff --git a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/LinkToCTB.js b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/LinkToCTB.js index c0e776137f..58686d1144 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/LinkToCTB.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/LinkToCTB.js @@ -5,10 +5,12 @@ */ import React from 'react'; -import { useTracking, CheckPermissions, LinkButton } from '@strapi/helper-plugin'; -import { useIntl } from 'react-intl'; -import get from 'lodash/get'; + +import { CheckPermissions, LinkButton, useTracking } from '@strapi/helper-plugin'; import { Pencil } from '@strapi/icons'; +import get from 'lodash/get'; +import { useIntl } from 'react-intl'; + import getTrad from '../../../utils/getTrad'; import { useLayoutDnd } from '../hooks/useLayoutDnd'; diff --git a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/ModalForm.js b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/ModalForm.js index d00553f433..b4d86a9db3 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/ModalForm.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/ModalForm.js @@ -1,13 +1,16 @@ -import React, { useMemo, useCallback } from 'react'; -import PropTypes from 'prop-types'; +import React, { useCallback, useMemo } from 'react'; + +import { GridItem, Option, Select } from '@strapi/design-system'; import get from 'lodash/get'; -import { GridItem, Select, Option } from '@strapi/design-system'; -import { useSelector, shallowEqual } from 'react-redux'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; +import { shallowEqual, useSelector } from 'react-redux'; + +import getTrad from '../../../utils/getTrad'; +import { makeSelectModelAndComponentSchemas, selectFieldSizes } from '../../App/selectors'; import { useLayoutDnd } from '../hooks/useLayoutDnd'; import { createPossibleMainFieldsForModelsAndComponents, getInputProps } from '../utils'; -import { makeSelectModelAndComponentSchemas, selectFieldSizes } from '../../App/selectors'; -import getTrad from '../../../utils/getTrad'; + import GenericInput from './GenericInput'; const FIELD_SIZES = [ diff --git a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/RowItemsLayout.js b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/RowItemsLayout.js index 349beef53b..4d056dc1c0 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/RowItemsLayout.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/RowItemsLayout.js @@ -1,7 +1,10 @@ import React from 'react'; -import PropTypes from 'prop-types'; + import get from 'lodash/get'; +import PropTypes from 'prop-types'; + import { useLayoutDnd } from '../hooks/useLayoutDnd'; + import DisplayedFieldButton from './DisplayedFieldButton'; const RowItemsLayout = ({ rowItem, onRemoveField, rowId, rowIndex, index, lastIndex }) => { diff --git a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/RowsLayout.js b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/RowsLayout.js index 044cb2dd90..e8473596a6 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/RowsLayout.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/RowsLayout.js @@ -1,6 +1,8 @@ import React from 'react'; -import PropTypes from 'prop-types'; + import { Grid } from '@strapi/design-system'; +import PropTypes from 'prop-types'; + import RowItemsLayout from './RowItemsLayout'; const RowsLayout = ({ row, onRemoveField, rowIndex }) => { diff --git a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/hooks/useLayoutDnd.js b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/hooks/useLayoutDnd.js index 95072fd39d..99a02bf638 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/hooks/useLayoutDnd.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/hooks/useLayoutDnd.js @@ -1,4 +1,5 @@ import * as React from 'react'; + import { LayoutDndContext } from '../components/LayoutDndProvider'; export function useLayoutDnd() { diff --git a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/index.js b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/index.js index 4df66dd71f..f96f0ed41a 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/index.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/index.js @@ -1,41 +1,44 @@ import React, { useReducer, useState } from 'react'; + +import { + Box, + Button, + ContentLayout, + Divider, + Flex, + Grid, + GridItem, + HeaderLayout, + Main, + Option, + Select, + Typography, +} from '@strapi/design-system'; +import { ConfirmDialog, Link, useNotification, useTracking } from '@strapi/helper-plugin'; +import { ArrowLeft, Check } from '@strapi/icons'; +import cloneDeep from 'lodash/cloneDeep'; +import flatMap from 'lodash/flatMap'; +import get from 'lodash/get'; +import isEqual from 'lodash/isEqual'; +import pick from 'lodash/pick'; +import set from 'lodash/set'; +import upperFirst from 'lodash/upperFirst'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; import { useMutation } from 'react-query'; -import upperFirst from 'lodash/upperFirst'; -import pick from 'lodash/pick'; -import cloneDeep from 'lodash/cloneDeep'; -import flatMap from 'lodash/flatMap'; -import isEqual from 'lodash/isEqual'; -import get from 'lodash/get'; -import set from 'lodash/set'; -import { useNotification, useTracking, ConfirmDialog, Link } from '@strapi/helper-plugin'; -import { useHistory } from 'react-router-dom'; -import { - Main, - HeaderLayout, - ContentLayout, - Button, - Box, - Typography, - Grid, - GridItem, - Select, - Option, - Flex, - Divider, -} from '@strapi/design-system'; -import { ArrowLeft, Check } from '@strapi/icons'; import { useSelector } from 'react-redux'; +import { useHistory } from 'react-router-dom'; + import { getTrad } from '../../utils'; -import reducer, { initialState } from './reducer'; -import init from './init'; +import { selectFieldSizes } from '../App/selectors'; + import DisplayedFields from './components/DisplayedFields'; import ModalForm from './components/FormModal'; import { LayoutDndProvider } from './components/LayoutDndProvider'; -import { unformatLayout } from './utils/layout'; +import init from './init'; +import reducer, { initialState } from './reducer'; import putCMSettingsEV from './utils/api'; -import { selectFieldSizes } from '../App/selectors'; +import { unformatLayout } from './utils/layout'; const EditSettingsView = ({ mainLayout, components, isContentTypeView, slug, updateLayout }) => { const [reducerState, dispatch] = useReducer(reducer, initialState, () => diff --git a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/reducer.js b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/reducer.js index d9cad8c5f8..5e796bc907 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/reducer.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/reducer.js @@ -1,8 +1,10 @@ import produce from 'immer'; -import set from 'lodash/set'; -import get from 'lodash/get'; import cloneDeep from 'lodash/cloneDeep'; +import get from 'lodash/get'; +import set from 'lodash/set'; + import { arrayMoveItem } from '../../utils'; + import { formatLayout, getFieldSize, setFieldSize } from './utils/layout'; const DEFAULT_FIELD_SIZE = 6; diff --git a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/tests/index.test.js b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/tests/index.test.js index a29bb43f60..d9823fcfe6 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/tests/index.test.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/tests/index.test.js @@ -1,16 +1,18 @@ import React from 'react'; -import { render, waitFor, screen, fireEvent } from '@testing-library/react'; -import { Router } from 'react-router-dom'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { fireEvent, render, screen, waitFor } from '@testing-library/react'; import { createMemoryHistory } from 'history'; -import { IntlProvider } from 'react-intl'; -import { QueryClient, QueryClientProvider } from 'react-query'; -import { combineReducers, createStore } from 'redux'; -import { Provider } from 'react-redux'; import { DndProvider } from 'react-dnd'; import { HTML5Backend } from 'react-dnd-html5-backend'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import EditSettingsView from '../index'; +import { IntlProvider } from 'react-intl'; +import { QueryClient, QueryClientProvider } from 'react-query'; +import { Provider } from 'react-redux'; +import { Router } from 'react-router-dom'; +import { combineReducers, createStore } from 'redux'; + import cmReducers from '../../../../reducers'; +import EditSettingsView from '../index'; jest.mock('@strapi/helper-plugin', () => ({ ...jest.requireActual('@strapi/helper-plugin'), diff --git a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/utils/api.js b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/utils/api.js index a91cbd6ecf..bf4e1df272 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/utils/api.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/utils/api.js @@ -1,4 +1,5 @@ import { getFetchClient } from '@strapi/helper-plugin'; + import { getRequestUrl } from '../../../utils'; const putCMSettingsEV = (body, slug, isContentTypeView) => { diff --git a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/utils/layout.js b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/utils/layout.js index 8db770aa50..2d369e5387 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/utils/layout.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/utils/layout.js @@ -103,4 +103,4 @@ const setFieldSize = (name, size, layouts = []) => { }); }; -export { createLayout, formatLayout, getFieldSize, setFieldSize, getRowSize, unformatLayout }; +export { createLayout, formatLayout, getFieldSize, getRowSize, setFieldSize, unformatLayout }; diff --git a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/utils/tests/layout.test.js b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/utils/tests/layout.test.js index 2ba8730b57..ee2499622e 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/utils/tests/layout.test.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/utils/tests/layout.test.js @@ -2,8 +2,8 @@ import { createLayout, formatLayout, getFieldSize, - setFieldSize, getRowSize, + setFieldSize, unformatLayout, } from '../layout'; diff --git a/packages/core/admin/admin/src/content-manager/pages/EditView/DeleteLink/index.js b/packages/core/admin/admin/src/content-manager/pages/EditView/DeleteLink/index.js index 80213e5a18..d6003e526d 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditView/DeleteLink/index.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditView/DeleteLink/index.js @@ -1,11 +1,14 @@ import React, { memo, useState } from 'react'; -import { useIntl } from 'react-intl'; -import isEqual from 'lodash/isEqual'; + import { Button } from '@strapi/design-system'; +import { ConfirmDialog, useAPIErrorHandler, useNotification } from '@strapi/helper-plugin'; import { Trash } from '@strapi/icons'; -import { ConfirmDialog, useNotification, useAPIErrorHandler } from '@strapi/helper-plugin'; +import isEqual from 'lodash/isEqual'; import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; + import { getTrad } from '../../../utils'; + import { connect, select } from './utils'; const DeleteLink = ({ onDelete, trackerProperty }) => { diff --git a/packages/core/admin/admin/src/content-manager/pages/EditView/DeleteLink/utils/select.js b/packages/core/admin/admin/src/content-manager/pages/EditView/DeleteLink/utils/select.js index bf90714945..43bad41e9d 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditView/DeleteLink/utils/select.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditView/DeleteLink/utils/select.js @@ -1,5 +1,5 @@ -import isEmpty from 'lodash/isEmpty'; import { useCMEditViewDataManager } from '@strapi/helper-plugin'; +import isEmpty from 'lodash/isEmpty'; function useSelect() { const { hasDraftAndPublish, modifiedData } = useCMEditViewDataManager(); diff --git a/packages/core/admin/admin/src/content-manager/pages/EditView/DraftAndPublishBadge/index.js b/packages/core/admin/admin/src/content-manager/pages/EditView/DraftAndPublishBadge/index.js index 4395814daa..239e4d9a14 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditView/DraftAndPublishBadge/index.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditView/DraftAndPublishBadge/index.js @@ -1,11 +1,14 @@ import React from 'react'; + +import { Box, Flex, Typography } from '@strapi/design-system'; +import { pxToRem } from '@strapi/helper-plugin'; +import { Dot } from '@strapi/icons'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; import styled from 'styled-components'; -import { Box, Flex, Typography } from '@strapi/design-system'; -import { Dot } from '@strapi/icons'; -import { pxToRem } from '@strapi/helper-plugin'; + import { getTrad } from '../../../utils'; + import { connect, select } from './utils'; const CustomBullet = styled(Dot)` diff --git a/packages/core/admin/admin/src/content-manager/pages/EditView/DraftAndPublishBadge/tests/index.test.js b/packages/core/admin/admin/src/content-manager/pages/EditView/DraftAndPublishBadge/tests/index.test.js index faf76b8a87..b0d4681c0c 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditView/DraftAndPublishBadge/tests/index.test.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditView/DraftAndPublishBadge/tests/index.test.js @@ -7,9 +7,11 @@ /* eslint-disable no-irregular-whitespace */ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render } from '@testing-library/react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; import { IntlProvider } from 'react-intl'; + import { DraftAndPublishBadge } from '../index'; const makeApp = (props) => ( diff --git a/packages/core/admin/admin/src/content-manager/pages/EditView/GridRow/index.js b/packages/core/admin/admin/src/content-manager/pages/EditView/GridRow/index.js index 732cc0bf26..b9d91a4b84 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditView/GridRow/index.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditView/GridRow/index.js @@ -1,8 +1,10 @@ import React from 'react'; -import PropTypes from 'prop-types'; + import { Grid, GridItem } from '@strapi/design-system'; -import Inputs from '../../../components/Inputs'; +import PropTypes from 'prop-types'; + import FieldComponent from '../../../components/FieldComponent'; +import Inputs from '../../../components/Inputs'; const GridRow = ({ columns, customFieldInputs }) => { return ( diff --git a/packages/core/admin/admin/src/content-manager/pages/EditView/Header/index.js b/packages/core/admin/admin/src/content-manager/pages/EditView/Header/index.js index cdd27193c8..7395074924 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditView/Header/index.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditView/Header/index.js @@ -1,25 +1,28 @@ import React, { memo, useState } from 'react'; -import { useIntl } from 'react-intl'; -import { useHistory } from 'react-router-dom'; -import PropTypes from 'prop-types'; -import isEqualFastCompare from 'lodash/isEqual'; -import get from 'lodash/get'; -import isEqual from 'lodash/isEqual'; -import isEmpty from 'lodash/isEmpty'; -import { ArrowLeft, Check, ExclamationMarkCircle } from '@strapi/icons'; -import { Link } from '@strapi/helper-plugin'; + import { - HeaderLayout, Box, Button, Dialog, DialogBody, DialogFooter, Flex, + HeaderLayout, Typography, } from '@strapi/design-system'; +import { Link } from '@strapi/helper-plugin'; +import { ArrowLeft, Check, ExclamationMarkCircle } from '@strapi/icons'; +import get from 'lodash/get'; +import isEmpty from 'lodash/isEmpty'; +import isEqualFastCompare from 'lodash/isEqual'; +import isEqual from 'lodash/isEqual'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import { useHistory } from 'react-router-dom'; import styled from 'styled-components'; + import { getTrad } from '../../../utils'; + import { connect, select } from './utils'; // TODO: replace with textAlign Typography props when available diff --git a/packages/core/admin/admin/src/content-manager/pages/EditView/Header/tests/index.test.js b/packages/core/admin/admin/src/content-manager/pages/EditView/Header/tests/index.test.js index edbaee84dd..aab4881791 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditView/Header/tests/index.test.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditView/Header/tests/index.test.js @@ -5,13 +5,16 @@ */ import React from 'react'; + +import { darkTheme, lightTheme } from '@strapi/design-system'; import { render } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; import { MemoryRouter } from 'react-router-dom'; -import { lightTheme, darkTheme } from '@strapi/design-system'; + import Theme from '../../../../../components/Theme'; import ThemeToggleProvider from '../../../../../components/ThemeToggleProvider'; import { Header } from '../index'; + import ct from './data/ct-schema.json'; const defaultProps = { diff --git a/packages/core/admin/admin/src/content-manager/pages/EditView/Information/index.js b/packages/core/admin/admin/src/content-manager/pages/EditView/Information/index.js index 1ff45308ff..a08e251b5f 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditView/Information/index.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditView/Information/index.js @@ -1,12 +1,14 @@ import React, { useRef } from 'react'; + +import { Box, Divider, Flex, Typography } from '@strapi/design-system'; +import { useCMEditViewDataManager } from '@strapi/helper-plugin'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { useCMEditViewDataManager } from '@strapi/helper-plugin'; -import { Box, Divider, Flex, Typography } from '@strapi/design-system'; -import { getTrad } from '../../../utils'; -import getUnits from './utils/getUnits'; import { getFullName } from '../../../../utils'; +import { getTrad } from '../../../utils'; + +import getUnits from './utils/getUnits'; const Title = () => { const { formatMessage } = useIntl(); diff --git a/packages/core/admin/admin/src/content-manager/pages/EditView/Information/tests/index.test.js b/packages/core/admin/admin/src/content-manager/pages/EditView/Information/tests/index.test.js index d1818a26aa..1017fe3286 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditView/Information/tests/index.test.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditView/Information/tests/index.test.js @@ -5,10 +5,11 @@ */ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { useCMEditViewDataManager } from '@strapi/helper-plugin'; import { render } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; -import { useCMEditViewDataManager } from '@strapi/helper-plugin'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; import Information from '..'; diff --git a/packages/core/admin/admin/src/content-manager/pages/EditView/InformationBox/tests/InformationBoxCe.test.js b/packages/core/admin/admin/src/content-manager/pages/EditView/InformationBox/tests/InformationBoxCe.test.js index 629b65859f..9023b92bef 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditView/InformationBox/tests/InformationBoxCe.test.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditView/InformationBox/tests/InformationBoxCe.test.js @@ -5,10 +5,11 @@ */ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { useCMEditViewDataManager } from '@strapi/helper-plugin'; import { render } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; -import { useCMEditViewDataManager } from '@strapi/helper-plugin'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; import { InformationBoxCE } from '../InformationBoxCE'; diff --git a/packages/core/admin/admin/src/content-manager/pages/EditView/index.js b/packages/core/admin/admin/src/content-manager/pages/EditView/index.js index 16dca54fd8..3b4df1a7ad 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditView/index.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditView/index.js @@ -1,30 +1,33 @@ import React, { memo } from 'react'; -import PropTypes from 'prop-types'; -import { useSelector } from 'react-redux'; + +import { Box, ContentLayout, Flex, Grid, GridItem, Main } from '@strapi/design-system'; import { CheckPermissions, - useTracking, LinkButton, LoadingIndicatorPage, + useTracking, } from '@strapi/helper-plugin'; -import { useIntl } from 'react-intl'; -import { ContentLayout, Box, Flex, Grid, GridItem, Main } from '@strapi/design-system'; -import { Pencil, Layer } from '@strapi/icons'; +import { Layer, Pencil } from '@strapi/icons'; import InformationBox from 'ee_else_ce/content-manager/pages/EditView/InformationBox'; -import { InjectionZone } from '../../../shared/components'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import { useSelector } from 'react-redux'; + import permissions from '../../../permissions'; -import { DynamicZone } from '../../components/DynamicZone'; +import { InjectionZone } from '../../../shared/components'; import CollectionTypeFormWrapper from '../../components/CollectionTypeFormWrapper'; +import { DynamicZone } from '../../components/DynamicZone'; import EditViewDataManagerProvider from '../../components/EditViewDataManagerProvider'; import SingleTypeFormWrapper from '../../components/SingleTypeFormWrapper'; -import { getTrad } from '../../utils'; import useLazyComponents from '../../hooks/useLazyComponents'; -import DraftAndPublishBadge from './DraftAndPublishBadge'; -import Header from './Header'; -import { getFieldsActionMatchingPermissions } from './utils'; +import { getTrad } from '../../utils'; + import DeleteLink from './DeleteLink'; +import DraftAndPublishBadge from './DraftAndPublishBadge'; import GridRow from './GridRow'; -import { selectCurrentLayout, selectAttributesLayout, selectCustomFieldUids } from './selectors'; +import Header from './Header'; +import { selectAttributesLayout, selectCurrentLayout, selectCustomFieldUids } from './selectors'; +import { getFieldsActionMatchingPermissions } from './utils'; const cmPermissions = permissions.contentManager; const ctbPermissions = [{ action: 'plugin::content-type-builder.read', subject: null }]; diff --git a/packages/core/admin/admin/src/content-manager/pages/EditView/selectors.js b/packages/core/admin/admin/src/content-manager/pages/EditView/selectors.js index 648c2c8dee..cd7231ad71 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditView/selectors.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditView/selectors.js @@ -1,4 +1,5 @@ import { createSelector } from 'reselect'; + import { createAttributesLayout, getCustomFieldUidsFromLayout } from './utils'; const selectCurrentLayout = (state) => state['content-manager_editViewLayoutManager'].currentLayout; @@ -11,4 +12,4 @@ const selectCustomFieldUids = createSelector(selectCurrentLayout, (layout) => getCustomFieldUidsFromLayout(layout) ); -export { selectCurrentLayout, selectAttributesLayout, selectCustomFieldUids }; +export { selectAttributesLayout, selectCurrentLayout, selectCustomFieldUids }; diff --git a/packages/core/admin/admin/src/content-manager/pages/EditView/utils/getFieldsActionMatchingPermissions.js b/packages/core/admin/admin/src/content-manager/pages/EditView/utils/getFieldsActionMatchingPermissions.js index c2067a1fe6..a6ff0eb08f 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditView/utils/getFieldsActionMatchingPermissions.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditView/utils/getFieldsActionMatchingPermissions.js @@ -1,6 +1,6 @@ -import uniq from 'lodash/uniq'; -import flatMap from 'lodash/flatMap'; import { findMatchingPermissions } from '@strapi/helper-plugin'; +import flatMap from 'lodash/flatMap'; +import uniq from 'lodash/uniq'; const getFieldsActionMatchingPermissions = (userPermissions, slug) => { const getMatchingPermissions = (action) => { diff --git a/packages/core/admin/admin/src/content-manager/pages/EditView/utils/index.js b/packages/core/admin/admin/src/content-manager/pages/EditView/utils/index.js index c408b5b3a4..3eb59a7ca3 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditView/utils/index.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditView/utils/index.js @@ -1,4 +1,4 @@ // eslint-disable-next-line import/prefer-default-export export { default as createAttributesLayout } from './createAttributesLayout'; -export { default as getFieldsActionMatchingPermissions } from './getFieldsActionMatchingPermissions'; export { default as getCustomFieldUidsFromLayout } from './getCustomFieldUidsFromLayout'; +export { default as getFieldsActionMatchingPermissions } from './getFieldsActionMatchingPermissions'; diff --git a/packages/core/admin/admin/src/content-manager/pages/EditView/utils/tests/getFieldsActionMatchingPermissions.test.js b/packages/core/admin/admin/src/content-manager/pages/EditView/utils/tests/getFieldsActionMatchingPermissions.test.js index cc5f14d49a..b90b4cf2ea 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditView/utils/tests/getFieldsActionMatchingPermissions.test.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditView/utils/tests/getFieldsActionMatchingPermissions.test.js @@ -1,5 +1,5 @@ -import getFieldsActionMatchingPermissions from '../getFieldsActionMatchingPermissions'; import { permissions } from '../../../../testUtils'; +import getFieldsActionMatchingPermissions from '../getFieldsActionMatchingPermissions'; describe('CONTENT MANAGER | CONTAINERS | EditView | utils | getFieldsActionMatchingPermissions', () => { it('should return an object with all the allowed action for the fields', () => { diff --git a/packages/core/admin/admin/src/content-manager/pages/EditViewLayoutManager/Permissions.js b/packages/core/admin/admin/src/content-manager/pages/EditViewLayoutManager/Permissions.js index fefbe2629b..2ea49049e1 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditViewLayoutManager/Permissions.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditViewLayoutManager/Permissions.js @@ -1,9 +1,11 @@ import React, { memo, useMemo } from 'react'; -import PropTypes from 'prop-types'; -import { useRBAC, LoadingIndicatorPage } from '@strapi/helper-plugin'; + +import { LoadingIndicatorPage, useRBAC } from '@strapi/helper-plugin'; import isEqual from 'lodash/isEqual'; -import EditView from '../EditView'; +import PropTypes from 'prop-types'; + import { generatePermissionsObject } from '../../utils'; +import EditView from '../EditView'; const Permissions = (props) => { const viewPermissions = useMemo(() => generatePermissionsObject(props.slug), [props.slug]); diff --git a/packages/core/admin/admin/src/content-manager/pages/EditViewLayoutManager/index.js b/packages/core/admin/admin/src/content-manager/pages/EditViewLayoutManager/index.js index 89bfe81446..c811983301 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditViewLayoutManager/index.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditViewLayoutManager/index.js @@ -1,12 +1,15 @@ import React, { useEffect } from 'react'; + +import { LoadingIndicatorPage, useQueryParams, useStrapiApp } from '@strapi/helper-plugin'; import PropTypes from 'prop-types'; import { useDispatch, useSelector } from 'react-redux'; -import { LoadingIndicatorPage, useQueryParams, useStrapiApp } from '@strapi/helper-plugin'; + import { MUTATE_EDIT_VIEW_LAYOUT } from '../../../exposedHooks'; import { useSyncRbac } from '../../hooks'; + import { resetProps, setLayout } from './actions'; -import selectLayout from './selectors'; import Permissions from './Permissions'; +import selectLayout from './selectors'; const EditViewLayoutManager = ({ layout, ...rest }) => { const currentLayout = useSelector(selectLayout); diff --git a/packages/core/admin/admin/src/content-manager/pages/EditViewLayoutManager/reducer.js b/packages/core/admin/admin/src/content-manager/pages/EditViewLayoutManager/reducer.js index d37d87e4c2..775a60b5fe 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditViewLayoutManager/reducer.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditViewLayoutManager/reducer.js @@ -4,6 +4,7 @@ */ import produce from 'immer'; + import { RESET_PROPS, SET_LAYOUT } from './constants'; export const initialState = { diff --git a/packages/core/admin/admin/src/content-manager/pages/ListSettingsView/components/DraggableCard.js b/packages/core/admin/admin/src/content-manager/pages/ListSettingsView/components/DraggableCard.js index da97957363..9f734d10b8 100644 --- a/packages/core/admin/admin/src/content-manager/pages/ListSettingsView/components/DraggableCard.js +++ b/packages/core/admin/admin/src/content-manager/pages/ListSettingsView/components/DraggableCard.js @@ -1,14 +1,15 @@ import React, { useEffect, useRef, useState } from 'react'; -import styled from 'styled-components'; + +import { Box, Flex, Typography } from '@strapi/design-system'; +import { Cross, Drag, Pencil } from '@strapi/icons'; import PropTypes from 'prop-types'; import { useDrag, useDrop } from 'react-dnd'; import { getEmptyImage } from 'react-dnd-html5-backend'; import { useIntl } from 'react-intl'; -import { Flex, Box, Typography } from '@strapi/design-system'; -import { Pencil, Cross, Drag } from '@strapi/icons'; +import styled from 'styled-components'; -import { CardDragPreview } from '../../App/components/CardDragPreview'; import { getTrad, ItemTypes } from '../../../utils'; +import { CardDragPreview } from '../../App/components/CardDragPreview'; const ActionButton = styled.button` display: flex; diff --git a/packages/core/admin/admin/src/content-manager/pages/ListSettingsView/components/EditFieldForm.js b/packages/core/admin/admin/src/content-manager/pages/ListSettingsView/components/EditFieldForm.js index 9e85d41342..d9456e0390 100644 --- a/packages/core/admin/admin/src/content-manager/pages/ListSettingsView/components/EditFieldForm.js +++ b/packages/core/admin/admin/src/content-manager/pages/ListSettingsView/components/EditFieldForm.js @@ -1,23 +1,25 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import { useIntl } from 'react-intl'; -import upperFirst from 'lodash/upperFirst'; -import styled from 'styled-components'; + import { - ModalLayout, - ModalHeader, - ModalFooter, - ModalBody, - Typography, Button, Flex, Grid, GridItem, + ModalBody, + ModalFooter, + ModalHeader, + ModalLayout, TextInput, ToggleInput, + Typography, } from '@strapi/design-system'; -import { getTrad } from '../../../utils'; +import upperFirst from 'lodash/upperFirst'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import styled from 'styled-components'; + import FieldTypeIcon from '../../../components/FieldTypeIcon'; +import { getTrad } from '../../../utils'; const HeaderContainer = styled(Flex)` svg { diff --git a/packages/core/admin/admin/src/content-manager/pages/ListSettingsView/components/Settings.js b/packages/core/admin/admin/src/content-manager/pages/ListSettingsView/components/Settings.js index 9140c52332..e301e0d4fd 100644 --- a/packages/core/admin/admin/src/content-manager/pages/ListSettingsView/components/Settings.js +++ b/packages/core/admin/admin/src/content-manager/pages/ListSettingsView/components/Settings.js @@ -1,16 +1,18 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import { useIntl } from 'react-intl'; + import { Box, + Flex, Grid, GridItem, - Select, Option, + Select, ToggleInput, Typography, - Flex, } from '@strapi/design-system'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; + import { getTrad } from '../../../utils'; const Settings = ({ modifiedData, onChange, sortOptions }) => { diff --git a/packages/core/admin/admin/src/content-manager/pages/ListSettingsView/components/SortDisplayedFields.js b/packages/core/admin/admin/src/content-manager/pages/ListSettingsView/components/SortDisplayedFields.js index 4bf99efa53..d94c03ac10 100644 --- a/packages/core/admin/admin/src/content-manager/pages/ListSettingsView/components/SortDisplayedFields.js +++ b/packages/core/admin/admin/src/content-manager/pages/ListSettingsView/components/SortDisplayedFields.js @@ -1,12 +1,15 @@ -import React, { useState, useRef, useEffect } from 'react'; -import styled from 'styled-components'; +import React, { useEffect, useRef, useState } from 'react'; + +import { Box, Flex, IconButton, MenuItem, SimpleMenu, Typography } from '@strapi/design-system'; +import { Plus } from '@strapi/icons'; import { PropTypes } from 'prop-types'; import { useIntl } from 'react-intl'; -import { Box, Flex, Typography, SimpleMenu, MenuItem, IconButton } from '@strapi/design-system'; -import { Plus } from '@strapi/icons'; -import DraggableCard from './DraggableCard'; +import styled from 'styled-components'; + import { getTrad } from '../../../utils'; +import DraggableCard from './DraggableCard'; + const FlexWrapper = styled(Box)` flex: ${({ size }) => size}; `; diff --git a/packages/core/admin/admin/src/content-manager/pages/ListSettingsView/index.js b/packages/core/admin/admin/src/content-manager/pages/ListSettingsView/index.js index b23d6e5032..1ed1cbfc96 100644 --- a/packages/core/admin/admin/src/content-manager/pages/ListSettingsView/index.js +++ b/packages/core/admin/admin/src/content-manager/pages/ListSettingsView/index.js @@ -1,40 +1,42 @@ import React, { memo, useContext, useReducer, useState } from 'react'; -import PropTypes from 'prop-types'; -import { useMutation } from 'react-query'; -import isEqual from 'lodash/isEqual'; -import upperFirst from 'lodash/upperFirst'; -import pick from 'lodash/pick'; -import get from 'lodash/get'; -import isEmpty from 'lodash/isEmpty'; -import { stringify } from 'qs'; + +import { + Box, + Button, + ContentLayout, + Divider, + HeaderLayout, + Layout, + Main, +} from '@strapi/design-system'; import { - useNotification, - useTracking, ConfirmDialog, Link, useFetchClient, + useNotification, + useTracking, } from '@strapi/helper-plugin'; +import { ArrowLeft, Check } from '@strapi/icons'; +import get from 'lodash/get'; +import isEmpty from 'lodash/isEmpty'; +import isEqual from 'lodash/isEqual'; +import pick from 'lodash/pick'; +import upperFirst from 'lodash/upperFirst'; +import PropTypes from 'prop-types'; +import { stringify } from 'qs'; import { useIntl } from 'react-intl'; -import { - Box, - Divider, - Layout, - HeaderLayout, - ContentLayout, - Main, - Button, -} from '@strapi/design-system'; -import { Check, ArrowLeft } from '@strapi/icons'; +import { useMutation } from 'react-query'; -import { checkIfAttributeIsDisplayable, getTrad } from '../../utils'; import ModelsContext from '../../contexts/ModelsContext'; import { usePluginsQueryParams } from '../../hooks'; +import { checkIfAttributeIsDisplayable, getTrad } from '../../utils'; + +import EditFieldForm from './components/EditFieldForm'; import Settings from './components/Settings'; import SortDisplayedFields from './components/SortDisplayedFields'; -import EditFieldForm from './components/EditFieldForm'; +import { EXCLUDED_SORT_ATTRIBUTE_TYPES } from './constants'; import init from './init'; import reducer, { initialState } from './reducer'; -import { EXCLUDED_SORT_ATTRIBUTE_TYPES } from './constants'; const ListSettingsView = ({ layout, slug }) => { const { put } = useFetchClient(); diff --git a/packages/core/admin/admin/src/content-manager/pages/ListSettingsView/reducer.js b/packages/core/admin/admin/src/content-manager/pages/ListSettingsView/reducer.js index cb9d38ef12..b2ffb191f4 100644 --- a/packages/core/admin/admin/src/content-manager/pages/ListSettingsView/reducer.js +++ b/packages/core/admin/admin/src/content-manager/pages/ListSettingsView/reducer.js @@ -1,6 +1,7 @@ import produce from 'immer'; // current -import set from 'lodash/set'; import get from 'lodash/get'; +import set from 'lodash/set'; + import { arrayMoveItem } from '../../utils'; const initialState = { diff --git a/packages/core/admin/admin/src/content-manager/pages/ListSettingsView/tests/index.test.js b/packages/core/admin/admin/src/content-manager/pages/ListSettingsView/tests/index.test.js index 08a8819a8c..ac966c09b6 100644 --- a/packages/core/admin/admin/src/content-manager/pages/ListSettingsView/tests/index.test.js +++ b/packages/core/admin/admin/src/content-manager/pages/ListSettingsView/tests/index.test.js @@ -1,14 +1,16 @@ import React from 'react'; -import { act, render, waitFor, screen, fireEvent } from '@testing-library/react'; -import { Router } from 'react-router-dom'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { act, fireEvent, render, screen, waitFor } from '@testing-library/react'; import { createMemoryHistory } from 'history'; -import { IntlProvider } from 'react-intl'; -import { QueryClient, QueryClientProvider } from 'react-query'; import { DndProvider } from 'react-dnd'; import { HTML5Backend } from 'react-dnd-html5-backend'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import ListSettingsView from '../index'; +import { IntlProvider } from 'react-intl'; +import { QueryClient, QueryClientProvider } from 'react-query'; +import { Router } from 'react-router-dom'; + import ModelsContext from '../../../contexts/ModelsContext'; +import ListSettingsView from '../index'; jest.mock('@strapi/helper-plugin', () => ({ ...jest.requireActual('@strapi/helper-plugin'), diff --git a/packages/core/admin/admin/src/content-manager/pages/ListView/FieldPicker/index.js b/packages/core/admin/admin/src/content-manager/pages/ListView/FieldPicker/index.js index 0fe4b373f7..afc474ca9d 100644 --- a/packages/core/admin/admin/src/content-manager/pages/ListView/FieldPicker/index.js +++ b/packages/core/admin/admin/src/content-manager/pages/ListView/FieldPicker/index.js @@ -1,13 +1,16 @@ import React, { memo } from 'react'; -import PropTypes from 'prop-types'; -import { useDispatch, useSelector } from 'react-redux'; -import { useIntl } from 'react-intl'; -import { Select, Option, Box } from '@strapi/design-system'; + +import { Box, Option, Select } from '@strapi/design-system'; import { useTracking } from '@strapi/helper-plugin'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import { useDispatch, useSelector } from 'react-redux'; + +import getTrad from '../../../utils/getTrad'; import { onChangeListHeaders } from '../actions'; import { selectDisplayedHeaders } from '../selectors'; + import getAllAllowedHeaders from './utils/getAllAllowedHeader'; -import getTrad from '../../../utils/getTrad'; const FieldPicker = ({ layout }) => { const dispatch = useDispatch(); diff --git a/packages/core/admin/admin/src/content-manager/pages/ListView/PaginationFooter/index.js b/packages/core/admin/admin/src/content-manager/pages/ListView/PaginationFooter/index.js index f613b47de7..c1fa281ee1 100644 --- a/packages/core/admin/admin/src/content-manager/pages/ListView/PaginationFooter/index.js +++ b/packages/core/admin/admin/src/content-manager/pages/ListView/PaginationFooter/index.js @@ -1,7 +1,8 @@ import React from 'react'; -import PropTypes from 'prop-types'; + import { Box, Flex } from '@strapi/design-system'; -import { PaginationURLQuery, PageSizeURLQuery } from '@strapi/helper-plugin'; +import { PageSizeURLQuery, PaginationURLQuery } from '@strapi/helper-plugin'; +import PropTypes from 'prop-types'; const PaginationFooter = ({ pagination }) => { return ( diff --git a/packages/core/admin/admin/src/content-manager/pages/ListView/index.js b/packages/core/admin/admin/src/content-manager/pages/ListView/index.js index 6202a8c4d7..a975000e89 100644 --- a/packages/core/admin/admin/src/content-manager/pages/ListView/index.js +++ b/packages/core/admin/admin/src/content-manager/pages/ListView/index.js @@ -1,54 +1,50 @@ import React, { memo, useCallback, useEffect, useRef } from 'react'; -import PropTypes from 'prop-types'; -import styled from 'styled-components'; -import { connect } from 'react-redux'; -import isEqual from 'lodash/isEqual'; -import { bindActionCreators, compose } from 'redux'; -import { useIntl } from 'react-intl'; -import { useHistory, useLocation, Link as ReactRouterLink } from 'react-router-dom'; -import { stringify } from 'qs'; -import axios from 'axios'; import { - NoPermissions, - CheckPermissions, - SearchURLQuery, - useFetchClient, - useFocusWhenNavigate, - useQueryParams, - useNotification, - useRBACProvider, - useTracking, - Link, - useAPIErrorHandler, - getYupInnerErrors, -} from '@strapi/helper-plugin'; - -import { - IconButton, - Main, - Box, ActionLayout, + Box, + Button, ContentLayout, HeaderLayout, + IconButton, + Main, useNotifyAT, - Button, } from '@strapi/design-system'; - -import { ArrowLeft, Plus, Cog } from '@strapi/icons'; +import { + CheckPermissions, + getYupInnerErrors, + Link, + NoPermissions, + SearchURLQuery, + useAPIErrorHandler, + useFetchClient, + useFocusWhenNavigate, + useNotification, + useQueryParams, + useRBACProvider, + useTracking, +} from '@strapi/helper-plugin'; +import { ArrowLeft, Cog, Plus } from '@strapi/icons'; +import axios from 'axios'; +import isEqual from 'lodash/isEqual'; +import PropTypes from 'prop-types'; +import { stringify } from 'qs'; +import { useIntl } from 'react-intl'; import { useMutation } from 'react-query'; - -import DynamicTable from '../../components/DynamicTable'; -import AttributeFilter from '../../components/AttributeFilter'; -import { InjectionZone } from '../../../shared/components'; +import { connect } from 'react-redux'; +import { Link as ReactRouterLink, useHistory, useLocation } from 'react-router-dom'; +import { bindActionCreators, compose } from 'redux'; +import styled from 'styled-components'; import permissions from '../../../permissions'; - +import { InjectionZone } from '../../../shared/components'; +import AttributeFilter from '../../components/AttributeFilter'; +import DynamicTable from '../../components/DynamicTable'; import { createYupSchema, getRequestUrl, getTrad } from '../../utils'; +import { getData, getDataSucceeded, onChangeListHeaders, onResetListHeaders } from './actions'; import FieldPicker from './FieldPicker'; import PaginationFooter from './PaginationFooter'; -import { getData, getDataSucceeded, onChangeListHeaders, onResetListHeaders } from './actions'; import makeSelectListView from './selectors'; import { buildQueryString } from './utils'; diff --git a/packages/core/admin/admin/src/content-manager/pages/ListView/reducer.js b/packages/core/admin/admin/src/content-manager/pages/ListView/reducer.js index 566881165c..61f32dc7e8 100644 --- a/packages/core/admin/admin/src/content-manager/pages/ListView/reducer.js +++ b/packages/core/admin/admin/src/content-manager/pages/ListView/reducer.js @@ -5,12 +5,13 @@ import produce from 'immer'; import get from 'lodash/get'; + import { GET_DATA, GET_DATA_SUCCEEDED, - RESET_PROPS, ON_CHANGE_LIST_HEADERS, ON_RESET_LIST_HEADERS, + RESET_PROPS, SET_LIST_LAYOUT, } from './constants'; diff --git a/packages/core/admin/admin/src/content-manager/pages/ListView/selectors.js b/packages/core/admin/admin/src/content-manager/pages/ListView/selectors.js index 96f4406423..b7e1cf7e76 100644 --- a/packages/core/admin/admin/src/content-manager/pages/ListView/selectors.js +++ b/packages/core/admin/admin/src/content-manager/pages/ListView/selectors.js @@ -1,4 +1,5 @@ import { createSelector } from 'reselect'; + import { initialState } from './reducer'; /** diff --git a/packages/core/admin/admin/src/content-manager/pages/ListView/tests/reducer.test.js b/packages/core/admin/admin/src/content-manager/pages/ListView/tests/reducer.test.js index 6585646e87..06eaaa5509 100644 --- a/packages/core/admin/admin/src/content-manager/pages/ListView/tests/reducer.test.js +++ b/packages/core/admin/admin/src/content-manager/pages/ListView/tests/reducer.test.js @@ -1,6 +1,6 @@ import produce from 'immer'; -import { getData, getDataSucceeded } from '../actions'; +import { getData, getDataSucceeded } from '../actions'; import reducer from '../reducer'; describe('CONTENT MANAGER | CONTAINERS | ListView | reducer', () => { diff --git a/packages/core/admin/admin/src/content-manager/pages/ListView/utils/buildQueryString.js b/packages/core/admin/admin/src/content-manager/pages/ListView/utils/buildQueryString.js index 68981a6356..6fe2ad8f3b 100644 --- a/packages/core/admin/admin/src/content-manager/pages/ListView/utils/buildQueryString.js +++ b/packages/core/admin/admin/src/content-manager/pages/ListView/utils/buildQueryString.js @@ -1,5 +1,6 @@ -import { stringify } from 'qs'; import set from 'lodash/set'; +import { stringify } from 'qs'; + import createPluginsFilter from './createPluginsFilter'; /** diff --git a/packages/core/admin/admin/src/content-manager/pages/ListViewLayoutManager/Permissions.js b/packages/core/admin/admin/src/content-manager/pages/ListViewLayoutManager/Permissions.js index 5038761b57..fbee02b5dc 100644 --- a/packages/core/admin/admin/src/content-manager/pages/ListViewLayoutManager/Permissions.js +++ b/packages/core/admin/admin/src/content-manager/pages/ListViewLayoutManager/Permissions.js @@ -1,9 +1,10 @@ import React, { memo, useMemo } from 'react'; -import PropTypes from 'prop-types'; -import { useRBAC, LoadingIndicatorPage, difference } from '@strapi/helper-plugin'; -import ListView from '../ListView'; +import { difference, LoadingIndicatorPage, useRBAC } from '@strapi/helper-plugin'; +import PropTypes from 'prop-types'; + import { generatePermissionsObject } from '../../utils'; +import ListView from '../ListView'; const Permissions = (props) => { const viewPermissions = useMemo(() => generatePermissionsObject(props.slug), [props.slug]); diff --git a/packages/core/admin/admin/src/content-manager/pages/ListViewLayoutManager/index.js b/packages/core/admin/admin/src/content-manager/pages/ListViewLayoutManager/index.js index ffcc1c7876..870de7b975 100644 --- a/packages/core/admin/admin/src/content-manager/pages/ListViewLayoutManager/index.js +++ b/packages/core/admin/admin/src/content-manager/pages/ListViewLayoutManager/index.js @@ -1,10 +1,13 @@ import React, { useEffect } from 'react'; -import { useDispatch } from 'react-redux'; -import PropTypes from 'prop-types'; -import { useHistory } from 'react-router-dom'; + import { useQueryParams } from '@strapi/helper-plugin'; +import PropTypes from 'prop-types'; +import { useDispatch } from 'react-redux'; +import { useHistory } from 'react-router-dom'; + import { useFindRedirectionLink, useSyncRbac } from '../../hooks'; import { resetProps, setLayout } from '../ListView/actions'; + import Permissions from './Permissions'; const ListViewLayout = ({ layout, ...props }) => { diff --git a/packages/core/admin/admin/src/content-manager/pages/NoContentType/index.js b/packages/core/admin/admin/src/content-manager/pages/NoContentType/index.js index 4094837610..117c8e46a8 100644 --- a/packages/core/admin/admin/src/content-manager/pages/NoContentType/index.js +++ b/packages/core/admin/admin/src/content-manager/pages/NoContentType/index.js @@ -1,8 +1,10 @@ import React from 'react'; -import { useFocusWhenNavigate, LinkButton } from '@strapi/helper-plugin'; -import { Main, ContentLayout, HeaderLayout, EmptyStateLayout } from '@strapi/design-system'; -import { Plus, EmptyDocuments } from '@strapi/icons'; + +import { ContentLayout, EmptyStateLayout, HeaderLayout, Main } from '@strapi/design-system'; +import { LinkButton, useFocusWhenNavigate } from '@strapi/helper-plugin'; +import { EmptyDocuments, Plus } from '@strapi/icons'; import { useIntl } from 'react-intl'; + import { getTrad } from '../../utils'; const NoContentType = () => { diff --git a/packages/core/admin/admin/src/content-manager/pages/NoContentType/tests/index.test.js b/packages/core/admin/admin/src/content-manager/pages/NoContentType/tests/index.test.js index f896175ae8..fca9b1786c 100644 --- a/packages/core/admin/admin/src/content-manager/pages/NoContentType/tests/index.test.js +++ b/packages/core/admin/admin/src/content-manager/pages/NoContentType/tests/index.test.js @@ -1,9 +1,11 @@ import React from 'react'; + +import { darkTheme, lightTheme } from '@strapi/design-system'; import { render } from '@testing-library/react'; +import { createMemoryHistory } from 'history'; import { IntlProvider } from 'react-intl'; import { Router } from 'react-router-dom'; -import { createMemoryHistory } from 'history'; -import { lightTheme, darkTheme } from '@strapi/design-system'; + import Theme from '../../../../components/Theme'; import ThemeToggleProvider from '../../../../components/ThemeToggleProvider'; import NoContentType from '../index'; diff --git a/packages/core/admin/admin/src/content-manager/pages/NoPermissions/index.js b/packages/core/admin/admin/src/content-manager/pages/NoPermissions/index.js index a15ba98d25..cf21c1d736 100644 --- a/packages/core/admin/admin/src/content-manager/pages/NoPermissions/index.js +++ b/packages/core/admin/admin/src/content-manager/pages/NoPermissions/index.js @@ -1,7 +1,9 @@ import React from 'react'; -import { useFocusWhenNavigate, NoPermissions as NoPermissionsCompo } from '@strapi/helper-plugin'; -import { Main, ContentLayout, HeaderLayout } from '@strapi/design-system'; + +import { ContentLayout, HeaderLayout, Main } from '@strapi/design-system'; +import { NoPermissions as NoPermissionsCompo, useFocusWhenNavigate } from '@strapi/helper-plugin'; import { useIntl } from 'react-intl'; + import { getTrad } from '../../utils'; const NoPermissions = () => { diff --git a/packages/core/admin/admin/src/content-manager/pages/NoPermissions/tests/index.test.js b/packages/core/admin/admin/src/content-manager/pages/NoPermissions/tests/index.test.js index c1c624b038..cb50174020 100644 --- a/packages/core/admin/admin/src/content-manager/pages/NoPermissions/tests/index.test.js +++ b/packages/core/admin/admin/src/content-manager/pages/NoPermissions/tests/index.test.js @@ -5,9 +5,11 @@ */ import React from 'react'; + +import { darkTheme, lightTheme } from '@strapi/design-system'; import { render } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; -import { lightTheme, darkTheme } from '@strapi/design-system'; + import Theme from '../../../../components/Theme'; import ThemeToggleProvider from '../../../../components/ThemeToggleProvider'; import NoPermissions from '../index'; diff --git a/packages/core/admin/admin/src/content-manager/pages/SingleTypeRecursivePath/index.js b/packages/core/admin/admin/src/content-manager/pages/SingleTypeRecursivePath/index.js index cca5838216..f13304e8b4 100644 --- a/packages/core/admin/admin/src/content-manager/pages/SingleTypeRecursivePath/index.js +++ b/packages/core/admin/admin/src/content-manager/pages/SingleTypeRecursivePath/index.js @@ -1,13 +1,15 @@ import React, { memo, useMemo } from 'react'; -import { Switch, Route } from 'react-router-dom'; + +import { CheckPagePermissions, LoadingIndicatorPage } from '@strapi/helper-plugin'; import PropTypes from 'prop-types'; -import { LoadingIndicatorPage, CheckPagePermissions } from '@strapi/helper-plugin'; +import { Route, Switch } from 'react-router-dom'; + import permissions from '../../../permissions'; import { ContentTypeLayoutContext } from '../../contexts'; import { useFetchContentTypeLayout } from '../../hooks'; import { formatLayoutToApi } from '../../utils'; -import EditViewLayoutManager from '../EditViewLayoutManager'; import EditSettingsView from '../EditSettingsView'; +import EditViewLayoutManager from '../EditViewLayoutManager'; const cmPermissions = permissions.contentManager; diff --git a/packages/core/admin/admin/src/content-manager/sharedReducers/crudReducer/actions.js b/packages/core/admin/admin/src/content-manager/sharedReducers/crudReducer/actions.js index 6ab1651c05..bccfd30ac2 100644 --- a/packages/core/admin/admin/src/content-manager/sharedReducers/crudReducer/actions.js +++ b/packages/core/admin/admin/src/content-manager/sharedReducers/crudReducer/actions.js @@ -1,4 +1,5 @@ import { + CLEAR_SET_MODIFIED_DATA_ONLY, GET_DATA, GET_DATA_SUCCEEDED, INIT_FORM, @@ -6,7 +7,6 @@ import { SET_DATA_STRUCTURES, SET_STATUS, SUBMIT_SUCCEEDED, - CLEAR_SET_MODIFIED_DATA_ONLY, } from './constants'; export const getData = () => { diff --git a/packages/core/admin/admin/src/content-manager/sharedReducers/crudReducer/reducer.js b/packages/core/admin/admin/src/content-manager/sharedReducers/crudReducer/reducer.js index ba6d2106b1..1fc2d508d6 100644 --- a/packages/core/admin/admin/src/content-manager/sharedReducers/crudReducer/reducer.js +++ b/packages/core/admin/admin/src/content-manager/sharedReducers/crudReducer/reducer.js @@ -6,7 +6,6 @@ import produce from 'immer'; // and force us to either disable the linter for the hooks dependencies array rule or // require us to add the dispatch to the array wich is not wanted. This refacto does not require us to // to do any of this. - import { CLEAR_SET_MODIFIED_DATA_ONLY, GET_DATA, diff --git a/packages/core/admin/admin/src/content-manager/sharedReducers/crudReducer/tests/crudReducer.test.js b/packages/core/admin/admin/src/content-manager/sharedReducers/crudReducer/tests/crudReducer.test.js index df6a724ba5..688f8b3d29 100644 --- a/packages/core/admin/admin/src/content-manager/sharedReducers/crudReducer/tests/crudReducer.test.js +++ b/packages/core/admin/admin/src/content-manager/sharedReducers/crudReducer/tests/crudReducer.test.js @@ -1,4 +1,5 @@ import produce from 'immer'; + import { GET_DATA, GET_DATA_SUCCEEDED, diff --git a/packages/core/admin/admin/src/content-manager/testUtils/index.js b/packages/core/admin/admin/src/content-manager/testUtils/index.js index 7af64950a3..bf330bd6b4 100644 --- a/packages/core/admin/admin/src/content-manager/testUtils/index.js +++ b/packages/core/admin/admin/src/content-manager/testUtils/index.js @@ -1,3 +1,3 @@ import testData, { permissions } from './data'; -export { testData, permissions }; +export { permissions, testData }; diff --git a/packages/core/admin/admin/src/content-manager/utils/index.js b/packages/core/admin/admin/src/content-manager/utils/index.js index d7acba69a7..299703b1ab 100644 --- a/packages/core/admin/admin/src/content-manager/utils/index.js +++ b/packages/core/admin/admin/src/content-manager/utils/index.js @@ -1,22 +1,15 @@ export { default as arrayMoveItem } from './arrayMoveItem'; - export { default as checkIfAttributeIsDisplayable } from './checkIfAttributeIsDisplayable'; export { composeRefs } from './composeRefs'; export { default as createDefaultForm } from './createDefaultForm'; - export { default as formatLayoutToApi } from './formatLayoutToApi'; - export { default as generatePermissionsObject } from './generatePermissionsObject'; export { default as getFieldName } from './getFieldName'; export { default as getMaxTempKey } from './getMaxTempKey'; export { default as getRequestUrl } from './getRequestUrl'; export { default as getTrad } from './getTrad'; - export { default as ItemTypes } from './ItemTypes'; - export { default as mergeMetasWithSchema } from './mergeMetasWithSchema'; - export { default as removeKeyInObject } from './removeKeyInObject'; export { default as removePasswordFieldsFromData } from './removePasswordFieldsFromData'; - export { default as createYupSchema } from './schema'; diff --git a/packages/core/admin/admin/src/content-manager/utils/removePasswordFieldsFromData.js b/packages/core/admin/admin/src/content-manager/utils/removePasswordFieldsFromData.js index 39bd8a5011..850142efb4 100644 --- a/packages/core/admin/admin/src/content-manager/utils/removePasswordFieldsFromData.js +++ b/packages/core/admin/admin/src/content-manager/utils/removePasswordFieldsFromData.js @@ -1,5 +1,5 @@ +import { getOtherInfos, getType } from '@strapi/helper-plugin'; import get from 'lodash/get'; -import { getType, getOtherInfos } from '@strapi/helper-plugin'; const removePasswordFieldsFromData = (data, contentTypeSchema, componentSchema) => { const recursiveCleanData = (data, schema) => { diff --git a/packages/core/admin/admin/src/content-manager/utils/schema.js b/packages/core/admin/admin/src/content-manager/utils/schema.js index d58e4bdd50..a42e2b4c6d 100644 --- a/packages/core/admin/admin/src/content-manager/utils/schema.js +++ b/packages/core/admin/admin/src/content-manager/utils/schema.js @@ -1,11 +1,10 @@ +import { translatedErrors as errorsTrads } from '@strapi/helper-plugin'; import get from 'lodash/get'; import isBoolean from 'lodash/isBoolean'; import isEmpty from 'lodash/isEmpty'; import isNaN from 'lodash/isNaN'; import toNumber from 'lodash/toNumber'; - import * as yup from 'yup'; -import { translatedErrors as errorsTrads } from '@strapi/helper-plugin'; import isFieldTypeNumber from './isFieldTypeNumber'; diff --git a/packages/core/admin/admin/src/contexts/ApiTokenPermissions/index.js b/packages/core/admin/admin/src/contexts/ApiTokenPermissions/index.js index 3697825046..e41506aae4 100644 --- a/packages/core/admin/admin/src/contexts/ApiTokenPermissions/index.js +++ b/packages/core/admin/admin/src/contexts/ApiTokenPermissions/index.js @@ -1,4 +1,5 @@ import React, { createContext, useContext } from 'react'; + import PropTypes from 'prop-types'; const ApiTokenPermissionsContext = createContext({}); diff --git a/packages/core/admin/admin/src/contexts/MarketPlace/index.js b/packages/core/admin/admin/src/contexts/MarketPlace/index.js index 830222b934..30b2b9370b 100644 --- a/packages/core/admin/admin/src/contexts/MarketPlace/index.js +++ b/packages/core/admin/admin/src/contexts/MarketPlace/index.js @@ -1,4 +1,5 @@ import React, { createContext, useContext } from 'react'; + import PropTypes from 'prop-types'; const MarketPlaceContext = createContext({}); diff --git a/packages/core/admin/admin/src/core/apis/index.js b/packages/core/admin/admin/src/core/apis/index.js index 621ebdf8d9..cd77555b27 100644 --- a/packages/core/admin/admin/src/core/apis/index.js +++ b/packages/core/admin/admin/src/core/apis/index.js @@ -1,6 +1,6 @@ -export { default as Fields } from './Fields'; export { default as Components } from './Components'; +export { default as customFields } from './CustomFields'; +export { default as Fields } from './Fields'; export { default as Middlewares } from './Middlewares'; export { default as Plugin } from './Plugin'; export { default as Reducers } from './Reducers'; -export { default as customFields } from './CustomFields'; diff --git a/packages/core/admin/admin/src/core/store/configureStore.js b/packages/core/admin/admin/src/core/store/configureStore.js index a25be1a4f5..f881dbebcf 100644 --- a/packages/core/admin/admin/src/core/store/configureStore.js +++ b/packages/core/admin/admin/src/core/store/configureStore.js @@ -1,4 +1,4 @@ -import { createStore, applyMiddleware, compose, combineReducers } from 'redux'; +import { applyMiddleware, combineReducers, compose, createStore } from 'redux'; const configureStore = (appMiddlewares, appReducers) => { let composeEnhancers = compose; diff --git a/packages/core/admin/admin/src/hooks/index.js b/packages/core/admin/admin/src/hooks/index.js index c740cd9d75..d315aac478 100644 --- a/packages/core/admin/admin/src/hooks/index.js +++ b/packages/core/admin/admin/src/hooks/index.js @@ -2,13 +2,13 @@ export { default as useConfigurations } from './useConfigurations'; export { useContentTypes } from './useContentTypes'; export { default as useFetchPermissionsLayout } from './useFetchPermissionsLayout'; export { default as useFetchRole } from './useFetchRole'; -export { default as useMenu } from './useMenu'; -export { default as useRolesList } from './useRolesList'; -export { default as useSettingsMenu } from './useSettingsMenu'; -export { default as useSettingsForm } from './useSettingsForm'; -export { default as usePermissionsDataManager } from './usePermissionsDataManager'; -export { default as useReleaseNotification } from './useReleaseNotification'; -export { default as useThemeToggle } from './useThemeToggle'; -export { default as useRegenerate } from './useRegenerate'; -export { default as useLicenseLimit } from './useLicenseLimits'; export { default as useLicenseLimitNotification } from './useLicenseLimitNotification'; +export { default as useLicenseLimit } from './useLicenseLimits'; +export { default as useMenu } from './useMenu'; +export { default as usePermissionsDataManager } from './usePermissionsDataManager'; +export { default as useRegenerate } from './useRegenerate'; +export { default as useReleaseNotification } from './useReleaseNotification'; +export { default as useRolesList } from './useRolesList'; +export { default as useSettingsForm } from './useSettingsForm'; +export { default as useSettingsMenu } from './useSettingsMenu'; +export { default as useThemeToggle } from './useThemeToggle'; diff --git a/packages/core/admin/admin/src/hooks/marketplace/useFetchMarketplacePlugins/index.js b/packages/core/admin/admin/src/hooks/marketplace/useFetchMarketplacePlugins/index.js index 75a39fd7cb..5731e6dc97 100644 --- a/packages/core/admin/admin/src/hooks/marketplace/useFetchMarketplacePlugins/index.js +++ b/packages/core/admin/admin/src/hooks/marketplace/useFetchMarketplacePlugins/index.js @@ -1,6 +1,7 @@ -import { useQuery } from 'react-query'; import { useNotification } from '@strapi/helper-plugin'; import qs from 'qs'; +import { useQuery } from 'react-query'; + import { MARKETPLACE_API_URL } from '../constants'; const fetchMarketplacePlugins = async (params = {}) => { diff --git a/packages/core/admin/admin/src/hooks/marketplace/useFetchMarketplaceProviders/index.js b/packages/core/admin/admin/src/hooks/marketplace/useFetchMarketplaceProviders/index.js index bb67bc83c8..613ddce059 100644 --- a/packages/core/admin/admin/src/hooks/marketplace/useFetchMarketplaceProviders/index.js +++ b/packages/core/admin/admin/src/hooks/marketplace/useFetchMarketplaceProviders/index.js @@ -1,6 +1,7 @@ -import { useQuery } from 'react-query'; import { useNotification } from '@strapi/helper-plugin'; import qs from 'qs'; +import { useQuery } from 'react-query'; + import { MARKETPLACE_API_URL } from '../constants'; const fetchMarketplaceProviders = async (params = {}) => { diff --git a/packages/core/admin/admin/src/hooks/useAdminUsers/tests/useAdminUsers.test.js b/packages/core/admin/admin/src/hooks/useAdminUsers/tests/useAdminUsers.test.js index 4a465f10cf..d289c6d635 100644 --- a/packages/core/admin/admin/src/hooks/useAdminUsers/tests/useAdminUsers.test.js +++ b/packages/core/admin/admin/src/hooks/useAdminUsers/tests/useAdminUsers.test.js @@ -1,7 +1,8 @@ import * as React from 'react'; -import { setupServer } from 'msw/node'; -import { rest } from 'msw'; + import { renderHook, waitFor } from '@testing-library/react'; +import { rest } from 'msw'; +import { setupServer } from 'msw/node'; import { IntlProvider } from 'react-intl'; import { QueryClient, QueryClientProvider } from 'react-query'; diff --git a/packages/core/admin/admin/src/hooks/useAdminUsers/useAdminUsers.js b/packages/core/admin/admin/src/hooks/useAdminUsers/useAdminUsers.js index 89bd5e0547..6ee7e79693 100644 --- a/packages/core/admin/admin/src/hooks/useAdminUsers/useAdminUsers.js +++ b/packages/core/admin/admin/src/hooks/useAdminUsers/useAdminUsers.js @@ -1,6 +1,6 @@ -import { useQuery } from 'react-query'; import { useFetchClient } from '@strapi/helper-plugin'; import { stringify } from 'qs'; +import { useQuery } from 'react-query'; export function useAdminUsers(params = {}, queryOptions = {}) { const { id = '', ...queryParams } = params; diff --git a/packages/core/admin/admin/src/hooks/useConfigurations/index.js b/packages/core/admin/admin/src/hooks/useConfigurations/index.js index 2c276eed65..6ef64a6a56 100644 --- a/packages/core/admin/admin/src/hooks/useConfigurations/index.js +++ b/packages/core/admin/admin/src/hooks/useConfigurations/index.js @@ -1,4 +1,5 @@ import { useContext } from 'react'; + import { ConfigurationsContext } from '../../contexts'; const useConfigurations = () => { diff --git a/packages/core/admin/admin/src/hooks/useContentTypes/tests/index.test.js b/packages/core/admin/admin/src/hooks/useContentTypes/tests/index.test.js index 5eed3b6b58..5e9e3665c2 100644 --- a/packages/core/admin/admin/src/hooks/useContentTypes/tests/index.test.js +++ b/packages/core/admin/admin/src/hooks/useContentTypes/tests/index.test.js @@ -1,7 +1,8 @@ import * as React from 'react'; -import { setupServer } from 'msw/node'; -import { rest } from 'msw'; + import { renderHook, waitFor } from '@testing-library/react'; +import { rest } from 'msw'; +import { setupServer } from 'msw/node'; import { IntlProvider } from 'react-intl'; import { QueryClient, QueryClientProvider } from 'react-query'; diff --git a/packages/core/admin/admin/src/hooks/useDebounce/index.js b/packages/core/admin/admin/src/hooks/useDebounce/index.js index 34257f7879..a03e8f6290 100644 --- a/packages/core/admin/admin/src/hooks/useDebounce/index.js +++ b/packages/core/admin/admin/src/hooks/useDebounce/index.js @@ -1,4 +1,4 @@ -import { useState, useEffect } from 'react'; +import { useEffect, useState } from 'react'; const useDebounce = (value, delay) => { const [debouncedValue, setDebouncedValue] = useState(value); diff --git a/packages/core/admin/admin/src/hooks/useFetchEnabledPlugins/index.js b/packages/core/admin/admin/src/hooks/useFetchEnabledPlugins/index.js index fbf4d84ddf..2e43a0427e 100644 --- a/packages/core/admin/admin/src/hooks/useFetchEnabledPlugins/index.js +++ b/packages/core/admin/admin/src/hooks/useFetchEnabledPlugins/index.js @@ -1,5 +1,6 @@ -import { useQuery } from 'react-query'; import { useNotification } from '@strapi/helper-plugin'; +import { useQuery } from 'react-query'; + import { fetchEnabledPlugins } from './utils/api'; const useFetchEnabledPlugins = (notifyLoad) => { diff --git a/packages/core/admin/admin/src/hooks/useFetchPermissionsLayout/index.js b/packages/core/admin/admin/src/hooks/useFetchPermissionsLayout/index.js index e38f7fc9a0..5db7e0a78c 100644 --- a/packages/core/admin/admin/src/hooks/useFetchPermissionsLayout/index.js +++ b/packages/core/admin/admin/src/hooks/useFetchPermissionsLayout/index.js @@ -1,4 +1,5 @@ import { useEffect, useReducer } from 'react'; + import { useFetchClient } from '@strapi/helper-plugin'; import reducer, { initialState } from './reducer'; diff --git a/packages/core/admin/admin/src/hooks/useFetchRole/index.js b/packages/core/admin/admin/src/hooks/useFetchRole/index.js index 633126ee66..c50649fb65 100644 --- a/packages/core/admin/admin/src/hooks/useFetchRole/index.js +++ b/packages/core/admin/admin/src/hooks/useFetchRole/index.js @@ -1,5 +1,7 @@ -import { useCallback, useReducer, useEffect } from 'react'; +import { useCallback, useEffect, useReducer } from 'react'; + import { useFetchClient, useNotification } from '@strapi/helper-plugin'; + import reducer, { initialState } from './reducer'; const useFetchRole = (id) => { diff --git a/packages/core/admin/admin/src/hooks/useInjectReducer/tests/useInjectReducer.test.js b/packages/core/admin/admin/src/hooks/useInjectReducer/tests/useInjectReducer.test.js index 49292b1b09..4510852a39 100644 --- a/packages/core/admin/admin/src/hooks/useInjectReducer/tests/useInjectReducer.test.js +++ b/packages/core/admin/admin/src/hooks/useInjectReducer/tests/useInjectReducer.test.js @@ -1,6 +1,7 @@ import React from 'react'; -import { Provider } from 'react-redux'; + import { renderHook } from '@testing-library/react'; +import { Provider } from 'react-redux'; import configureStore from '../../../core/store/configureStore'; import { useInjectReducer } from '../useInjectReducer'; diff --git a/packages/core/admin/admin/src/hooks/useInjectReducer/useInjectReducer.js b/packages/core/admin/admin/src/hooks/useInjectReducer/useInjectReducer.js index 0229250ec5..6ada2674ba 100644 --- a/packages/core/admin/admin/src/hooks/useInjectReducer/useInjectReducer.js +++ b/packages/core/admin/admin/src/hooks/useInjectReducer/useInjectReducer.js @@ -1,4 +1,5 @@ import { useEffect } from 'react'; + import { useStore } from 'react-redux'; /** diff --git a/packages/core/admin/admin/src/hooks/useMenu/index.js b/packages/core/admin/admin/src/hooks/useMenu/index.js index 4bf7c5f5bf..f216f691fe 100644 --- a/packages/core/admin/admin/src/hooks/useMenu/index.js +++ b/packages/core/admin/admin/src/hooks/useMenu/index.js @@ -1,8 +1,10 @@ import { useEffect, useReducer, useRef } from 'react'; -import { useRBACProvider, useAppInfo, useStrapiApp } from '@strapi/helper-plugin'; -import getPluginSectionLinks from './utils/getPluginSectionLinks'; -import getGeneralLinks from './utils/getGeneralLinks'; + +import { useAppInfo, useRBACProvider, useStrapiApp } from '@strapi/helper-plugin'; + import reducer, { initialState } from './reducer'; +import getGeneralLinks from './utils/getGeneralLinks'; +import getPluginSectionLinks from './utils/getPluginSectionLinks'; const useMenu = () => { const [state, dispatch] = useReducer(reducer, initialState); diff --git a/packages/core/admin/admin/src/hooks/useMenu/reducer.js b/packages/core/admin/admin/src/hooks/useMenu/reducer.js index 77d27379e2..cbc9577d37 100644 --- a/packages/core/admin/admin/src/hooks/useMenu/reducer.js +++ b/packages/core/admin/admin/src/hooks/useMenu/reducer.js @@ -1,6 +1,7 @@ /* eslint-disable consistent-return */ -import produce from 'immer'; import { Cog, Puzzle, ShoppingCart } from '@strapi/icons'; +import produce from 'immer'; + import adminPermissions from '../../permissions'; const initialState = { diff --git a/packages/core/admin/admin/src/hooks/useMenu/utils/getGeneralLinks.js b/packages/core/admin/admin/src/hooks/useMenu/utils/getGeneralLinks.js index a7e30f8a01..7e1a37d7b1 100644 --- a/packages/core/admin/admin/src/hooks/useMenu/utils/getGeneralLinks.js +++ b/packages/core/admin/admin/src/hooks/useMenu/utils/getGeneralLinks.js @@ -1,4 +1,5 @@ import cloneDeep from 'lodash/cloneDeep'; + import checkPermissions from './checkPermissions'; const getGeneralLinks = async (permissions, generalSectionRawLinks, shouldUpdateStrapi) => { diff --git a/packages/core/admin/admin/src/hooks/useMenu/utils/tests/getGeneralLinks.test.js b/packages/core/admin/admin/src/hooks/useMenu/utils/tests/getGeneralLinks.test.js index 59f0f35245..1f58125c5b 100644 --- a/packages/core/admin/admin/src/hooks/useMenu/utils/tests/getGeneralLinks.test.js +++ b/packages/core/admin/admin/src/hooks/useMenu/utils/tests/getGeneralLinks.test.js @@ -1,4 +1,5 @@ import { hasPermissions } from '@strapi/helper-plugin'; + import getGeneralLinks from '../getGeneralLinks'; jest.mock('@strapi/helper-plugin', () => ({ diff --git a/packages/core/admin/admin/src/hooks/useNavigatorOnLine/tests/index.test.js b/packages/core/admin/admin/src/hooks/useNavigatorOnLine/tests/index.test.js index 353d6b9e65..4b08738f0a 100644 --- a/packages/core/admin/admin/src/hooks/useNavigatorOnLine/tests/index.test.js +++ b/packages/core/admin/admin/src/hooks/useNavigatorOnLine/tests/index.test.js @@ -1,4 +1,5 @@ -import { renderHook, act, waitFor } from '@testing-library/react'; +import { act, renderHook, waitFor } from '@testing-library/react'; + import useNavigatorOnLine from '../index'; describe('useNavigatorOnLine', () => { diff --git a/packages/core/admin/admin/src/hooks/usePermissionsDataManager/index.js b/packages/core/admin/admin/src/hooks/usePermissionsDataManager/index.js index de407e5227..39f4d2c5f7 100644 --- a/packages/core/admin/admin/src/hooks/usePermissionsDataManager/index.js +++ b/packages/core/admin/admin/src/hooks/usePermissionsDataManager/index.js @@ -1,4 +1,5 @@ import { useContext } from 'react'; + import { PermissionsDataManagerContext } from '../../contexts'; const usePermissionsDataManager = () => useContext(PermissionsDataManagerContext); diff --git a/packages/core/admin/admin/src/hooks/useRegenerate/index.js b/packages/core/admin/admin/src/hooks/useRegenerate/index.js index bb64fbd436..b8b7e34285 100644 --- a/packages/core/admin/admin/src/hooks/useRegenerate/index.js +++ b/packages/core/admin/admin/src/hooks/useRegenerate/index.js @@ -1,5 +1,6 @@ import { useState } from 'react'; -import { useFetchClient, useNotification, useAPIErrorHandler } from '@strapi/helper-plugin'; + +import { useAPIErrorHandler, useFetchClient, useNotification } from '@strapi/helper-plugin'; const useRegenerate = (url, id, onRegenerate, onError) => { const [isLoadingConfirmation, setIsLoadingConfirmation] = useState(false); diff --git a/packages/core/admin/admin/src/hooks/useRegenerate/tests/index.test.js b/packages/core/admin/admin/src/hooks/useRegenerate/tests/index.test.js index ecf6478bd5..8b698f257c 100644 --- a/packages/core/admin/admin/src/hooks/useRegenerate/tests/index.test.js +++ b/packages/core/admin/admin/src/hooks/useRegenerate/tests/index.test.js @@ -1,6 +1,8 @@ import React from 'react'; -import { IntlProvider } from 'react-intl'; + import { renderHook } from '@testing-library/react'; +import { IntlProvider } from 'react-intl'; + import useRegenerate from '../index'; jest.mock('@strapi/helper-plugin', () => ({ diff --git a/packages/core/admin/admin/src/hooks/useReleaseNotification/index.js b/packages/core/admin/admin/src/hooks/useReleaseNotification/index.js index 26e4db1b2a..bd3a0ffb81 100644 --- a/packages/core/admin/admin/src/hooks/useReleaseNotification/index.js +++ b/packages/core/admin/admin/src/hooks/useReleaseNotification/index.js @@ -1,4 +1,5 @@ import { useEffect } from 'react'; + import { useAppInfo, useNotification } from '@strapi/helper-plugin'; const showUpdateNotif = !JSON.parse(localStorage.getItem('STRAPI_UPDATE_NOTIF')); diff --git a/packages/core/admin/admin/src/hooks/useRolesList/index.js b/packages/core/admin/admin/src/hooks/useRolesList/index.js index f35c1692de..42df7617d7 100644 --- a/packages/core/admin/admin/src/hooks/useRolesList/index.js +++ b/packages/core/admin/admin/src/hooks/useRolesList/index.js @@ -1,6 +1,8 @@ -import { useEffect, useReducer, useCallback } from 'react'; +import { useCallback, useEffect, useReducer } from 'react'; + import { getFetchClient, useNotification } from '@strapi/helper-plugin'; import get from 'lodash/get'; + import init from './init'; import reducer, { initialState } from './reducer'; diff --git a/packages/core/admin/admin/src/hooks/useSettingsForm/index.js b/packages/core/admin/admin/src/hooks/useSettingsForm/index.js index ce832d47ad..fe1d05911b 100644 --- a/packages/core/admin/admin/src/hooks/useSettingsForm/index.js +++ b/packages/core/admin/admin/src/hooks/useSettingsForm/index.js @@ -1,9 +1,12 @@ import { useEffect, useReducer } from 'react'; + import { useFetchClient, useNotification, useOverlayBlocker } from '@strapi/helper-plugin'; import omit from 'lodash/omit'; + import { checkFormValidity, formatAPIErrors } from '../../utils'; -import { initialState, reducer } from './reducer'; + import init from './init'; +import { initialState, reducer } from './reducer'; /** * TODO: refactor this, it's confusing and hard to read. diff --git a/packages/core/admin/admin/src/hooks/useSettingsForm/tests/index.test.js b/packages/core/admin/admin/src/hooks/useSettingsForm/tests/index.test.js index 35891fae23..8e436fb4ea 100644 --- a/packages/core/admin/admin/src/hooks/useSettingsForm/tests/index.test.js +++ b/packages/core/admin/admin/src/hooks/useSettingsForm/tests/index.test.js @@ -1,6 +1,7 @@ -import { setupServer } from 'msw/node'; +import { act, renderHook, waitFor } from '@testing-library/react'; import { rest } from 'msw'; -import { renderHook, act, waitFor } from '@testing-library/react'; +import { setupServer } from 'msw/node'; + import useSettingsForm from '../index'; const toggleNotification = jest.fn(); diff --git a/packages/core/admin/admin/src/hooks/useSettingsMenu/index.js b/packages/core/admin/admin/src/hooks/useSettingsMenu/index.js index 442eadecbc..d561063838 100644 --- a/packages/core/admin/admin/src/hooks/useSettingsMenu/index.js +++ b/packages/core/admin/admin/src/hooks/useSettingsMenu/index.js @@ -1,8 +1,9 @@ import { useEffect, useReducer } from 'react'; -import { hasPermissions, useRBACProvider, useStrapiApp, useAppInfo } from '@strapi/helper-plugin'; -import reducer, { initialState } from './reducer'; +import { hasPermissions, useAppInfo, useRBACProvider, useStrapiApp } from '@strapi/helper-plugin'; + import init from './init'; +import reducer, { initialState } from './reducer'; const useSettingsMenu = (noCheck = false) => { const { allPermissions: permissions } = useRBACProvider(); diff --git a/packages/core/admin/admin/src/hooks/useSettingsMenu/init.js b/packages/core/admin/admin/src/hooks/useSettingsMenu/init.js index a017f6d7c3..b4bcf97c74 100644 --- a/packages/core/admin/admin/src/hooks/useSettingsMenu/init.js +++ b/packages/core/admin/admin/src/hooks/useSettingsMenu/init.js @@ -1,8 +1,9 @@ import omit from 'lodash/omit'; -import sortLinks from './utils/sortLinks'; -import formatLinks from './utils/formatLinks'; + import adminLinks from './utils/adminLinks'; +import formatLinks from './utils/formatLinks'; import globalLinks from './utils/globalLinks'; +import sortLinks from './utils/sortLinks'; const init = (initialState, { settings, shouldUpdateStrapi }) => { // Retrieve the links that will be injected into the global section diff --git a/packages/core/admin/admin/src/hooks/useSettingsMenu/utils/adminLinks.js b/packages/core/admin/admin/src/hooks/useSettingsMenu/utils/adminLinks.js index b4a2b02cf1..9accbe36fa 100644 --- a/packages/core/admin/admin/src/hooks/useSettingsMenu/utils/adminLinks.js +++ b/packages/core/admin/admin/src/hooks/useSettingsMenu/utils/adminLinks.js @@ -1,4 +1,5 @@ import customAdminLinks from 'ee_else_ce/hooks/useSettingsMenu/utils/customAdminLinks'; + import defaultAdminLinks from './defaultAdminLinks'; export default [...customAdminLinks, ...defaultAdminLinks]; diff --git a/packages/core/admin/admin/src/hooks/useSettingsMenu/utils/globalLinks.js b/packages/core/admin/admin/src/hooks/useSettingsMenu/utils/globalLinks.js index 32c1aef5cd..2af1c7708f 100644 --- a/packages/core/admin/admin/src/hooks/useSettingsMenu/utils/globalLinks.js +++ b/packages/core/admin/admin/src/hooks/useSettingsMenu/utils/globalLinks.js @@ -1,4 +1,5 @@ import customGlobalLinks from 'ee_else_ce/hooks/useSettingsMenu/utils/customGlobalLinks'; + import defaultGlobalLinks from './defaultGlobalLinks'; export default [...defaultGlobalLinks, ...customGlobalLinks]; diff --git a/packages/core/admin/admin/src/hooks/useThemeToggle/index.js b/packages/core/admin/admin/src/hooks/useThemeToggle/index.js index f58821c628..b78226b3e0 100644 --- a/packages/core/admin/admin/src/hooks/useThemeToggle/index.js +++ b/packages/core/admin/admin/src/hooks/useThemeToggle/index.js @@ -1,4 +1,5 @@ import { useContext } from 'react'; + import { ThemeToggleContext } from '../../contexts'; const useThemeToggle = () => { diff --git a/packages/core/admin/admin/src/index.js b/packages/core/admin/admin/src/index.js index fe95c7a121..65efa9596f 100644 --- a/packages/core/admin/admin/src/index.js +++ b/packages/core/admin/admin/src/index.js @@ -1,5 +1,6 @@ import { getFetchClient } from '@strapi/helper-plugin'; import { createRoot } from 'react-dom/client'; + import appCustomisations from './app'; import { Components, Fields, Middlewares, Reducers } from './core/apis'; // eslint-disable-next-line import/extensions diff --git a/packages/core/admin/admin/src/layouts/AppLayout/index.js b/packages/core/admin/admin/src/layouts/AppLayout/index.js index ab38827530..e8b44639ec 100644 --- a/packages/core/admin/admin/src/layouts/AppLayout/index.js +++ b/packages/core/admin/admin/src/layouts/AppLayout/index.js @@ -1,8 +1,9 @@ import React from 'react'; + import { Box, Flex, SkipToContent } from '@strapi/design-system'; import PropTypes from 'prop-types'; -import styled from 'styled-components'; import { useIntl } from 'react-intl'; +import styled from 'styled-components'; const FlexBox = styled(Box)` flex: 1; diff --git a/packages/core/admin/admin/src/layouts/UnauthenticatedLayout/LocaleToggle/index.js b/packages/core/admin/admin/src/layouts/UnauthenticatedLayout/LocaleToggle/index.js index 2fc7aefbb3..2228f517b2 100644 --- a/packages/core/admin/admin/src/layouts/UnauthenticatedLayout/LocaleToggle/index.js +++ b/packages/core/admin/admin/src/layouts/UnauthenticatedLayout/LocaleToggle/index.js @@ -5,8 +5,10 @@ */ import React from 'react'; + +import { MenuItem, SimpleMenu } from '@strapi/design-system'; import { useIntl } from 'react-intl'; -import { SimpleMenu, MenuItem } from '@strapi/design-system'; + import useLocalesProvider from '../../../components/LocalesProvider/useLocalesProvider'; const LocaleToggle = () => { diff --git a/packages/core/admin/admin/src/layouts/UnauthenticatedLayout/index.js b/packages/core/admin/admin/src/layouts/UnauthenticatedLayout/index.js index e302298fb8..d1a599e835 100644 --- a/packages/core/admin/admin/src/layouts/UnauthenticatedLayout/index.js +++ b/packages/core/admin/admin/src/layouts/UnauthenticatedLayout/index.js @@ -1,7 +1,9 @@ import React from 'react'; -import styled from 'styled-components'; -import PropTypes from 'prop-types'; + import { Box, Flex } from '@strapi/design-system'; +import PropTypes from 'prop-types'; +import styled from 'styled-components'; + import LocaleToggle from './LocaleToggle'; const Wrapper = styled(Box)` diff --git a/packages/core/admin/admin/src/pages/Admin/Onboarding/index.js b/packages/core/admin/admin/src/pages/Admin/Onboarding/index.js index e0f25a7207..054249f958 100644 --- a/packages/core/admin/admin/src/pages/Admin/Onboarding/index.js +++ b/packages/core/admin/admin/src/pages/Admin/Onboarding/index.js @@ -1,22 +1,24 @@ import React, { useRef, useState } from 'react'; -import styled from 'styled-components'; -import { useIntl } from 'react-intl'; -import { useAppInfo } from '@strapi/helper-plugin'; + import { Box, Button, Divider, Flex, Icon, - Portal, PopoverPrimitives, + Portal, Typography, VisuallyHidden, } from '@strapi/design-system'; +import { useAppInfo } from '@strapi/helper-plugin'; import { Cross, Message, Play, Question } from '@strapi/icons'; +import { useIntl } from 'react-intl'; +import styled from 'styled-components'; import onboardingPreview from '../../../assets/images/onboarding-preview.png'; -import { VIDEO_LINKS, DOCUMENTATION_LINKS, WATCH_MORE } from './constants'; + +import { DOCUMENTATION_LINKS, VIDEO_LINKS, WATCH_MORE } from './constants'; // TODO: use new Button props derived from Box props with next DS release const HelperButton = styled(Button)` diff --git a/packages/core/admin/admin/src/pages/Admin/Onboarding/tests/index.test.js b/packages/core/admin/admin/src/pages/Admin/Onboarding/tests/index.test.js index 5efe4e0e2d..f0fc382f8d 100644 --- a/packages/core/admin/admin/src/pages/Admin/Onboarding/tests/index.test.js +++ b/packages/core/admin/admin/src/pages/Admin/Onboarding/tests/index.test.js @@ -1,9 +1,11 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { useAppInfo } from '@strapi/helper-plugin'; import { render } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { IntlProvider } from 'react-intl'; -import { useAppInfo } from '@strapi/helper-plugin'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; + import Onboarding from '../index'; jest.mock('@strapi/helper-plugin', () => ({ diff --git a/packages/core/admin/admin/src/pages/Admin/index.js b/packages/core/admin/admin/src/pages/Admin/index.js index f9264d2118..9b22045af3 100644 --- a/packages/core/admin/admin/src/pages/Admin/index.js +++ b/packages/core/admin/admin/src/pages/Admin/index.js @@ -4,19 +4,21 @@ * */ -import React, { Suspense, useEffect, useMemo, lazy } from 'react'; -import { Switch, Route } from 'react-router-dom'; -import { useTracking, LoadingIndicatorPage, useStrapiApp } from '@strapi/helper-plugin'; -import { useDispatch, useSelector } from 'react-redux'; +import React, { lazy, Suspense, useEffect, useMemo } from 'react'; + +import { LoadingIndicatorPage, useStrapiApp, useTracking } from '@strapi/helper-plugin'; import { DndProvider } from 'react-dnd'; import { HTML5Backend } from 'react-dnd-html5-backend'; +import { useDispatch, useSelector } from 'react-redux'; +import { Route, Switch } from 'react-router-dom'; import GuidedTourModal from '../../components/GuidedTour/Modal'; import LeftMenu from '../../components/LeftMenu'; +import { useConfigurations, useMenu } from '../../hooks'; import AppLayout from '../../layouts/AppLayout'; -import { useMenu, useConfigurations } from '../../hooks'; import { createRoute } from '../../utils'; import { SET_APP_RUNTIME_STATUS } from '../App/constants'; + import Onboarding from './Onboarding'; const CM = lazy(() => diff --git a/packages/core/admin/admin/src/pages/Admin/tests/index.test.js b/packages/core/admin/admin/src/pages/Admin/tests/index.test.js index 86a29c05a4..7bab863979 100644 --- a/packages/core/admin/admin/src/pages/Admin/tests/index.test.js +++ b/packages/core/admin/admin/src/pages/Admin/tests/index.test.js @@ -1,10 +1,12 @@ import React from 'react'; -import { Router } from 'react-router-dom'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { useStrapiApp } from '@strapi/helper-plugin'; import { render, screen, waitFor } from '@testing-library/react'; import { createMemoryHistory } from 'history'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; import { IntlProvider } from 'react-intl'; -import { useStrapiApp } from '@strapi/helper-plugin'; +import { Router } from 'react-router-dom'; + import { useMenu } from '../../../hooks'; import Admin from '../index'; diff --git a/packages/core/admin/admin/src/pages/Admin/tests/useTrackUsage.test.js b/packages/core/admin/admin/src/pages/Admin/tests/useTrackUsage.test.js index 47e25a0ddb..196db07a35 100644 --- a/packages/core/admin/admin/src/pages/Admin/tests/useTrackUsage.test.js +++ b/packages/core/admin/admin/src/pages/Admin/tests/useTrackUsage.test.js @@ -1,4 +1,5 @@ import { renderHook } from '@testing-library/react'; + import { useTrackUsage } from '../index'; const trackUsageMock = jest.fn(); diff --git a/packages/core/admin/admin/src/pages/App/index.js b/packages/core/admin/admin/src/pages/App/index.js index 438c3d800a..711aa401b3 100644 --- a/packages/core/admin/admin/src/pages/App/index.js +++ b/packages/core/admin/admin/src/pages/App/index.js @@ -4,27 +4,30 @@ * */ -import React, { useEffect, useState, useMemo, lazy, Suspense } from 'react'; -import { Switch, Route } from 'react-router-dom'; +import React, { lazy, Suspense, useEffect, useMemo, useState } from 'react'; + +import { SkipToContent } from '@strapi/design-system'; import { - LoadingIndicatorPage, auth, - useNotification, - TrackingProvider, + LoadingIndicatorPage, prefixFileUrlWithBackendUrl, + TrackingProvider, useAppInfo, useFetchClient, + useNotification, } from '@strapi/helper-plugin'; -import { SkipToContent } from '@strapi/design-system'; import { useIntl } from 'react-intl'; +import { Route, Switch } from 'react-router-dom'; + import PrivateRoute from '../../components/PrivateRoute'; +import { useConfigurations } from '../../hooks'; import { createRoute, makeUniqueRoutes } from '../../utils'; import AuthPage from '../AuthPage'; import NotFoundPage from '../NotFoundPage'; import UseCasePage from '../UseCasePage'; + import { getUID } from './utils'; import routes from './utils/routes'; -import { useConfigurations } from '../../hooks'; const AuthenticatedApp = lazy(() => import(/* webpackChunkName: "Admin-authenticatedApp" */ '../../components/AuthenticatedApp') diff --git a/packages/core/admin/admin/src/pages/App/reducer.js b/packages/core/admin/admin/src/pages/App/reducer.js index 6e4a54a887..117ed9f6d8 100644 --- a/packages/core/admin/admin/src/pages/App/reducer.js +++ b/packages/core/admin/admin/src/pages/App/reducer.js @@ -1,4 +1,5 @@ import produce from 'immer'; + import { SET_APP_RUNTIME_STATUS } from './constants'; const initialState = { diff --git a/packages/core/admin/admin/src/pages/App/utils/index.js b/packages/core/admin/admin/src/pages/App/utils/index.js index e554a192a4..34ffa1453d 100644 --- a/packages/core/admin/admin/src/pages/App/utils/index.js +++ b/packages/core/admin/admin/src/pages/App/utils/index.js @@ -1,3 +1,3 @@ /* eslint-disable import/prefer-default-export */ -export { default as getUID } from './unique-identifier'; export { default as routes } from './routes'; +export { default as getUID } from './unique-identifier'; diff --git a/packages/core/admin/admin/src/pages/App/utils/routes.js b/packages/core/admin/admin/src/pages/App/utils/routes.js index 11d425c416..79ecbbf3bf 100644 --- a/packages/core/admin/admin/src/pages/App/utils/routes.js +++ b/packages/core/admin/admin/src/pages/App/utils/routes.js @@ -1,4 +1,5 @@ import customRoutes from 'ee_else_ce/pages/App/utils/customRoutes'; + import defaultRoutes from './defaultRoutes'; export default [...customRoutes, ...defaultRoutes]; diff --git a/packages/core/admin/admin/src/pages/AuthPage/components/FieldActionWrapper/index.js b/packages/core/admin/admin/src/pages/AuthPage/components/FieldActionWrapper/index.js index f3f6623524..ccaccf4080 100644 --- a/packages/core/admin/admin/src/pages/AuthPage/components/FieldActionWrapper/index.js +++ b/packages/core/admin/admin/src/pages/AuthPage/components/FieldActionWrapper/index.js @@ -1,5 +1,5 @@ -import styled from 'styled-components'; import { FieldAction } from '@strapi/design-system'; +import styled from 'styled-components'; const FieldActionWrapper = styled(FieldAction)` svg { diff --git a/packages/core/admin/admin/src/pages/AuthPage/components/ForgotPassword/index.js b/packages/core/admin/admin/src/pages/AuthPage/components/ForgotPassword/index.js index 00e3ea407d..3871e6c7e2 100644 --- a/packages/core/admin/admin/src/pages/AuthPage/components/ForgotPassword/index.js +++ b/packages/core/admin/admin/src/pages/AuthPage/components/ForgotPassword/index.js @@ -1,14 +1,16 @@ import React from 'react'; -import { useIntl } from 'react-intl'; -import PropTypes from 'prop-types'; + +import { Box, Button, Flex, Main, TextInput, Typography } from '@strapi/design-system'; import { Form, Link } from '@strapi/helper-plugin'; -import { Box, Flex, Main, Button, TextInput, Typography } from '@strapi/design-system'; import { Formik } from 'formik'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; + +import Logo from '../../../../components/UnauthenticatedLogo'; import UnauthenticatedLayout, { Column, LayoutContent, } from '../../../../layouts/UnauthenticatedLayout'; -import Logo from '../../../../components/UnauthenticatedLogo'; const ForgotPassword = ({ onSubmit, schema }) => { const { formatMessage } = useIntl(); diff --git a/packages/core/admin/admin/src/pages/AuthPage/components/ForgotPasswordSuccess/index.js b/packages/core/admin/admin/src/pages/AuthPage/components/ForgotPasswordSuccess/index.js index 49428c0146..40c8dd23a6 100644 --- a/packages/core/admin/admin/src/pages/AuthPage/components/ForgotPasswordSuccess/index.js +++ b/packages/core/admin/admin/src/pages/AuthPage/components/ForgotPasswordSuccess/index.js @@ -1,12 +1,14 @@ import React from 'react'; -import { useIntl } from 'react-intl'; + +import { Box, Flex, Main, Typography } from '@strapi/design-system'; import { Link } from '@strapi/helper-plugin'; -import { Box, Main, Flex, Typography } from '@strapi/design-system'; +import { useIntl } from 'react-intl'; + +import Logo from '../../../../components/UnauthenticatedLogo'; import UnauthenticatedLayout, { Column, LayoutContent, } from '../../../../layouts/UnauthenticatedLayout'; -import Logo from '../../../../components/UnauthenticatedLogo'; const ForgotPasswordSuccess = () => { const { formatMessage } = useIntl(); diff --git a/packages/core/admin/admin/src/pages/AuthPage/components/Login/BaseLogin.js b/packages/core/admin/admin/src/pages/AuthPage/components/Login/BaseLogin.js index 811a1a9492..66f21f3e90 100644 --- a/packages/core/admin/admin/src/pages/AuthPage/components/Login/BaseLogin.js +++ b/packages/core/admin/admin/src/pages/AuthPage/components/Login/BaseLogin.js @@ -1,13 +1,15 @@ import React, { useState } from 'react'; + +import { Box, Button, Checkbox, Flex, Main, TextInput, Typography } from '@strapi/design-system'; import { Form, Link } from '@strapi/helper-plugin'; -import { EyeStriked, Eye } from '@strapi/icons'; -import { Box, Main, Flex, Button, TextInput, Checkbox, Typography } from '@strapi/design-system'; +import { Eye, EyeStriked } from '@strapi/icons'; +import { Formik } from 'formik'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; import styled from 'styled-components'; -import { Formik } from 'formik'; -import { Column, LayoutContent } from '../../../../layouts/UnauthenticatedLayout'; + import Logo from '../../../../components/UnauthenticatedLogo'; +import { Column, LayoutContent } from '../../../../layouts/UnauthenticatedLayout'; import FieldActionWrapper from '../FieldActionWrapper'; const PasswordInput = styled(TextInput)` diff --git a/packages/core/admin/admin/src/pages/AuthPage/components/Login/index.js b/packages/core/admin/admin/src/pages/AuthPage/components/Login/index.js index 84c066ecf6..37fef863ca 100644 --- a/packages/core/admin/admin/src/pages/AuthPage/components/Login/index.js +++ b/packages/core/admin/admin/src/pages/AuthPage/components/Login/index.js @@ -1,8 +1,11 @@ import React from 'react'; + import PropTypes from 'prop-types'; -import BaseLogin from './BaseLogin'; + import UnauthenticatedLayout from '../../../../layouts/UnauthenticatedLayout'; +import BaseLogin from './BaseLogin'; + const Login = (loginProps) => { return ( diff --git a/packages/core/admin/admin/src/pages/AuthPage/components/Login/tests/BaseLogin.test.js b/packages/core/admin/admin/src/pages/AuthPage/components/Login/tests/BaseLogin.test.js index 56f789e427..404d1aacfb 100644 --- a/packages/core/admin/admin/src/pages/AuthPage/components/Login/tests/BaseLogin.test.js +++ b/packages/core/admin/admin/src/pages/AuthPage/components/Login/tests/BaseLogin.test.js @@ -1,10 +1,12 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render } from '@testing-library/react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import { Router } from 'react-router-dom'; -import { IntlProvider } from 'react-intl'; -import * as yup from 'yup'; import { createMemoryHistory } from 'history'; +import { IntlProvider } from 'react-intl'; +import { Router } from 'react-router-dom'; +import * as yup from 'yup'; + import BaseLogin from '../BaseLogin'; jest.mock('../../../../../hooks/useConfigurations', () => () => ({ diff --git a/packages/core/admin/admin/src/pages/AuthPage/components/Oops/index.js b/packages/core/admin/admin/src/pages/AuthPage/components/Oops/index.js index 8450e363f6..b618816f30 100644 --- a/packages/core/admin/admin/src/pages/AuthPage/components/Oops/index.js +++ b/packages/core/admin/admin/src/pages/AuthPage/components/Oops/index.js @@ -1,12 +1,14 @@ import React from 'react'; + +import { Box, Flex, Main, Typography } from '@strapi/design-system'; +import { Link, useQuery } from '@strapi/helper-plugin'; import { useIntl } from 'react-intl'; -import { useQuery, Link } from '@strapi/helper-plugin'; -import { Box, Main, Flex, Typography } from '@strapi/design-system'; + +import Logo from '../../../../components/UnauthenticatedLogo'; import UnauthenticatedLayout, { Column, LayoutContent, } from '../../../../layouts/UnauthenticatedLayout'; -import Logo from '../../../../components/UnauthenticatedLogo'; const Oops = () => { const { formatMessage } = useIntl(); diff --git a/packages/core/admin/admin/src/pages/AuthPage/components/Oops/tests/index.test.js b/packages/core/admin/admin/src/pages/AuthPage/components/Oops/tests/index.test.js index b2f9e5aae5..f5f4c3912d 100644 --- a/packages/core/admin/admin/src/pages/AuthPage/components/Oops/tests/index.test.js +++ b/packages/core/admin/admin/src/pages/AuthPage/components/Oops/tests/index.test.js @@ -1,9 +1,11 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render } from '@testing-library/react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import { Router } from 'react-router-dom'; import { createMemoryHistory } from 'history'; import { IntlProvider } from 'react-intl'; +import { Router } from 'react-router-dom'; + import Oops from '..'; jest.mock('../../../../../components/LocalesProvider/useLocalesProvider', () => () => ({ diff --git a/packages/core/admin/admin/src/pages/AuthPage/components/Register/index.js b/packages/core/admin/admin/src/pages/AuthPage/components/Register/index.js index ecb58da7de..02112b26c0 100644 --- a/packages/core/admin/admin/src/pages/AuthPage/components/Register/index.js +++ b/packages/core/admin/admin/src/pages/AuthPage/components/Register/index.js @@ -1,34 +1,36 @@ -import React, { useState, useEffect } from 'react'; -import { useIntl } from 'react-intl'; -import styled from 'styled-components'; -import omit from 'lodash/omit'; -import { useHistory } from 'react-router-dom'; -import PropTypes from 'prop-types'; -import { Formik } from 'formik'; +import React, { useEffect, useState } from 'react'; + +import { + Box, + Button, + Checkbox, + Flex, + Grid, + GridItem, + Main, + TextInput, + Typography, +} from '@strapi/design-system'; import { Form, - useQuery, - useNotification, - useTracking, getYupInnerErrors, Link, useAPIErrorHandler, useFetchClient, + useNotification, + useQuery, + useTracking, } from '@strapi/helper-plugin'; -import { - Box, - Main, - Flex, - Button, - TextInput, - Checkbox, - Grid, - GridItem, - Typography, -} from '@strapi/design-system'; -import { EyeStriked, Eye } from '@strapi/icons'; -import UnauthenticatedLayout, { LayoutContent } from '../../../../layouts/UnauthenticatedLayout'; +import { Eye, EyeStriked } from '@strapi/icons'; +import { Formik } from 'formik'; +import omit from 'lodash/omit'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import { useHistory } from 'react-router-dom'; +import styled from 'styled-components'; + import Logo from '../../../../components/UnauthenticatedLogo'; +import UnauthenticatedLayout, { LayoutContent } from '../../../../layouts/UnauthenticatedLayout'; import FieldActionWrapper from '../FieldActionWrapper'; const A = styled.a` diff --git a/packages/core/admin/admin/src/pages/AuthPage/components/Register/tests/index.test.js b/packages/core/admin/admin/src/pages/AuthPage/components/Register/tests/index.test.js index a69ee3ac8f..958269c15c 100644 --- a/packages/core/admin/admin/src/pages/AuthPage/components/Register/tests/index.test.js +++ b/packages/core/admin/admin/src/pages/AuthPage/components/Register/tests/index.test.js @@ -1,14 +1,15 @@ import React from 'react'; -import { act, render, waitFor, fireEvent } from '@testing-library/react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { TrackingProvider, useNotification, useQuery } from '@strapi/helper-plugin'; +import { act, fireEvent, render, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import { Router } from 'react-router-dom'; -import { TrackingProvider, useQuery, useNotification } from '@strapi/helper-plugin'; import { createMemoryHistory } from 'history'; -import * as yup from 'yup'; -import { IntlProvider } from 'react-intl'; import { rest } from 'msw'; import { setupServer } from 'msw/node'; +import { IntlProvider } from 'react-intl'; +import { Router } from 'react-router-dom'; +import * as yup from 'yup'; import Register from '..'; diff --git a/packages/core/admin/admin/src/pages/AuthPage/components/ResetPassword/index.js b/packages/core/admin/admin/src/pages/AuthPage/components/ResetPassword/index.js index 9af6cbbb29..0632d6818f 100644 --- a/packages/core/admin/admin/src/pages/AuthPage/components/ResetPassword/index.js +++ b/packages/core/admin/admin/src/pages/AuthPage/components/ResetPassword/index.js @@ -1,16 +1,18 @@ import React, { useState } from 'react'; -import { useIntl } from 'react-intl'; -import PropTypes from 'prop-types'; -import styled from 'styled-components'; -import { Formik } from 'formik'; + +import { Box, Button, Flex, Main, TextInput, Typography } from '@strapi/design-system'; import { Form, Link } from '@strapi/helper-plugin'; -import { Box, Main, Flex, Button, TextInput, Typography } from '@strapi/design-system'; -import { EyeStriked, Eye } from '@strapi/icons'; +import { Eye, EyeStriked } from '@strapi/icons'; +import { Formik } from 'formik'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import styled from 'styled-components'; + +import Logo from '../../../../components/UnauthenticatedLogo'; import UnauthenticatedLayout, { Column, LayoutContent, } from '../../../../layouts/UnauthenticatedLayout'; -import Logo from '../../../../components/UnauthenticatedLogo'; import FieldActionWrapper from '../FieldActionWrapper'; const PasswordInput = styled(TextInput)` diff --git a/packages/core/admin/admin/src/pages/AuthPage/components/ResetPassword/tests/index.test.js b/packages/core/admin/admin/src/pages/AuthPage/components/ResetPassword/tests/index.test.js index 95a17c90ac..6b012b4b66 100644 --- a/packages/core/admin/admin/src/pages/AuthPage/components/ResetPassword/tests/index.test.js +++ b/packages/core/admin/admin/src/pages/AuthPage/components/ResetPassword/tests/index.test.js @@ -1,10 +1,12 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render } from '@testing-library/react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import { Router } from 'react-router-dom'; import { createMemoryHistory } from 'history'; -import * as yup from 'yup'; import { IntlProvider } from 'react-intl'; +import { Router } from 'react-router-dom'; +import * as yup from 'yup'; + import ResetPassword from '..'; jest.mock('../../../../../components/LocalesProvider/useLocalesProvider', () => () => ({ diff --git a/packages/core/admin/admin/src/pages/AuthPage/index.js b/packages/core/admin/admin/src/pages/AuthPage/index.js index 361e114e5c..0d859cf1c5 100644 --- a/packages/core/admin/admin/src/pages/AuthPage/index.js +++ b/packages/core/admin/admin/src/pages/AuthPage/index.js @@ -1,15 +1,18 @@ import React, { useEffect, useReducer } from 'react'; + +import { auth, useFetchClient, useGuidedTour, useQuery, useTracking } from '@strapi/helper-plugin'; import axios from 'axios'; +import forms from 'ee_else_ce/pages/AuthPage/utils/forms'; import camelCase from 'lodash/camelCase'; import get from 'lodash/get'; import omit from 'lodash/omit'; -import { Redirect, useRouteMatch, useHistory } from 'react-router-dom'; -import { auth, useQuery, useGuidedTour, useTracking, useFetchClient } from '@strapi/helper-plugin'; import PropTypes from 'prop-types'; -import forms from 'ee_else_ce/pages/AuthPage/utils/forms'; +import { Redirect, useHistory, useRouteMatch } from 'react-router-dom'; + import persistStateToLocaleStorage from '../../components/GuidedTour/utils/persistStateToLocaleStorage'; import useLocalesProvider from '../../components/LocalesProvider/useLocalesProvider'; import formatAPIErrors from '../../utils/formatAPIErrors'; + import init from './init'; import { initialState, reducer } from './reducer'; diff --git a/packages/core/admin/admin/src/pages/AuthPage/utils/forms.js b/packages/core/admin/admin/src/pages/AuthPage/utils/forms.js index ec4239ee34..a58d1dfa2c 100644 --- a/packages/core/admin/admin/src/pages/AuthPage/utils/forms.js +++ b/packages/core/admin/admin/src/pages/AuthPage/utils/forms.js @@ -1,6 +1,7 @@ -import * as yup from 'yup'; import { translatedErrors } from '@strapi/helper-plugin'; import Login from 'ee_else_ce/pages/AuthPage/components/Login'; +import * as yup from 'yup'; + import ForgotPassword from '../components/ForgotPassword'; import ForgotPasswordSuccess from '../components/ForgotPasswordSuccess'; import Oops from '../components/Oops'; diff --git a/packages/core/admin/admin/src/pages/HomePage/CloudBox.js b/packages/core/admin/admin/src/pages/HomePage/CloudBox.js index c05aada847..f67b7a0a7c 100644 --- a/packages/core/admin/admin/src/pages/HomePage/CloudBox.js +++ b/packages/core/admin/admin/src/pages/HomePage/CloudBox.js @@ -1,11 +1,13 @@ import React from 'react'; -import styled from 'styled-components'; -import { useIntl } from 'react-intl'; -import { useTracking, pxToRem } from '@strapi/helper-plugin'; + import { Box, Flex, Typography } from '@strapi/design-system'; +import { pxToRem, useTracking } from '@strapi/helper-plugin'; +import { useIntl } from 'react-intl'; +import styled from 'styled-components'; + import cloudIconBackgroundImage from './assets/strapi-cloud-background.png'; -import cloudIcon from './assets/strapi-cloud-icon.svg'; import cloudFlagsImage from './assets/strapi-cloud-flags.svg'; +import cloudIcon from './assets/strapi-cloud-icon.svg'; const BlockLink = styled.a` text-decoration: none; diff --git a/packages/core/admin/admin/src/pages/HomePage/ContentBlocks.js b/packages/core/admin/admin/src/pages/HomePage/ContentBlocks.js index a1cb3c8183..84ec0ac4fe 100644 --- a/packages/core/admin/admin/src/pages/HomePage/ContentBlocks.js +++ b/packages/core/admin/admin/src/pages/HomePage/ContentBlocks.js @@ -1,9 +1,11 @@ import React from 'react'; -import styled from 'styled-components'; -import { useIntl } from 'react-intl'; -import { ContentBox, useTracking } from '@strapi/helper-plugin'; + import { Flex } from '@strapi/design-system'; -import { InformationSquare, CodeSquare, PlaySquare, FeatherSquare } from '@strapi/icons'; +import { ContentBox, useTracking } from '@strapi/helper-plugin'; +import { CodeSquare, FeatherSquare, InformationSquare, PlaySquare } from '@strapi/icons'; +import { useIntl } from 'react-intl'; +import styled from 'styled-components'; + import CloudBox from './CloudBox'; const BlockLink = styled.a` diff --git a/packages/core/admin/admin/src/pages/HomePage/HomeHeader.js b/packages/core/admin/admin/src/pages/HomePage/HomeHeader.js index 1ec96b456d..8fb94c5a9e 100644 --- a/packages/core/admin/admin/src/pages/HomePage/HomeHeader.js +++ b/packages/core/admin/admin/src/pages/HomePage/HomeHeader.js @@ -1,10 +1,11 @@ import React from 'react'; -import styled from 'styled-components'; -import PropTypes from 'prop-types'; -import { useIntl } from 'react-intl'; -import { Typography, Box, Button, Flex } from '@strapi/design-system'; + +import { Box, Button, Flex, Typography } from '@strapi/design-system'; import { Link } from '@strapi/design-system/v2'; import { ArrowRight } from '@strapi/icons'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import styled from 'styled-components'; const WordWrap = styled(Typography)` word-break: break-word; diff --git a/packages/core/admin/admin/src/pages/HomePage/SocialLinks.js b/packages/core/admin/admin/src/pages/HomePage/SocialLinks.js index affc7304f4..e290ab2c42 100644 --- a/packages/core/admin/admin/src/pages/HomePage/SocialLinks.js +++ b/packages/core/admin/admin/src/pages/HomePage/SocialLinks.js @@ -4,12 +4,13 @@ */ import React from 'react'; -import styled from 'styled-components'; -import { useIntl } from 'react-intl'; -import { useAppInfo } from '@strapi/helper-plugin'; -import { Typography, Box, Flex, Grid, GridItem } from '@strapi/design-system'; + +import { Box, Flex, Grid, GridItem, Typography } from '@strapi/design-system'; import { Link, LinkButton } from '@strapi/design-system/v2'; -import { ExternalLink, Github, Discord, Reddit, Strapi, Twitter, Discourse } from '@strapi/icons'; +import { useAppInfo } from '@strapi/helper-plugin'; +import { Discord, Discourse, ExternalLink, Github, Reddit, Strapi, Twitter } from '@strapi/icons'; +import { useIntl } from 'react-intl'; +import styled from 'styled-components'; const StyledDiscord = styled(Discord)` path { diff --git a/packages/core/admin/admin/src/pages/HomePage/index.js b/packages/core/admin/admin/src/pages/HomePage/index.js index af0b084c04..2d44595f5c 100644 --- a/packages/core/admin/admin/src/pages/HomePage/index.js +++ b/packages/core/admin/admin/src/pages/HomePage/index.js @@ -4,21 +4,23 @@ */ import React, { memo, useMemo } from 'react'; -import { FormattedMessage } from 'react-intl'; -import styled from 'styled-components'; -import { Helmet } from 'react-helmet'; -import { useHistory } from 'react-router-dom'; + +import { Box, Grid, GridItem, Layout, Main } from '@strapi/design-system'; import { LoadingIndicatorPage, useGuidedTour } from '@strapi/helper-plugin'; -import { Layout, Main, Box, Grid, GridItem } from '@strapi/design-system'; import useLicenseLimitNotification from 'ee_else_ce/hooks/useLicenseLimitNotification'; +import { Helmet } from 'react-helmet'; +import { FormattedMessage } from 'react-intl'; +import { useHistory } from 'react-router-dom'; +import styled from 'styled-components'; + +import GuidedTourHomepage from '../../components/GuidedTour/Homepage'; +import isGuidedTourCompleted from '../../components/GuidedTour/utils/isGuidedTourCompleted'; +import { useContentTypes } from '../../hooks/useContentTypes'; import cornerOrnamentPath from './assets/corner-ornament.svg'; -import { useContentTypes } from '../../hooks/useContentTypes'; -import isGuidedTourCompleted from '../../components/GuidedTour/utils/isGuidedTourCompleted'; -import GuidedTourHomepage from '../../components/GuidedTour/Homepage'; -import SocialLinks from './SocialLinks'; -import HomeHeader from './HomeHeader'; import ContentBlocks from './ContentBlocks'; +import HomeHeader from './HomeHeader'; +import SocialLinks from './SocialLinks'; const LogoContainer = styled(Box)` position: absolute; diff --git a/packages/core/admin/admin/src/pages/HomePage/tests/index.test.js b/packages/core/admin/admin/src/pages/HomePage/tests/index.test.js index d7628fa989..6fe68eaea2 100644 --- a/packages/core/admin/admin/src/pages/HomePage/tests/index.test.js +++ b/packages/core/admin/admin/src/pages/HomePage/tests/index.test.js @@ -1,12 +1,14 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { useAppInfo } from '@strapi/helper-plugin'; import { render } from '@testing-library/react'; -import { Router } from 'react-router-dom'; import { createMemoryHistory } from 'history'; import { IntlProvider } from 'react-intl'; -import { useAppInfo } from '@strapi/helper-plugin'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import HomePage from '../index'; +import { Router } from 'react-router-dom'; + import { useContentTypes } from '../../../hooks/useContentTypes'; +import HomePage from '../index'; jest.mock('@strapi/helper-plugin', () => ({ ...jest.requireActual('@strapi/helper-plugin'), diff --git a/packages/core/admin/admin/src/pages/InstalledPluginsPage/Plugins.js b/packages/core/admin/admin/src/pages/InstalledPluginsPage/Plugins.js index 06dfbf5027..4dfc60a9ba 100644 --- a/packages/core/admin/admin/src/pages/InstalledPluginsPage/Plugins.js +++ b/packages/core/admin/admin/src/pages/InstalledPluginsPage/Plugins.js @@ -1,20 +1,22 @@ import React from 'react'; -import { useIntl } from 'react-intl'; -import { LoadingIndicatorPage, useFocusWhenNavigate } from '@strapi/helper-plugin'; + import { - useNotifyAT, - Layout, - HeaderLayout, ContentLayout, + HeaderLayout, + Layout, Main, - Typography, Table, - Thead, Tbody, - Tr, Td, Th, + Thead, + Tr, + Typography, + useNotifyAT, } from '@strapi/design-system'; +import { LoadingIndicatorPage, useFocusWhenNavigate } from '@strapi/helper-plugin'; +import { useIntl } from 'react-intl'; + import useFetchEnabledPlugins from '../../hooks/useFetchEnabledPlugins'; const Plugins = () => { diff --git a/packages/core/admin/admin/src/pages/InstalledPluginsPage/index.js b/packages/core/admin/admin/src/pages/InstalledPluginsPage/index.js index 5a9932b349..f158486493 100644 --- a/packages/core/admin/admin/src/pages/InstalledPluginsPage/index.js +++ b/packages/core/admin/admin/src/pages/InstalledPluginsPage/index.js @@ -1,8 +1,11 @@ import React from 'react'; + import { CheckPagePermissions } from '@strapi/helper-plugin'; import { Helmet } from 'react-helmet'; import { useIntl } from 'react-intl'; + import adminPermissions from '../../permissions'; + import Plugins from './Plugins'; const InstalledPluginsPage = () => { diff --git a/packages/core/admin/admin/src/pages/InternalErrorPage/index.js b/packages/core/admin/admin/src/pages/InternalErrorPage/index.js index 8444c2a285..030b408e49 100644 --- a/packages/core/admin/admin/src/pages/InternalErrorPage/index.js +++ b/packages/core/admin/admin/src/pages/InternalErrorPage/index.js @@ -5,9 +5,10 @@ * */ import React from 'react'; -import { useFocusWhenNavigate, LinkButton } from '@strapi/helper-plugin'; -import { Main, ContentLayout, HeaderLayout, EmptyStateLayout } from '@strapi/design-system'; -import { EmptyPictures, ArrowRight } from '@strapi/icons'; + +import { ContentLayout, EmptyStateLayout, HeaderLayout, Main } from '@strapi/design-system'; +import { LinkButton, useFocusWhenNavigate } from '@strapi/helper-plugin'; +import { ArrowRight, EmptyPictures } from '@strapi/icons'; import { useIntl } from 'react-intl'; const InternalErrorPage = () => { diff --git a/packages/core/admin/admin/src/pages/InternalErrorPage/tests/index.test.js b/packages/core/admin/admin/src/pages/InternalErrorPage/tests/index.test.js index 3104f41cad..a0ea8beddd 100644 --- a/packages/core/admin/admin/src/pages/InternalErrorPage/tests/index.test.js +++ b/packages/core/admin/admin/src/pages/InternalErrorPage/tests/index.test.js @@ -1,9 +1,11 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render } from '@testing-library/react'; -import { Router } from 'react-router-dom'; import { createMemoryHistory } from 'history'; import { IntlProvider } from 'react-intl'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; +import { Router } from 'react-router-dom'; + import InternalErrorPage from '../index'; const history = createMemoryHistory(); diff --git a/packages/core/admin/admin/src/pages/MarketplacePage/components/EmptyNpmPackageSearch/EmptyNpmPackageGrid.js b/packages/core/admin/admin/src/pages/MarketplacePage/components/EmptyNpmPackageSearch/EmptyNpmPackageGrid.js index 68a8aafd2b..47b58fb633 100644 --- a/packages/core/admin/admin/src/pages/MarketplacePage/components/EmptyNpmPackageSearch/EmptyNpmPackageGrid.js +++ b/packages/core/admin/admin/src/pages/MarketplacePage/components/EmptyNpmPackageSearch/EmptyNpmPackageGrid.js @@ -1,6 +1,7 @@ import React from 'react'; -import styled from 'styled-components'; + import { Box, GridLayout } from '@strapi/design-system'; +import styled from 'styled-components'; const EmptyPluginCard = styled(Box)` background: ${({ theme }) => diff --git a/packages/core/admin/admin/src/pages/MarketplacePage/components/EmptyNpmPackageSearch/index.js b/packages/core/admin/admin/src/pages/MarketplacePage/components/EmptyNpmPackageSearch/index.js index 674c0d4d85..9ee608e02d 100644 --- a/packages/core/admin/admin/src/pages/MarketplacePage/components/EmptyNpmPackageSearch/index.js +++ b/packages/core/admin/admin/src/pages/MarketplacePage/components/EmptyNpmPackageSearch/index.js @@ -1,7 +1,9 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import { Typography, Box, Flex, Icon } from '@strapi/design-system'; + +import { Box, Flex, Icon, Typography } from '@strapi/design-system'; import { EmptyDocuments } from '@strapi/icons'; +import PropTypes from 'prop-types'; + import { EmptyNpmPackageGrid } from './EmptyNpmPackageGrid'; const EmptyNpmPackageSearch = ({ content }) => { diff --git a/packages/core/admin/admin/src/pages/MarketplacePage/components/MissingPluginBanner/index.js b/packages/core/admin/admin/src/pages/MarketplacePage/components/MissingPluginBanner/index.js index b1782b5a49..1a2ecd84b6 100644 --- a/packages/core/admin/admin/src/pages/MarketplacePage/components/MissingPluginBanner/index.js +++ b/packages/core/admin/admin/src/pages/MarketplacePage/components/MissingPluginBanner/index.js @@ -1,8 +1,9 @@ import React from 'react'; -import { useIntl } from 'react-intl'; -import { ContentBox, useTracking } from '@strapi/helper-plugin'; -import { GlassesSquare, ExternalLink } from '@strapi/icons'; + import { Icon } from '@strapi/design-system'; +import { ContentBox, useTracking } from '@strapi/helper-plugin'; +import { ExternalLink, GlassesSquare } from '@strapi/icons'; +import { useIntl } from 'react-intl'; const MissingPluginBanner = () => { const { formatMessage } = useIntl(); diff --git a/packages/core/admin/admin/src/pages/MarketplacePage/components/NpmPackageCard/CardButton.js b/packages/core/admin/admin/src/pages/MarketplacePage/components/NpmPackageCard/CardButton.js index 77c9b75a3d..9555e1ce3c 100644 --- a/packages/core/admin/admin/src/pages/MarketplacePage/components/NpmPackageCard/CardButton.js +++ b/packages/core/admin/admin/src/pages/MarketplacePage/components/NpmPackageCard/CardButton.js @@ -1,9 +1,10 @@ import React from 'react'; -import semver from 'semver'; + +import { Box, Button, Tooltip } from '@strapi/design-system'; +import { Duplicate } from '@strapi/icons'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { Tooltip, Button, Box } from '@strapi/design-system'; -import { Duplicate } from '@strapi/icons'; +import semver from 'semver'; const TooltipButton = ({ description, installMessage, disabled, handleCopy, pluginName }) => ( diff --git a/packages/core/admin/admin/src/pages/MarketplacePage/components/NpmPackageCard/InstallPluginButton.js b/packages/core/admin/admin/src/pages/MarketplacePage/components/NpmPackageCard/InstallPluginButton.js index 6450c627fe..40fd5ae5df 100644 --- a/packages/core/admin/admin/src/pages/MarketplacePage/components/NpmPackageCard/InstallPluginButton.js +++ b/packages/core/admin/admin/src/pages/MarketplacePage/components/NpmPackageCard/InstallPluginButton.js @@ -1,9 +1,11 @@ import React from 'react'; + +import { Box, Icon, Typography } from '@strapi/design-system'; +import { useClipboard, useNotification, useTracking } from '@strapi/helper-plugin'; +import { Check } from '@strapi/icons'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { useNotification, useTracking, useClipboard } from '@strapi/helper-plugin'; -import { Box, Icon, Typography } from '@strapi/design-system'; -import { Check } from '@strapi/icons'; + import CardButton from './CardButton'; const InstallPluginButton = ({ diff --git a/packages/core/admin/admin/src/pages/MarketplacePage/components/NpmPackageCard/PackageStats.js b/packages/core/admin/admin/src/pages/MarketplacePage/components/NpmPackageCard/PackageStats.js index 78505aee89..0e6254e092 100644 --- a/packages/core/admin/admin/src/pages/MarketplacePage/components/NpmPackageCard/PackageStats.js +++ b/packages/core/admin/admin/src/pages/MarketplacePage/components/NpmPackageCard/PackageStats.js @@ -1,10 +1,11 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import styled from 'styled-components'; -import { useIntl } from 'react-intl'; -import { Typography, Icon, Divider, Flex } from '@strapi/design-system'; -import { Github, Download, Star } from '@strapi/icons'; + +import { Divider, Flex, Icon, Typography } from '@strapi/design-system'; import { pxToRem } from '@strapi/helper-plugin'; +import { Download, Github, Star } from '@strapi/icons'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import styled from 'styled-components'; const VerticalDivider = styled(Divider)` width: ${pxToRem(12)}; diff --git a/packages/core/admin/admin/src/pages/MarketplacePage/components/NpmPackageCard/index.js b/packages/core/admin/admin/src/pages/MarketplacePage/components/NpmPackageCard/index.js index b4d9e59dd4..e9cb6ebe54 100644 --- a/packages/core/admin/admin/src/pages/MarketplacePage/components/NpmPackageCard/index.js +++ b/packages/core/admin/admin/src/pages/MarketplacePage/components/NpmPackageCard/index.js @@ -1,13 +1,16 @@ import React from 'react'; + +import { Box, Flex, Icon, Tooltip, Typography } from '@strapi/design-system'; +import { LinkButton } from '@strapi/design-system/v2'; +import { useTracking } from '@strapi/helper-plugin'; +import { CheckCircle, ExternalLink } from '@strapi/icons'; +import pluralize from 'pluralize'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; import styled from 'styled-components'; -import pluralize from 'pluralize'; -import { Box, Typography, Flex, Icon, Tooltip } from '@strapi/design-system'; -import { LinkButton } from '@strapi/design-system/v2'; -import { ExternalLink, CheckCircle } from '@strapi/icons'; -import { useTracking } from '@strapi/helper-plugin'; + import StrapiLogo from '../../../../assets/images/logo-strapi-2022.svg'; + import InstallPluginButton from './InstallPluginButton'; import PackageStats from './PackageStats'; diff --git a/packages/core/admin/admin/src/pages/MarketplacePage/components/NpmPackagesFilters/FilterSelect.js b/packages/core/admin/admin/src/pages/MarketplacePage/components/NpmPackagesFilters/FilterSelect.js index eb716a1ed8..384cf169b1 100644 --- a/packages/core/admin/admin/src/pages/MarketplacePage/components/NpmPackagesFilters/FilterSelect.js +++ b/packages/core/admin/admin/src/pages/MarketplacePage/components/NpmPackagesFilters/FilterSelect.js @@ -1,6 +1,7 @@ import React from 'react'; + +import { Option, Select } from '@strapi/design-system'; import PropTypes from 'prop-types'; -import { Select, Option } from '@strapi/design-system'; const FilterSelect = ({ message, value, onChange, possibleFilters, onClear, customizeContent }) => { const computeFilterMessage = (filterName, count) => { diff --git a/packages/core/admin/admin/src/pages/MarketplacePage/components/NpmPackagesFilters/FiltersPopover.js b/packages/core/admin/admin/src/pages/MarketplacePage/components/NpmPackagesFilters/FiltersPopover.js index 48e131d010..1a49ee16b7 100644 --- a/packages/core/admin/admin/src/pages/MarketplacePage/components/NpmPackagesFilters/FiltersPopover.js +++ b/packages/core/admin/admin/src/pages/MarketplacePage/components/NpmPackagesFilters/FiltersPopover.js @@ -1,8 +1,10 @@ import React from 'react'; + +import { Flex, Popover } from '@strapi/design-system'; import PropTypes from 'prop-types'; -import styled from 'styled-components'; -import { Popover, Flex } from '@strapi/design-system'; import { useIntl } from 'react-intl'; +import styled from 'styled-components'; + import FilterSelect from './FilterSelect'; const FiltersPopover = ({ diff --git a/packages/core/admin/admin/src/pages/MarketplacePage/components/NpmPackagesFilters/index.js b/packages/core/admin/admin/src/pages/MarketplacePage/components/NpmPackagesFilters/index.js index 4134658bd6..082d5aac47 100644 --- a/packages/core/admin/admin/src/pages/MarketplacePage/components/NpmPackagesFilters/index.js +++ b/packages/core/admin/admin/src/pages/MarketplacePage/components/NpmPackagesFilters/index.js @@ -1,9 +1,11 @@ -import React, { useState, useRef } from 'react'; -import styled from 'styled-components'; -import PropTypes from 'prop-types'; -import { useIntl } from 'react-intl'; +import React, { useRef, useState } from 'react'; + import { Box, Button, Tag } from '@strapi/design-system'; import { Cross, Filter } from '@strapi/icons'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import styled from 'styled-components'; + import FiltersPopover from './FiltersPopover'; const FilterTag = ({ name, handleRemove }) => { diff --git a/packages/core/admin/admin/src/pages/MarketplacePage/components/NpmPackagesGrid/index.js b/packages/core/admin/admin/src/pages/MarketplacePage/components/NpmPackagesGrid/index.js index dbbf8f5862..633402b4a1 100644 --- a/packages/core/admin/admin/src/pages/MarketplacePage/components/NpmPackagesGrid/index.js +++ b/packages/core/admin/admin/src/pages/MarketplacePage/components/NpmPackagesGrid/index.js @@ -1,10 +1,12 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import { Grid, GridItem, Flex, Loader } from '@strapi/design-system'; -import { useIntl } from 'react-intl'; + +import { Flex, Grid, GridItem, Loader } from '@strapi/design-system'; import { AnErrorOccurred } from '@strapi/helper-plugin'; -import NpmPackageCard from '../NpmPackageCard'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; + import EmptyNpmPackageSearch from '../EmptyNpmPackageSearch'; +import NpmPackageCard from '../NpmPackageCard'; const NpmPackagesGrid = ({ status, diff --git a/packages/core/admin/admin/src/pages/MarketplacePage/components/NpmPackagesPagination/index.js b/packages/core/admin/admin/src/pages/MarketplacePage/components/NpmPackagesPagination/index.js index 5850b8c744..a23fff2de3 100644 --- a/packages/core/admin/admin/src/pages/MarketplacePage/components/NpmPackagesPagination/index.js +++ b/packages/core/admin/admin/src/pages/MarketplacePage/components/NpmPackagesPagination/index.js @@ -1,7 +1,8 @@ import React from 'react'; -import PropTypes from 'prop-types'; + import { Box, Flex } from '@strapi/design-system'; -import { PaginationURLQuery, PageSizeURLQuery } from '@strapi/helper-plugin'; +import { PageSizeURLQuery, PaginationURLQuery } from '@strapi/helper-plugin'; +import PropTypes from 'prop-types'; const NpmPackagesPagination = ({ pagination }) => { return ( diff --git a/packages/core/admin/admin/src/pages/MarketplacePage/components/OfflineLayout/index.js b/packages/core/admin/admin/src/pages/MarketplacePage/components/OfflineLayout/index.js index 1a8983c20f..c9046ccc56 100644 --- a/packages/core/admin/admin/src/pages/MarketplacePage/components/OfflineLayout/index.js +++ b/packages/core/admin/admin/src/pages/MarketplacePage/components/OfflineLayout/index.js @@ -1,9 +1,11 @@ import React from 'react'; -import { useIntl } from 'react-intl'; + +import { Box, Flex, Layout, Main, Typography } from '@strapi/design-system'; import { pxToRem } from '@strapi/helper-plugin'; -import { Box, Flex, Typography, Layout, Main } from '@strapi/design-system'; -import PageHeader from '../PageHeader'; +import { useIntl } from 'react-intl'; + import offlineCloud from '../../../../assets/images/icon_offline-cloud.svg'; +import PageHeader from '../PageHeader'; const OfflineLayout = () => { const { formatMessage } = useIntl(); diff --git a/packages/core/admin/admin/src/pages/MarketplacePage/components/PageHeader/index.js b/packages/core/admin/admin/src/pages/MarketplacePage/components/PageHeader/index.js index dd964ba412..759cafc0d6 100644 --- a/packages/core/admin/admin/src/pages/MarketplacePage/components/PageHeader/index.js +++ b/packages/core/admin/admin/src/pages/MarketplacePage/components/PageHeader/index.js @@ -1,10 +1,11 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import { useIntl } from 'react-intl'; + import { HeaderLayout } from '@strapi/design-system'; import { LinkButton } from '@strapi/design-system/v2'; -import { Upload } from '@strapi/icons'; import { useTracking } from '@strapi/helper-plugin'; +import { Upload } from '@strapi/icons'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; const PageHeader = ({ isOnline, npmPackageType }) => { const { formatMessage } = useIntl(); diff --git a/packages/core/admin/admin/src/pages/MarketplacePage/components/SortSelect/index.js b/packages/core/admin/admin/src/pages/MarketplacePage/components/SortSelect/index.js index 0d2ca89744..a07e76b0ea 100644 --- a/packages/core/admin/admin/src/pages/MarketplacePage/components/SortSelect/index.js +++ b/packages/core/admin/admin/src/pages/MarketplacePage/components/SortSelect/index.js @@ -1,8 +1,9 @@ import React from 'react'; -import styled from 'styled-components'; -import { Select, Option, Box } from '@strapi/design-system'; -import { useIntl } from 'react-intl'; + +import { Box, Option, Select } from '@strapi/design-system'; import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import styled from 'styled-components'; const SelectWrapper = styled(Box)` font-weight: ${({ theme }) => theme.fontWeights.semiBold}; diff --git a/packages/core/admin/admin/src/pages/MarketplacePage/index.js b/packages/core/admin/admin/src/pages/MarketplacePage/index.js index 74a3253050..ec2b3ceda1 100644 --- a/packages/core/admin/admin/src/pages/MarketplacePage/index.js +++ b/packages/core/admin/admin/src/pages/MarketplacePage/index.js @@ -1,38 +1,40 @@ import React, { useEffect, useRef, useState } from 'react'; -import { useIntl } from 'react-intl'; -import { Helmet } from 'react-helmet'; + import { - CheckPagePermissions, - useFocusWhenNavigate, - useTracking, - useNotification, - useAppInfo, - useQueryParams, -} from '@strapi/helper-plugin'; -import { - Layout, + Box, ContentLayout, + Flex, + Layout, Main, Searchbar, - Box, - Flex, - Tabs, Tab, TabGroup, - TabPanels, TabPanel, + TabPanels, + Tabs, } from '@strapi/design-system'; +import { + CheckPagePermissions, + useAppInfo, + useFocusWhenNavigate, + useNotification, + useQueryParams, + useTracking, +} from '@strapi/helper-plugin'; +import { Helmet } from 'react-helmet'; +import { useIntl } from 'react-intl'; -import PageHeader from './components/PageHeader'; -import adminPermissions from '../../permissions'; -import useNavigatorOnLine from '../../hooks/useNavigatorOnLine'; -import MissingPluginBanner from './components/MissingPluginBanner'; -import NpmPackagesGrid from './components/NpmPackagesGrid'; -import SortSelect from './components/SortSelect'; -import NpmPackagesFilters from './components/NpmPackagesFilters'; -import NpmPackagesPagination from './components/NpmPackagesPagination'; import useDebounce from '../../hooks/useDebounce'; +import useNavigatorOnLine from '../../hooks/useNavigatorOnLine'; +import adminPermissions from '../../permissions'; + +import MissingPluginBanner from './components/MissingPluginBanner'; +import NpmPackagesFilters from './components/NpmPackagesFilters'; +import NpmPackagesGrid from './components/NpmPackagesGrid'; +import NpmPackagesPagination from './components/NpmPackagesPagination'; import OfflineLayout from './components/OfflineLayout'; +import PageHeader from './components/PageHeader'; +import SortSelect from './components/SortSelect'; import useMarketplaceData from './utils/useMarketplaceData'; const MarketPlacePage = () => { diff --git a/packages/core/admin/admin/src/pages/MarketplacePage/tests/index.test.js b/packages/core/admin/admin/src/pages/MarketplacePage/tests/index.test.js index 2f7237a815..4280fabff3 100644 --- a/packages/core/admin/admin/src/pages/MarketplacePage/tests/index.test.js +++ b/packages/core/admin/admin/src/pages/MarketplacePage/tests/index.test.js @@ -1,14 +1,17 @@ import React from 'react'; -import { render, screen, fireEvent, within } from '@testing-library/react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { TrackingProvider, useAppInfo, useTracking } from '@strapi/helper-plugin'; +import { fireEvent, render, screen, within } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; +import { createMemoryHistory } from 'history'; import { IntlProvider } from 'react-intl'; import { QueryClient, QueryClientProvider } from 'react-query'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import { useTracking, useAppInfo, TrackingProvider } from '@strapi/helper-plugin'; import { Router } from 'react-router-dom'; -import { createMemoryHistory } from 'history'; + import useNavigatorOnLine from '../../../hooks/useNavigatorOnLine'; import MarketPlacePage from '../index'; + import server from './server'; const toggleNotification = jest.fn(); diff --git a/packages/core/admin/admin/src/pages/MarketplacePage/tests/plugins.test.js b/packages/core/admin/admin/src/pages/MarketplacePage/tests/plugins.test.js index 3836938df5..75baacedf8 100644 --- a/packages/core/admin/admin/src/pages/MarketplacePage/tests/plugins.test.js +++ b/packages/core/admin/admin/src/pages/MarketplacePage/tests/plugins.test.js @@ -1,13 +1,16 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { TrackingProvider } from '@strapi/helper-plugin'; import { render, screen, within } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; +import { createMemoryHistory } from 'history'; import { IntlProvider } from 'react-intl'; import { QueryClient, QueryClientProvider } from 'react-query'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import { TrackingProvider } from '@strapi/helper-plugin'; import { Router } from 'react-router-dom'; -import { createMemoryHistory } from 'history'; + import MarketPlacePage from '../index'; + import server from './server'; // Increase the jest timeout to accommodate long running tests diff --git a/packages/core/admin/admin/src/pages/MarketplacePage/tests/providers.test.js b/packages/core/admin/admin/src/pages/MarketplacePage/tests/providers.test.js index 489cdf7530..b32edc81ad 100644 --- a/packages/core/admin/admin/src/pages/MarketplacePage/tests/providers.test.js +++ b/packages/core/admin/admin/src/pages/MarketplacePage/tests/providers.test.js @@ -1,15 +1,16 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { TrackingProvider } from '@strapi/helper-plugin'; import { render, screen, within } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; +import { createMemoryHistory } from 'history'; import { IntlProvider } from 'react-intl'; import { QueryClient, QueryClientProvider } from 'react-query'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import { TrackingProvider } from '@strapi/helper-plugin'; - import { Router } from 'react-router-dom'; -import { createMemoryHistory } from 'history'; import MarketPlacePage from '../index'; + import server from './server'; // Increase the jest timeout to accommodate long running tests diff --git a/packages/core/admin/admin/src/pages/MarketplacePage/tests/server.js b/packages/core/admin/admin/src/pages/MarketplacePage/tests/server.js index 57e94c26d4..09c9d84fff 100644 --- a/packages/core/admin/admin/src/pages/MarketplacePage/tests/server.js +++ b/packages/core/admin/admin/src/pages/MarketplacePage/tests/server.js @@ -1,6 +1,7 @@ -import { setupServer } from 'msw/node'; import { rest } from 'msw'; +import { setupServer } from 'msw/node'; import qs from 'qs'; + import { responses as pluginResponses } from './mocks/plugins'; import { responses as providerResponses } from './mocks/providers'; diff --git a/packages/core/admin/admin/src/pages/MarketplacePage/utils/useMarketplaceData.js b/packages/core/admin/admin/src/pages/MarketplacePage/utils/useMarketplaceData.js index 983200c6ca..e338ec0ae2 100644 --- a/packages/core/admin/admin/src/pages/MarketplacePage/utils/useMarketplaceData.js +++ b/packages/core/admin/admin/src/pages/MarketplacePage/utils/useMarketplaceData.js @@ -1,6 +1,8 @@ -import { useState, useEffect } from 'react'; -import { useIntl } from 'react-intl'; +import { useEffect, useState } from 'react'; + import { useNotifyAT } from '@strapi/design-system'; +import { useIntl } from 'react-intl'; + import useFetchMarketplacePlugins from '../../../hooks/marketplace/useFetchMarketplacePlugins'; import useFetchMarketplaceProviders from '../../../hooks/marketplace/useFetchMarketplaceProviders'; diff --git a/packages/core/admin/admin/src/pages/NotFoundPage/index.js b/packages/core/admin/admin/src/pages/NotFoundPage/index.js index 739658ba9e..a48d81b1b2 100644 --- a/packages/core/admin/admin/src/pages/NotFoundPage/index.js +++ b/packages/core/admin/admin/src/pages/NotFoundPage/index.js @@ -5,9 +5,10 @@ * */ import React from 'react'; -import { useFocusWhenNavigate, LinkButton } from '@strapi/helper-plugin'; -import { Main, ContentLayout, HeaderLayout, EmptyStateLayout } from '@strapi/design-system'; -import { EmptyPictures, ArrowRight } from '@strapi/icons'; + +import { ContentLayout, EmptyStateLayout, HeaderLayout, Main } from '@strapi/design-system'; +import { LinkButton, useFocusWhenNavigate } from '@strapi/helper-plugin'; +import { ArrowRight, EmptyPictures } from '@strapi/icons'; import { useIntl } from 'react-intl'; const NoContentType = () => { diff --git a/packages/core/admin/admin/src/pages/NotFoundPage/tests/index.test.js b/packages/core/admin/admin/src/pages/NotFoundPage/tests/index.test.js index 3b563eac6f..028c91b616 100644 --- a/packages/core/admin/admin/src/pages/NotFoundPage/tests/index.test.js +++ b/packages/core/admin/admin/src/pages/NotFoundPage/tests/index.test.js @@ -1,9 +1,11 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render } from '@testing-library/react'; -import { Router } from 'react-router-dom'; import { createMemoryHistory } from 'history'; import { IntlProvider } from 'react-intl'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; +import { Router } from 'react-router-dom'; + import NotFoundPage from '../index'; const history = createMemoryHistory(); diff --git a/packages/core/admin/admin/src/pages/ProfilePage/components/Password/index.js b/packages/core/admin/admin/src/pages/ProfilePage/components/Password/index.js index 9a42ee9691..1a44387205 100644 --- a/packages/core/admin/admin/src/pages/ProfilePage/components/Password/index.js +++ b/packages/core/admin/admin/src/pages/ProfilePage/components/Password/index.js @@ -1,18 +1,19 @@ import React, { useState } from 'react'; -import PropTypes from 'prop-types'; -import styled from 'styled-components'; + import { - Typography, Box, + FieldAction, + Flex, Grid, GridItem, - Flex, - FieldAction, TextInput, + Typography, } from '@strapi/design-system'; -import { Eye, EyeStriked } from '@strapi/icons'; -import { useIntl } from 'react-intl'; import { pxToRem } from '@strapi/helper-plugin'; +import { Eye, EyeStriked } from '@strapi/icons'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import styled from 'styled-components'; const PasswordInput = styled(TextInput)` ::-ms-reveal { diff --git a/packages/core/admin/admin/src/pages/ProfilePage/components/Preferences/index.js b/packages/core/admin/admin/src/pages/ProfilePage/components/Preferences/index.js index 9ce72a602e..fc39f4fc01 100644 --- a/packages/core/admin/admin/src/pages/ProfilePage/components/Preferences/index.js +++ b/packages/core/admin/admin/src/pages/ProfilePage/components/Preferences/index.js @@ -1,8 +1,9 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import { Typography, Box, Grid, GridItem, Flex, Select, Option } from '@strapi/design-system'; -import { useIntl } from 'react-intl'; + +import { Box, Flex, Grid, GridItem, Option, Select, Typography } from '@strapi/design-system'; import upperFirst from 'lodash/upperFirst'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; const Preferences = ({ onChange, values, localeNames, allApplicationThemes }) => { const { formatMessage } = useIntl(); diff --git a/packages/core/admin/admin/src/pages/ProfilePage/components/UserInfo/index.js b/packages/core/admin/admin/src/pages/ProfilePage/components/UserInfo/index.js index 670f1b592a..739d589623 100644 --- a/packages/core/admin/admin/src/pages/ProfilePage/components/UserInfo/index.js +++ b/packages/core/admin/admin/src/pages/ProfilePage/components/UserInfo/index.js @@ -1,7 +1,8 @@ import React from 'react'; -import PropTypes from 'prop-types'; + +import { Box, Flex, Grid, GridItem, Typography } from '@strapi/design-system'; import { GenericInput } from '@strapi/helper-plugin'; -import { Typography, Box, Grid, GridItem, Flex } from '@strapi/design-system'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; const UserInfo = ({ errors, onChange, values }) => { diff --git a/packages/core/admin/admin/src/pages/ProfilePage/index.js b/packages/core/admin/admin/src/pages/ProfilePage/index.js index eb0dd53731..4382f2f4ef 100644 --- a/packages/core/admin/admin/src/pages/ProfilePage/index.js +++ b/packages/core/admin/admin/src/pages/ProfilePage/index.js @@ -1,37 +1,40 @@ import React from 'react'; + import { + Box, + Button, + ContentLayout, + Flex, + HeaderLayout, + Main, + useNotifyAT, +} from '@strapi/design-system'; +import { + auth, Form, LoadingIndicatorPage, useAppInfo, + useFetchClient, useFocusWhenNavigate, useNotification, useOverlayBlocker, - auth, useTracking, - useFetchClient, } from '@strapi/helper-plugin'; -import { useIntl } from 'react-intl'; -import { Formik } from 'formik'; -import { useQuery, useMutation, useQueryClient } from 'react-query'; -import { Helmet } from 'react-helmet'; -import { - Main, - Box, - ContentLayout, - HeaderLayout, - Button, - Flex, - useNotifyAT, -} from '@strapi/design-system'; import { Check } from '@strapi/icons'; -import UserInfo from './components/UserInfo'; -import Preferences from './components/Preferences'; -import Password from './components/Password'; +import { Formik } from 'formik'; +import { Helmet } from 'react-helmet'; +import { useIntl } from 'react-intl'; +import { useMutation, useQuery, useQueryClient } from 'react-query'; + import useLocalesProvider from '../../components/LocalesProvider/useLocalesProvider'; import { useThemeToggle } from '../../hooks'; -import schema from './utils/schema'; import { getFullName } from '../../utils'; +import Password from './components/Password'; +import Preferences from './components/Preferences'; +import UserInfo from './components/UserInfo'; +import schema from './utils/schema'; + const ProfilePage = () => { const { changeLocale, localeNames } = useLocalesProvider(); const { setUserDisplayName } = useAppInfo(); diff --git a/packages/core/admin/admin/src/pages/ProfilePage/tests/index.test.js b/packages/core/admin/admin/src/pages/ProfilePage/tests/index.test.js index 33a4a47ea8..7bc06d6cce 100644 --- a/packages/core/admin/admin/src/pages/ProfilePage/tests/index.test.js +++ b/packages/core/admin/admin/src/pages/ProfilePage/tests/index.test.js @@ -1,13 +1,16 @@ import React from 'react'; -import { render, waitFor, screen } from '@testing-library/react'; + +import { darkTheme, lightTheme } from '@strapi/design-system'; +import { render, screen, waitFor } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; import { QueryClient, QueryClientProvider } from 'react-query'; -import { lightTheme, darkTheme } from '@strapi/design-system'; + +import Theme from '../../../components/Theme'; +import ThemeToggleProvider from '../../../components/ThemeToggleProvider'; import ProfilePage from '../index'; + import server from './utils/server'; import serverLockedSSO from './utils/serverLockedSSO'; -import ThemeToggleProvider from '../../../components/ThemeToggleProvider'; -import Theme from '../../../components/Theme'; jest.mock('../../../components/LocalesProvider/useLocalesProvider'); diff --git a/packages/core/admin/admin/src/pages/ProfilePage/tests/utils/server.js b/packages/core/admin/admin/src/pages/ProfilePage/tests/utils/server.js index e91c9ac520..1f52b32791 100644 --- a/packages/core/admin/admin/src/pages/ProfilePage/tests/utils/server.js +++ b/packages/core/admin/admin/src/pages/ProfilePage/tests/utils/server.js @@ -1,5 +1,5 @@ -import { setupServer } from 'msw/node'; import { rest } from 'msw'; +import { setupServer } from 'msw/node'; const handlers = [ rest.get('*/me', (req, res, ctx) => { diff --git a/packages/core/admin/admin/src/pages/ProfilePage/tests/utils/serverLockedSSO.js b/packages/core/admin/admin/src/pages/ProfilePage/tests/utils/serverLockedSSO.js index dfc1cdfc24..ec1b2ba569 100644 --- a/packages/core/admin/admin/src/pages/ProfilePage/tests/utils/serverLockedSSO.js +++ b/packages/core/admin/admin/src/pages/ProfilePage/tests/utils/serverLockedSSO.js @@ -1,5 +1,5 @@ -import { setupServer } from 'msw/node'; import { rest } from 'msw'; +import { setupServer } from 'msw/node'; const handlers = [ rest.get('*/me', (req, res, ctx) => { diff --git a/packages/core/admin/admin/src/pages/ProfilePage/utils/schema.js b/packages/core/admin/admin/src/pages/ProfilePage/utils/schema.js index c9d0f6963c..dba5a0d276 100644 --- a/packages/core/admin/admin/src/pages/ProfilePage/utils/schema.js +++ b/packages/core/admin/admin/src/pages/ProfilePage/utils/schema.js @@ -1,4 +1,5 @@ import * as yup from 'yup'; + import { profileValidation } from '../../SettingsPage/pages/Users/utils/validations/users'; const schema = yup.object().shape(profileValidation); diff --git a/packages/core/admin/admin/src/pages/SettingsPage/components/Filters/index.js b/packages/core/admin/admin/src/pages/SettingsPage/components/Filters/index.js index 48e851f492..4232fddd8d 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/components/Filters/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/components/Filters/index.js @@ -1,9 +1,10 @@ import React, { useRef, useState } from 'react'; + +import { Box, Button } from '@strapi/design-system'; +import { FilterListURLQuery, FilterPopoverURLQuery } from '@strapi/helper-plugin'; +import { Filter } from '@strapi/icons'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { Button, Box } from '@strapi/design-system'; -import { Filter } from '@strapi/icons'; -import { FilterListURLQuery, FilterPopoverURLQuery } from '@strapi/helper-plugin'; const Filters = ({ displayedFilters }) => { const [isVisible, setIsVisible] = useState(false); diff --git a/packages/core/admin/admin/src/pages/SettingsPage/components/SettingsNav/index.js b/packages/core/admin/admin/src/pages/SettingsPage/components/SettingsNav/index.js index 73511c98fa..1ceea2a1ad 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/components/SettingsNav/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/components/SettingsNav/index.js @@ -1,15 +1,17 @@ import React from 'react'; -import { NavLink, useLocation } from 'react-router-dom'; -import { useIntl } from 'react-intl'; -import PropTypes from 'prop-types'; -import { useTracking } from '@strapi/helper-plugin'; + import { SubNav, SubNavHeader, + SubNavLink, SubNavSection, SubNavSections, - SubNavLink, } from '@strapi/design-system/v2'; +import { useTracking } from '@strapi/helper-plugin'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import { NavLink, useLocation } from 'react-router-dom'; + import { getSectionsToDisplay } from '../../utils'; const SettingsNav = ({ menu }) => { diff --git a/packages/core/admin/admin/src/pages/SettingsPage/components/SettingsNav/tests/index.test.js b/packages/core/admin/admin/src/pages/SettingsPage/components/SettingsNav/tests/index.test.js index c503ff095a..fe32c197da 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/components/SettingsNav/tests/index.test.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/components/SettingsNav/tests/index.test.js @@ -1,9 +1,11 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render } from '@testing-library/react'; +import { createMemoryHistory } from 'history'; import { IntlProvider } from 'react-intl'; import { Router } from 'react-router-dom'; -import { createMemoryHistory } from 'history'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; + import SettingsNav from '../index'; const menu = [ diff --git a/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/FormHead/index.js b/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/FormHead/index.js index deb1df8307..a62118928e 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/FormHead/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/FormHead/index.js @@ -1,9 +1,11 @@ import React from 'react'; -import { useIntl } from 'react-intl'; -import PropTypes from 'prop-types'; + +import { Button, Flex, HeaderLayout } from '@strapi/design-system'; import { Link } from '@strapi/helper-plugin'; import { ArrowLeft, Check } from '@strapi/icons'; -import { Button, HeaderLayout, Flex } from '@strapi/design-system'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; + import Regenerate from '../Regenerate'; const FormHead = ({ diff --git a/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/LifeSpanInput/index.js b/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/LifeSpanInput/index.js index 45492e2b88..72b901ddb8 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/LifeSpanInput/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/LifeSpanInput/index.js @@ -1,7 +1,9 @@ import React from 'react'; + +import { Option, Select, Typography } from '@strapi/design-system'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { Select, Option, Typography } from '@strapi/design-system'; + import { getDateOfExpiration } from '../../../pages/ApiTokens/EditView/utils'; const LifeSpanInput = ({ token, errors, values, onChange, isCreating }) => { diff --git a/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/Regenerate/index.js b/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/Regenerate/index.js index 33fb99ddac..e232566eb3 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/Regenerate/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/Regenerate/index.js @@ -1,9 +1,11 @@ import React, { useState } from 'react'; + +import { Button } from '@strapi/design-system'; +import { ConfirmDialog } from '@strapi/helper-plugin'; +import { Refresh } from '@strapi/icons'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { Button } from '@strapi/design-system'; -import { Refresh } from '@strapi/icons'; -import { ConfirmDialog } from '@strapi/helper-plugin'; + import { useRegenerate } from '../../../../../hooks'; export const Regenerate = ({ onRegenerate, idToRegenerate, backUrl, onError }) => { diff --git a/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/Table/DefaultButton/index.js b/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/Table/DefaultButton/index.js index e49dd1de84..121e31433b 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/Table/DefaultButton/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/Table/DefaultButton/index.js @@ -1,9 +1,10 @@ import React from 'react'; -import { useIntl } from 'react-intl'; + +import { Link } from '@strapi/helper-plugin'; import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; import { useHistory } from 'react-router-dom'; import styled from 'styled-components'; -import { Link } from '@strapi/helper-plugin'; const MESSAGES_MAP = { edit: { diff --git a/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/Table/DeleteButton/index.js b/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/Table/DeleteButton/index.js index 926c70a373..8803f70bc8 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/Table/DeleteButton/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/Table/DeleteButton/index.js @@ -1,9 +1,10 @@ import React, { useState } from 'react'; + +import { Box, IconButton } from '@strapi/design-system'; +import { ConfirmDialog, useTracking } from '@strapi/helper-plugin'; import { Trash } from '@strapi/icons'; -import { IconButton, Box } from '@strapi/design-system'; -import { useTracking, ConfirmDialog } from '@strapi/helper-plugin'; -import { useIntl } from 'react-intl'; import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; const DeleteButton = ({ tokenName, onClickDelete, tokenType }) => { const { formatMessage } = useIntl(); diff --git a/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/Table/DeleteButton/tests/DeleteButton.test.js b/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/Table/DeleteButton/tests/DeleteButton.test.js index 3a4ba74cee..1ae78f0ec5 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/Table/DeleteButton/tests/DeleteButton.test.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/Table/DeleteButton/tests/DeleteButton.test.js @@ -1,8 +1,9 @@ import React from 'react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { NotificationsProvider } from '@strapi/helper-plugin'; import { act, fireEvent, render } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; -import { NotificationsProvider } from '@strapi/helper-plugin'; import DeleteButton from '../index'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/Table/ReadButton/index.js b/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/Table/ReadButton/index.js index c94a763ce9..b018d85762 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/Table/ReadButton/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/Table/ReadButton/index.js @@ -1,6 +1,8 @@ import React from 'react'; + import { Eye } from '@strapi/icons'; import PropTypes from 'prop-types'; + import DefaultButton from '../DefaultButton'; const ReadButton = ({ tokenName, tokenId }) => { diff --git a/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/Table/UpdateButton/index.js b/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/Table/UpdateButton/index.js index f732c32c3d..73ef82fb22 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/Table/UpdateButton/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/Table/UpdateButton/index.js @@ -1,6 +1,8 @@ import React from 'react'; + import { Pencil } from '@strapi/icons'; import PropTypes from 'prop-types'; + import DefaultButton from '../DefaultButton'; const UpdateButton = ({ tokenName, tokenId }) => { diff --git a/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/Table/index.js b/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/Table/index.js index f46a0765a3..d585534f75 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/Table/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/Table/index.js @@ -1,18 +1,20 @@ import React from 'react'; -import { useHistory } from 'react-router-dom'; -import PropTypes from 'prop-types'; -import { Typography, Flex, Tbody, Tr, Td } from '@strapi/design-system'; + +import { Flex, Tbody, Td, Tr, Typography } from '@strapi/design-system'; import { - RelativeTime, + DynamicTable, onRowClick, pxToRem, - DynamicTable, + RelativeTime, useQueryParams, useTracking, } from '@strapi/helper-plugin'; +import PropTypes from 'prop-types'; +import { useHistory } from 'react-router-dom'; + import DeleteButton from './DeleteButton'; -import UpdateButton from './UpdateButton'; import ReadButton from './ReadButton'; +import UpdateButton from './UpdateButton'; const Table = ({ permissions, diff --git a/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/TokenBox/index.js b/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/TokenBox/index.js index 62b24d4ff2..b624ef1f06 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/TokenBox/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/TokenBox/index.js @@ -1,9 +1,10 @@ import React from 'react'; -import { useIntl } from 'react-intl'; -import { ContentBox, useNotification, useTracking, useClipboard } from '@strapi/helper-plugin'; + import { IconButton } from '@strapi/design-system'; +import { ContentBox, useClipboard, useNotification, useTracking } from '@strapi/helper-plugin'; import { Duplicate, Key } from '@strapi/icons'; import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; const TokenBox = ({ token, tokenType }) => { const { formatMessage } = useIntl(); diff --git a/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/TokenDescription/index.js b/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/TokenDescription/index.js index a329e5452e..59b22bbb07 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/TokenDescription/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/TokenDescription/index.js @@ -1,7 +1,8 @@ import React from 'react'; + +import { Textarea } from '@strapi/design-system'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { Textarea } from '@strapi/design-system'; const TokenDescription = ({ errors, values, onChange, canEditInputs }) => { const { formatMessage } = useIntl(); diff --git a/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/TokenName/index.js b/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/TokenName/index.js index 47cc2b8f6a..942f1065f6 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/TokenName/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/TokenName/index.js @@ -1,7 +1,8 @@ import React from 'react'; + +import { TextInput } from '@strapi/design-system'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { TextInput } from '@strapi/design-system'; const TokenName = ({ errors, values, onChange, canEditInputs }) => { const { formatMessage } = useIntl(); diff --git a/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/TokenTypeSelect/index.js b/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/TokenTypeSelect/index.js index 83ef6cb546..85637a356e 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/TokenTypeSelect/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/components/Tokens/TokenTypeSelect/index.js @@ -1,9 +1,9 @@ import React from 'react'; + +import { Option, Select } from '@strapi/design-system'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { Select, Option } from '@strapi/design-system'; - const TokenTypeSelect = ({ name, errors, values, onChange, canEditInputs, options, label }) => { const { formatMessage } = useIntl(); diff --git a/packages/core/admin/admin/src/pages/SettingsPage/index.js b/packages/core/admin/admin/src/pages/SettingsPage/index.js index 4c01daca6a..6f76be3f9e 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/index.js @@ -10,16 +10,19 @@ // IF THE DOC IS NOT UPDATED THE PULL REQUEST WILL NOT BE MERGED import React, { memo, useMemo } from 'react'; -import { LoadingIndicatorPage, useStrapiApp } from '@strapi/helper-plugin'; -import { Switch, Redirect, Route, useParams } from 'react-router-dom'; + import { Layout } from '@strapi/design-system'; -import { useIntl } from 'react-intl'; +import { LoadingIndicatorPage, useStrapiApp } from '@strapi/helper-plugin'; import { Helmet } from 'react-helmet'; +import { useIntl } from 'react-intl'; +import { Redirect, Route, Switch, useParams } from 'react-router-dom'; + import { useSettingsMenu } from '../../hooks'; import { createRoute, makeUniqueRoutes } from '../../utils'; + +import SettingsNav from './components/SettingsNav'; import ApplicationInfosPage from './pages/ApplicationInfosPage'; import { createSectionsRoutes, routes } from './utils'; -import SettingsNav from './components/SettingsNav'; function SettingsPage() { const { settingId } = useParams(); diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/ActionBoundRoutes/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/ActionBoundRoutes/index.js index 5217eb4662..75542b39ac 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/ActionBoundRoutes/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/ActionBoundRoutes/index.js @@ -1,8 +1,10 @@ import React from 'react'; + +import { Flex, GridItem, Typography } from '@strapi/design-system'; import { useIntl } from 'react-intl'; -import { Typography, Flex, GridItem } from '@strapi/design-system'; -import BoundRoute from '../BoundRoute'; + import { useApiTokenPermissionsContext } from '../../../../../../../contexts/ApiTokenPermissions'; +import BoundRoute from '../BoundRoute'; const ActionBoundRoutes = () => { const { diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/BoundRoute/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/BoundRoute/index.js index 8168db7da3..0f3467bc5a 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/BoundRoute/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/BoundRoute/index.js @@ -1,10 +1,12 @@ import React from 'react'; -import styled from 'styled-components'; -import { Flex, Box, Typography } from '@strapi/design-system'; + +import { Box, Flex, Typography } from '@strapi/design-system'; import map from 'lodash/map'; import tail from 'lodash/tail'; -import { useIntl } from 'react-intl'; import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import styled from 'styled-components'; + import getMethodColor from './getMethodColor'; const MethodBox = styled(Box)` diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/CollapsableContentType/CheckBoxWrapper.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/CollapsableContentType/CheckBoxWrapper.js index 5a1b456336..e3165e258d 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/CollapsableContentType/CheckBoxWrapper.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/CollapsableContentType/CheckBoxWrapper.js @@ -1,5 +1,5 @@ -import styled, { css } from 'styled-components'; import { Box } from '@strapi/design-system'; +import styled, { css } from 'styled-components'; const activeCheckboxWrapperStyles = css` background: ${(props) => props.theme.colors.primary100}; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/CollapsableContentType/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/CollapsableContentType/index.js index 87288b7484..147720b84e 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/CollapsableContentType/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/CollapsableContentType/index.js @@ -1,21 +1,24 @@ -import React, { useState, useEffect } from 'react'; -import capitalize from 'lodash/capitalize'; -import { useIntl } from 'react-intl'; +import React, { useEffect, useState } from 'react'; + import { Accordion, - AccordionToggle, AccordionContent, + AccordionToggle, + Box, Checkbox, + Flex, Grid, GridItem, Typography, - Box, - Flex, } from '@strapi/design-system'; import { Cog } from '@strapi/icons'; -import styled from 'styled-components'; +import capitalize from 'lodash/capitalize'; import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import styled from 'styled-components'; + import { useApiTokenPermissionsContext } from '../../../../../../../contexts/ApiTokenPermissions'; + import CheckboxWrapper from './CheckBoxWrapper'; const Border = styled.div` diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/ContenTypesSection/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/ContenTypesSection/index.js index 5339c7d550..c9e4383654 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/ContenTypesSection/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/ContenTypesSection/index.js @@ -1,6 +1,8 @@ import React, { useState } from 'react'; -import PropTypes from 'prop-types'; + import { Box } from '@strapi/design-system'; +import PropTypes from 'prop-types'; + import CollapsableContentType from '../CollapsableContentType'; const ContentTypesSection = ({ section, ...props }) => { diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/FormApiTokenContainer/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/FormApiTokenContainer/index.js index 3994cdc415..f0bfe1ea20 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/FormApiTokenContainer/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/FormApiTokenContainer/index.js @@ -1,10 +1,12 @@ import React from 'react'; -import { useIntl } from 'react-intl'; + +import { Box, Flex, Grid, GridItem, Typography } from '@strapi/design-system'; import PropTypes from 'prop-types'; -import { Box, Grid, GridItem, Flex, Typography } from '@strapi/design-system'; +import { useIntl } from 'react-intl'; + import LifeSpanInput from '../../../../../components/Tokens/LifeSpanInput'; -import TokenName from '../../../../../components/Tokens/TokenName'; import TokenDescription from '../../../../../components/Tokens/TokenDescription'; +import TokenName from '../../../../../components/Tokens/TokenName'; import TokenTypeSelect from '../../../../../components/Tokens/TokenTypeSelect'; const FormApiTokenContainer = ({ diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/LoadingView/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/LoadingView/index.js index 92d8157bf1..6c01c069b7 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/LoadingView/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/LoadingView/index.js @@ -1,13 +1,14 @@ import React from 'react'; + +import { Button, ContentLayout, HeaderLayout, Main } from '@strapi/design-system'; import { - SettingsPageTitle, LoadingIndicatorPage, + SettingsPageTitle, useFocusWhenNavigate, } from '@strapi/helper-plugin'; -import { HeaderLayout, ContentLayout, Main, Button } from '@strapi/design-system'; import { Check } from '@strapi/icons'; -import { useIntl } from 'react-intl'; import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; const LoadingView = ({ apiTokenName }) => { const { formatMessage } = useIntl(); diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/Permissions/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/Permissions/index.js index 2d13a5c889..11bc80363a 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/Permissions/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/Permissions/index.js @@ -1,9 +1,11 @@ import React, { memo } from 'react'; + +import { Flex, Grid, GridItem, Typography } from '@strapi/design-system'; import { useIntl } from 'react-intl'; -import { Typography, Flex, Grid, GridItem } from '@strapi/design-system'; -import ContentTypesSection from '../ContenTypesSection'; -import ActionBoundRoutes from '../ActionBoundRoutes'; + import { useApiTokenPermissionsContext } from '../../../../../../../contexts/ApiTokenPermissions'; +import ActionBoundRoutes from '../ActionBoundRoutes'; +import ContentTypesSection from '../ContenTypesSection'; const Permissions = ({ ...props }) => { const { diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/Regenerate/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/Regenerate/index.js index fc2cfa6df9..99a56a9f04 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/Regenerate/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/Regenerate/index.js @@ -1,9 +1,11 @@ import React, { useState } from 'react'; + +import { Button } from '@strapi/design-system'; +import { ConfirmDialog } from '@strapi/helper-plugin'; +import { Refresh } from '@strapi/icons'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { Button } from '@strapi/design-system'; -import { Refresh } from '@strapi/icons'; -import { ConfirmDialog } from '@strapi/helper-plugin'; + import { useRegenerate } from '../../../../../../../hooks'; export const Regenerate = ({ onRegenerate, idToRegenerate }) => { diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/index.js index 1445e1e7a2..06481fe9be 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/index.js @@ -1,32 +1,35 @@ -import React, { useEffect, useState, useRef, useReducer } from 'react'; -import { useIntl } from 'react-intl'; +import React, { useEffect, useReducer, useRef, useState } from 'react'; + +import { ContentLayout, Flex, Main } from '@strapi/design-system'; import { - SettingsPageTitle, - useFocusWhenNavigate, Form, - useOverlayBlocker, - useNotification, - useTracking, - useGuidedTour, - useRBAC, + SettingsPageTitle, useFetchClient, + useFocusWhenNavigate, + useGuidedTour, + useNotification, + useOverlayBlocker, + useRBAC, + useTracking, } from '@strapi/helper-plugin'; -import { Main, ContentLayout, Flex } from '@strapi/design-system'; import { Formik } from 'formik'; -import { useRouteMatch, useHistory } from 'react-router-dom'; +import { useIntl } from 'react-intl'; import { useQuery } from 'react-query'; -import { formatAPIErrors } from '../../../../../utils'; -import { schema } from './utils'; -import LoadingView from './components/LoadingView'; -import adminPermissions from '../../../../../permissions'; +import { useHistory, useRouteMatch } from 'react-router-dom'; + import { ApiTokenPermissionsContextProvider } from '../../../../../contexts/ApiTokenPermissions'; +import adminPermissions from '../../../../../permissions'; +import { formatAPIErrors } from '../../../../../utils'; +import { API_TOKEN_TYPE } from '../../../components/Tokens/constants'; +import FormHead from '../../../components/Tokens/FormHead'; +import TokenBox from '../../../components/Tokens/TokenBox'; + +import FormApiTokenContainer from './components/FormApiTokenContainer'; +import LoadingView from './components/LoadingView'; +import Permissions from './components/Permissions'; import init from './init'; import reducer, { initialState } from './reducer'; -import Permissions from './components/Permissions'; -import FormApiTokenContainer from './components/FormApiTokenContainer'; -import TokenBox from '../../../components/Tokens/TokenBox'; -import FormHead from '../../../components/Tokens/FormHead'; -import { API_TOKEN_TYPE } from '../../../components/Tokens/constants'; +import { schema } from './utils'; const MSG_ERROR_NAME_TAKEN = 'Name already taken'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/reducer.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/reducer.js index d094d822d4..160a505186 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/reducer.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/reducer.js @@ -1,6 +1,7 @@ /* eslint-disable consistent-return */ import produce from 'immer'; import pull from 'lodash/pull'; + import { transformPermissionsData } from './utils'; export const initialState = { diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/tests/index.test.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/tests/index.test.js index 45b2b0b0b6..668bcef1c0 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/tests/index.test.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/tests/index.test.js @@ -1,10 +1,12 @@ import React from 'react'; + +import { darkTheme, lightTheme } from '@strapi/design-system'; import { act, render, waitFor } from '@testing-library/react'; -import { IntlProvider } from 'react-intl'; -import { Router, Route } from 'react-router-dom'; import { createMemoryHistory } from 'history'; +import { IntlProvider } from 'react-intl'; import { QueryClient, QueryClientProvider } from 'react-query'; -import { lightTheme, darkTheme } from '@strapi/design-system'; +import { Route, Router } from 'react-router-dom'; + import Theme from '../../../../../../components/Theme'; import ThemeToggleProvider from '../../../../../../components/ThemeToggleProvider'; import EditView from '../index'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/tests/reducer.test.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/tests/reducer.test.js index b026d2781c..bf0690f65b 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/tests/reducer.test.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/tests/reducer.test.js @@ -1,6 +1,6 @@ +import init from '../init'; import reducer from '../reducer'; import { data } from '../utils/tests/dataMock'; -import init from '../init'; describe('ADMIN | Pages | API TOKENS | EditView | reducer', () => { const initialState = init({}, data.data); diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/utils/schema.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/utils/schema.js index 626080eef1..5e1621102f 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/utils/schema.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/utils/schema.js @@ -1,5 +1,5 @@ -import * as yup from 'yup'; import { translatedErrors } from '@strapi/helper-plugin'; +import * as yup from 'yup'; const schema = yup.object().shape({ name: yup.string(translatedErrors.string).max(100).required(translatedErrors.required), diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/utils/tests/transformPermissionsData.test.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/utils/tests/transformPermissionsData.test.js index a9f82074ef..af7f99984d 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/utils/tests/transformPermissionsData.test.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/utils/tests/transformPermissionsData.test.js @@ -1,4 +1,5 @@ import transformPermissionsData from '../transformPermissionsData'; + import { data } from './dataMock'; describe('ADMIN | Container | SettingsPage | ApiTokens | EditView | utils | transformPermissionsData', () => { diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/index.js index ba8437c608..f54788c6d4 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/index.js @@ -1,28 +1,29 @@ import React, { useEffect, useRef } from 'react'; -import { useIntl } from 'react-intl'; -import { useQuery, useMutation, useQueryClient } from 'react-query'; -import { useHistory } from 'react-router-dom'; -import qs from 'qs'; +import { Button, ContentLayout, HeaderLayout, Main } from '@strapi/design-system'; import { - SettingsPageTitle, - useFocusWhenNavigate, - useNotification, - NoPermissions, - useRBAC, - NoContent, - useTracking, - useGuidedTour, - useFetchClient, LinkButton, + NoContent, + NoPermissions, + SettingsPageTitle, + useFetchClient, + useFocusWhenNavigate, + useGuidedTour, + useNotification, + useRBAC, + useTracking, } from '@strapi/helper-plugin'; -import { HeaderLayout, ContentLayout, Main, Button } from '@strapi/design-system'; import { Plus } from '@strapi/icons'; +import qs from 'qs'; +import { useIntl } from 'react-intl'; +import { useMutation, useQuery, useQueryClient } from 'react-query'; +import { useHistory } from 'react-router-dom'; import adminPermissions from '../../../../../permissions'; -import tableHeaders from './utils/tableHeaders'; -import Table from '../../../components/Tokens/Table'; import { API_TOKEN_TYPE } from '../../../components/Tokens/constants'; +import Table from '../../../components/Tokens/Table'; + +import tableHeaders from './utils/tableHeaders'; const ApiTokenListView = () => { useFocusWhenNavigate(); diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/tests/index.test.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/tests/index.test.js index 8c641b1535..40be385278 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/tests/index.test.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/tests/index.test.js @@ -1,11 +1,13 @@ import React from 'react'; + +import { darkTheme, lightTheme } from '@strapi/design-system'; +import { TrackingProvider, useRBAC } from '@strapi/helper-plugin'; import { act, render, waitFor } from '@testing-library/react'; -import { IntlProvider } from 'react-intl'; -import { Router, Route } from 'react-router-dom'; import { createMemoryHistory } from 'history'; -import { useRBAC, TrackingProvider } from '@strapi/helper-plugin'; +import { IntlProvider } from 'react-intl'; import { QueryClient, QueryClientProvider } from 'react-query'; -import { lightTheme, darkTheme } from '@strapi/design-system'; +import { Route, Router } from 'react-router-dom'; + import Theme from '../../../../../../components/Theme'; import ThemeToggleProvider from '../../../../../../components/ThemeToggleProvider'; import ListView from '../index'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/ProtectedCreateView/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/ProtectedCreateView/index.js index 447ecda79c..2360543456 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/ProtectedCreateView/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/ProtectedCreateView/index.js @@ -1,5 +1,7 @@ import React from 'react'; + import { CheckPagePermissions } from '@strapi/helper-plugin'; + import adminPermissions from '../../../../../permissions'; import EditView from '../EditView'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/ProtectedEditView/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/ProtectedEditView/index.js index b4ed12240d..1fae7471f6 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/ProtectedEditView/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/ProtectedEditView/index.js @@ -1,5 +1,7 @@ import React from 'react'; + import { CheckPagePermissions } from '@strapi/helper-plugin'; + import adminPermissions from '../../../../../permissions'; import EditView from '../EditView'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/ProtectedListView/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/ProtectedListView/index.js index b73a6fe69f..6483ef73c7 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/ProtectedListView/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/ProtectedListView/index.js @@ -1,5 +1,7 @@ import React from 'react'; + import { CheckPagePermissions } from '@strapi/helper-plugin'; + import adminPermissions from '../../../../../permissions'; import ListView from '../ListView'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/CustomizationInfos/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/CustomizationInfos/index.js index 9e7ae414f0..7ed6b7f0e9 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/CustomizationInfos/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/CustomizationInfos/index.js @@ -1,13 +1,16 @@ -import React, { useReducer, forwardRef, useImperativeHandle } from 'react'; +import React, { forwardRef, useImperativeHandle, useReducer } from 'react'; + +import { Box, Grid, GridItem, Typography } from '@strapi/design-system'; +import { useTracking } from '@strapi/helper-plugin'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { useTracking } from '@strapi/helper-plugin'; -import { Grid, GridItem, Box, Typography } from '@strapi/design-system'; + import { useConfigurations } from '../../../../../../hooks'; import { DIMENSION, SIZE } from '../../utils/constants'; import LogoInput from '../LogoInput'; -import reducer, { initialState } from './reducer'; + import init from './init'; +import reducer, { initialState } from './reducer'; const CustomizationInfos = forwardRef(({ canUpdate, projectSettingsStored }, ref) => { const { formatMessage } = useIntl(); diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/CustomizationInfos/tests/index.test.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/CustomizationInfos/tests/index.test.js index 46e3a2fbf7..4a2134e120 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/CustomizationInfos/tests/index.test.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/CustomizationInfos/tests/index.test.js @@ -1,7 +1,8 @@ import React from 'react'; -import { IntlProvider } from 'react-intl'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render as renderTL } from '@testing-library/react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; +import { IntlProvider } from 'react-intl'; import CustomizationInfos from '..'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoInput/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoInput/index.js index bb5cee5e5e..f29e8170ae 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoInput/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoInput/index.js @@ -1,15 +1,18 @@ import React, { useReducer } from 'react'; -import { useIntl } from 'react-intl'; -import PropTypes from 'prop-types'; + import { + Box, + CarouselActions, CarouselInput, CarouselSlide, - CarouselActions, IconButton, - Box, } from '@strapi/design-system'; import { Plus, Refresh } from '@strapi/icons'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; + import LogoModalStepper from '../LogoModalStepper'; + import reducer, { initialState } from './reducer'; import stepper from './stepper'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoInput/tests/index.test.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoInput/tests/index.test.js index daebbd969c..f04101b1ec 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoInput/tests/index.test.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoInput/tests/index.test.js @@ -1,8 +1,9 @@ import React from 'react'; -import { IntlProvider } from 'react-intl'; -import { render as renderTL, fireEvent, screen, waitFor } from '@testing-library/react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { getFetchClient } from '@strapi/helper-plugin'; +import { fireEvent, render as renderTL, screen, waitFor } from '@testing-library/react'; +import { IntlProvider } from 'react-intl'; import LogoInput from '../index'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/AddLogoDialog.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/AddLogoDialog.js index 5068f78343..53a4b5588b 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/AddLogoDialog.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/AddLogoDialog.js @@ -1,7 +1,9 @@ import React from 'react'; -import { useIntl } from 'react-intl'; + +import { Box, Divider, Tab, TabGroup, TabPanel, TabPanels, Tabs } from '@strapi/design-system'; import PropTypes from 'prop-types'; -import { Tabs, Tab, TabGroup, TabPanels, TabPanel, Box, Divider } from '@strapi/design-system'; +import { useIntl } from 'react-intl'; + import FromComputerForm from './FromComputerForm'; import FromUrlForm from './FromUrlForm'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/FromComputerForm.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/FromComputerForm.js index 5dd0c20c92..ff22e1462b 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/FromComputerForm.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/FromComputerForm.js @@ -1,21 +1,23 @@ -import React, { useState, useRef } from 'react'; -import PropTypes from 'prop-types'; -import { useIntl } from 'react-intl'; -import styled from 'styled-components'; +import React, { useRef, useState } from 'react'; + import { Box, - Flex, - Icon, - Typography, - ModalFooter, Button, Field, FieldError, FieldInput, + Flex, + Icon, + ModalFooter, + Typography, } from '@strapi/design-system'; import { PicturePlus } from '@strapi/icons'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import styled from 'styled-components'; + +import { ACCEPTED_FORMAT, DIMENSION, SIZE } from '../../utils/constants'; import { parseFileMetadatas } from '../../utils/parseFileMetadatas'; -import { ACCEPTED_FORMAT, SIZE, DIMENSION } from '../../utils/constants'; const FileInput = styled(FieldInput)` opacity: 0; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/FromUrlForm.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/FromUrlForm.js index 3086d8b82f..3fdbed7439 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/FromUrlForm.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/FromUrlForm.js @@ -1,10 +1,12 @@ import React, { useState } from 'react'; + +import { Box, Button, ModalFooter, TextInput } from '@strapi/design-system'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { Box, Button, TextInput, ModalFooter } from '@strapi/design-system'; -import urlToFile from '../../utils/urlToFile'; + +import { DIMENSION, SIZE } from '../../utils/constants'; import { parseFileMetadatas } from '../../utils/parseFileMetadatas'; -import { SIZE, DIMENSION } from '../../utils/constants'; +import urlToFile from '../../utils/urlToFile'; const FromUrlForm = ({ goTo, next, onClose, setLocalImage }) => { const { formatMessage } = useIntl(); diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/ImageCardAsset.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/ImageCardAsset.js index 77376aeec6..89b53132d7 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/ImageCardAsset.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/ImageCardAsset.js @@ -1,6 +1,5 @@ import React from 'react'; -import { useIntl } from 'react-intl'; -import PropTypes from 'prop-types'; + import { Card, CardAsset, @@ -8,9 +7,11 @@ import { CardBody, CardContent, CardHeader, - CardTitle, CardSubtitle, + CardTitle, } from '@strapi/design-system'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; const ImageCardAsset = ({ asset }) => { const { formatMessage } = useIntl(); diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/PendingLogoDialog.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/PendingLogoDialog.js index 0b11708d5b..c4f71eb490 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/PendingLogoDialog.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/PendingLogoDialog.js @@ -1,8 +1,10 @@ import React from 'react'; + +import { Box, Button, Flex, ModalFooter, Typography } from '@strapi/design-system'; +import { pxToRem } from '@strapi/helper-plugin'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { pxToRem } from '@strapi/helper-plugin'; -import { Box, Flex, Button, ModalFooter, Typography } from '@strapi/design-system'; + import ImageCardAsset from './ImageCardAsset'; const PendingLogoDialog = ({ onClose, asset, prev, next, goTo, setLocalImage, onChangeLogo }) => { diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/index.js index e9a28ac0d0..2b173562d4 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/index.js @@ -1,7 +1,9 @@ import React, { useReducer } from 'react'; + +import { ModalHeader, ModalLayout, Typography } from '@strapi/design-system'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { ModalLayout, ModalHeader, Typography } from '@strapi/design-system'; + import reducer, { initialState } from './reducer'; const LogoModalStepper = ({ diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/tests/AddLogoDialog.test.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/tests/AddLogoDialog.test.js index d5c642f8f6..49af2a4268 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/tests/AddLogoDialog.test.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/tests/AddLogoDialog.test.js @@ -1,7 +1,8 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { fireEvent, render as renderTL } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; -import { render as renderTL, fireEvent } from '@testing-library/react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; import AddLogoDialog from '../AddLogoDialog'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/tests/ImageCardAsset.test.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/tests/ImageCardAsset.test.js index 1c150e1957..7185860872 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/tests/ImageCardAsset.test.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/tests/ImageCardAsset.test.js @@ -1,7 +1,8 @@ import React from 'react'; -import { IntlProvider } from 'react-intl'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render as renderTL } from '@testing-library/react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; +import { IntlProvider } from 'react-intl'; import ImageCardAsset from '../ImageCardAsset'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/tests/PendingLogoDialog.test.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/tests/PendingLogoDialog.test.js index 3d0a6e2526..2b09bc2b55 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/tests/PendingLogoDialog.test.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/tests/PendingLogoDialog.test.js @@ -1,7 +1,8 @@ import React from 'react'; -import { IntlProvider } from 'react-intl'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { fireEvent, render as renderTL } from '@testing-library/react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; +import { IntlProvider } from 'react-intl'; import PendingLogoDialog from '../PendingLogoDialog'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/index.js index c951df3203..0ffbb6b3d8 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/index.js @@ -1,14 +1,5 @@ import React, { useRef } from 'react'; -import { useQuery, useMutation, useQueryClient } from 'react-query'; -import { useIntl } from 'react-intl'; -import { - useAppInfo, - SettingsPageTitle, - useFocusWhenNavigate, - useNotification, - useRBAC, - useTracking, -} from '@strapi/helper-plugin'; + import { Button, ContentLayout, @@ -21,11 +12,22 @@ import { Main, Typography, } from '@strapi/design-system'; -import { ExternalLink, Check } from '@strapi/icons'; +import { + SettingsPageTitle, + useAppInfo, + useFocusWhenNavigate, + useNotification, + useRBAC, + useTracking, +} from '@strapi/helper-plugin'; +import { Check, ExternalLink } from '@strapi/icons'; import AdminSeatInfo from 'ee_else_ce/pages/SettingsPage/pages/ApplicationInfosPage/components/AdminSeatInfo'; +import { useIntl } from 'react-intl'; +import { useMutation, useQuery, useQueryClient } from 'react-query'; -import adminPermissions from '../../../../permissions'; import { useConfigurations } from '../../../../hooks'; +import adminPermissions from '../../../../permissions'; + import CustomizationInfos from './components/CustomizationInfos'; import { fetchProjectSettings, postProjectSettings } from './utils/api'; import getFormData from './utils/getFormData'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/tests/index.test.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/tests/index.test.js index 413c7497df..f785a38ee1 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/tests/index.test.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/tests/index.test.js @@ -1,10 +1,13 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { TrackingProvider, useAppInfo, useRBAC } from '@strapi/helper-plugin'; import { fireEvent, render, screen, waitFor } from '@testing-library/react'; -import { QueryClientProvider, QueryClient } from 'react-query'; import { IntlProvider } from 'react-intl'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import { useAppInfo, useRBAC, TrackingProvider } from '@strapi/helper-plugin'; +import { QueryClient, QueryClientProvider } from 'react-query'; + import ApplicationInfosPage from '../index'; + import server from './server'; const updateProjectSettingsSpy = jest.fn(); diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/tests/server.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/tests/server.js index d32d4fbca8..cbd74bffef 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/tests/server.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/tests/server.js @@ -1,5 +1,5 @@ -import { setupServer } from 'msw/node'; import { rest } from 'msw'; +import { setupServer } from 'msw/node'; const handlers = [ rest.get('*/project-settings', (req, res, ctx) => { diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/utils/api.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/utils/api.js index e6ad1ef604..e82ae1ae3a 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/utils/api.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/utils/api.js @@ -1,4 +1,5 @@ import { getFetchClient } from '@strapi/helper-plugin'; + import prefixAllUrls from './prefixAllUrls'; const fetchProjectSettings = async () => { diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/utils/parseFileMetadatas.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/utils/parseFileMetadatas.js index c2e20f7e48..105e6bc00c 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/utils/parseFileMetadatas.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/utils/parseFileMetadatas.js @@ -1,4 +1,4 @@ -import { DIMENSION, SIZE, ACCEPTED_FORMAT } from './constants'; +import { ACCEPTED_FORMAT, DIMENSION, SIZE } from './constants'; const FILE_FORMAT_ERROR_MESSAGE = { id: 'Settings.application.customization.modal.upload.error-format', diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/utils/prefixAllUrls.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/utils/prefixAllUrls.js index d820fd3a9a..b4836a3312 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/utils/prefixAllUrls.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/utils/prefixAllUrls.js @@ -1,5 +1,5 @@ -import transform from 'lodash/transform'; import { prefixFileUrlWithBackendUrl } from '@strapi/helper-plugin'; +import transform from 'lodash/transform'; const prefixAllUrls = (data) => transform( diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/CreatePage/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/CreatePage/index.js index 407c79ca68..a14b1456bc 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/CreatePage/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/CreatePage/index.js @@ -1,39 +1,42 @@ import React, { useRef, useState } from 'react'; -import { format } from 'date-fns'; + +import { + Box, + Button, + ContentLayout, + Flex, + Grid, + GridItem, + HeaderLayout, + Main, + Textarea, + TextInput, + Typography, +} from '@strapi/design-system'; import { CheckPagePermissions, Form, + Link, LoadingIndicatorPage, SettingsPageTitle, useFetchClient, useNotification, useOverlayBlocker, useTracking, - Link, } from '@strapi/helper-plugin'; -import { - Box, - Button, - ContentLayout, - HeaderLayout, - Grid, - GridItem, - Main, - Flex, - Typography, - TextInput, - Textarea, -} from '@strapi/design-system'; import { ArrowLeft } from '@strapi/icons'; +import { format } from 'date-fns'; import { Formik } from 'formik'; import get from 'lodash/get'; import isEmpty from 'lodash/isEmpty'; import { useIntl } from 'react-intl'; import { useHistory, useRouteMatch } from 'react-router-dom'; import styled from 'styled-components'; -import Permissions from '../EditPage/components/Permissions'; + import { useFetchPermissionsLayout, useFetchRole } from '../../../../../hooks'; import adminPermissions from '../../../../../permissions'; +import Permissions from '../EditPage/components/Permissions'; + import schema from './utils/schema'; const UsersRoleNumber = styled.div` diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/CreatePage/tests/index.test.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/CreatePage/tests/index.test.js index 7d7fbb7239..0e13ba1678 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/CreatePage/tests/index.test.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/CreatePage/tests/index.test.js @@ -5,11 +5,12 @@ */ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { NotificationsProvider } from '@strapi/helper-plugin'; import { render } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; -import { MemoryRouter, Switch, Route } from 'react-router-dom'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import { NotificationsProvider } from '@strapi/helper-plugin'; +import { MemoryRouter, Route, Switch } from 'react-router-dom'; import { CreatePage } from '../index'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/CreatePage/utils/schema.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/CreatePage/utils/schema.js index 5e2ac5c5af..c3bcd9cf28 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/CreatePage/utils/schema.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/CreatePage/utils/schema.js @@ -1,5 +1,5 @@ -import * as yup from 'yup'; import { translatedErrors } from '@strapi/helper-plugin'; +import * as yup from 'yup'; const schema = yup.object().shape({ name: yup.string().required(translatedErrors.required), diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/CollapseLabel/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/CollapseLabel/index.js index c03814209c..7ec3f6ac7d 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/CollapseLabel/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/CollapseLabel/index.js @@ -1,5 +1,5 @@ -import styled from 'styled-components'; import { Flex } from '@strapi/design-system'; +import styled from 'styled-components'; const CollapseLabel = styled(Flex)` padding-right: ${({ theme }) => theme.spaces[2]}; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsButton/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsButton/index.js index e92f1a82ec..c26c1e76e9 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsButton/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsButton/index.js @@ -1,7 +1,8 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import { Cog } from '@strapi/icons'; + import { Button } from '@strapi/design-system'; +import { Cog } from '@strapi/icons'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; import styled from 'styled-components'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsModal/ActionRow/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsModal/ActionRow/index.js index 697304e51d..35de800aea 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsModal/ActionRow/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsModal/ActionRow/index.js @@ -1,9 +1,10 @@ import React from 'react'; + +import { Box, Flex, MultiSelectNested, Typography } from '@strapi/design-system'; import PropTypes from 'prop-types'; -import { Box, Flex, Typography, MultiSelectNested } from '@strapi/design-system'; import { useIntl } from 'react-intl'; -import { getNestedOptions, getSelectedValues, getNewStateFromChangedValues } from './utils/options'; +import { getNestedOptions, getNewStateFromChangedValues, getSelectedValues } from './utils/options'; const ActionRow = ({ arrayOfOptionsGroupedByCategory, diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsModal/ActionRow/utils/options.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsModal/ActionRow/utils/options.js index 16dac1dad6..4a5cedb8f8 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsModal/ActionRow/utils/options.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsModal/ActionRow/utils/options.js @@ -28,4 +28,4 @@ const getNewStateFromChangedValues = (options, changedValues) => .flat() .reduce((acc, curr) => ({ [curr.id]: changedValues.includes(curr.id), ...acc }), {}); -export { getNestedOptions, getSelectedValues, getNewStateFromChangedValues }; +export { getNestedOptions, getNewStateFromChangedValues, getSelectedValues }; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsModal/ActionRow/utils/tests/options.test.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsModal/ActionRow/utils/tests/options.test.js index 93ce0fa98b..5327394435 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsModal/ActionRow/utils/tests/options.test.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsModal/ActionRow/utils/tests/options.test.js @@ -1,4 +1,4 @@ -import { getSelectedValues, getNestedOptions, getNewStateFromChangedValues } from '../options'; +import { getNestedOptions, getNewStateFromChangedValues, getSelectedValues } from '../options'; describe('ActionRow | utils | getSelectedValues', () => { test('should reduce the default values to a flat array', () => { diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsModal/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsModal/index.js index 86e732f63c..b1cd781b5f 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsModal/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsModal/index.js @@ -1,11 +1,11 @@ import React, { useMemo, useState } from 'react'; -import PropTypes from 'prop-types'; + import { Button, + ModalBody, ModalFooter, ModalHeader, ModalLayout, - ModalBody, Typography, } from '@strapi/design-system'; import { Breadcrumbs, Crumb } from '@strapi/design-system/v2'; @@ -13,8 +13,11 @@ import produce from 'immer'; import get from 'lodash/get'; import groupBy from 'lodash/groupBy'; import upperFirst from 'lodash/upperFirst'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; + import { usePermissionsDataManager } from '../../../../../../../hooks'; + import ActionRow from './ActionRow'; import createDefaultConditionsForm from './utils/createDefaultConditionsForm'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsModal/utils/createDefaultConditionsForm.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsModal/utils/createDefaultConditionsForm.js index 8d30cb1c66..95c07b46e1 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsModal/utils/createDefaultConditionsForm.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsModal/utils/createDefaultConditionsForm.js @@ -44,4 +44,4 @@ const createDefaultConditionsForm = ( }; export default createDefaultConditionsForm; -export { createConditionsForm, createCategoryForm }; +export { createCategoryForm, createConditionsForm }; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsModal/utils/tests/createDefaultConditionsForm.test.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsModal/utils/tests/createDefaultConditionsForm.test.js index eea4a19278..1a9fc3ad05 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsModal/utils/tests/createDefaultConditionsForm.test.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsModal/utils/tests/createDefaultConditionsForm.test.js @@ -1,6 +1,6 @@ import createDefaultConditionsForm, { - createConditionsForm, createCategoryForm, + createConditionsForm, } from '../createDefaultConditionsForm'; describe('ADMIN | COMPONENTS | Roles | ConditionsModale | utils ', () => { diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/Collapse/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/Collapse/index.js index 93db5b5a3c..689c8a9cfb 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/Collapse/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/Collapse/index.js @@ -1,11 +1,13 @@ import React, { useMemo, useState } from 'react'; -import PropTypes from 'prop-types'; -import { ChevronDown, ChevronUp } from '@strapi/icons'; + import { BaseCheckbox, Box, Flex } from '@strapi/design-system'; +import { ChevronDown, ChevronUp } from '@strapi/icons'; import get from 'lodash/get'; import omit from 'lodash/omit'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; import styled from 'styled-components'; + import { usePermissionsDataManager } from '../../../../../../../../hooks'; import ConditionsButton from '../../ConditionsButton'; import ConditionsModal from '../../ConditionsModal'; @@ -13,9 +15,10 @@ import HiddenAction from '../../HiddenAction'; import { cellWidth, rowHeight } from '../../Permissions/utils/constants'; import RowLabelWithCheckbox from '../../RowLabelWithCheckbox'; import { getCheckboxState } from '../../utils'; -import generateCheckboxesActions from './utils/generateCheckboxesActions'; import activeStyle from '../utils/activeStyle'; +import generateCheckboxesActions from './utils/generateCheckboxesActions'; + const activeRowStyle = (theme, isActive) => ` ${Wrapper} { background-color: ${theme.colors.primary100}; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/Collapse/utils/generateCheckboxesActions.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/Collapse/utils/generateCheckboxesActions.js index 1aed3b9d54..84c5461fc4 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/Collapse/utils/generateCheckboxesActions.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/Collapse/utils/generateCheckboxesActions.js @@ -1,5 +1,6 @@ import get from 'lodash/get'; import isEmpty from 'lodash/isEmpty'; + import { createArrayOfValues, getCheckboxState } from '../../../utils'; const generateCheckboxesActions = (availableActions, modifiedData, pathToData) => { diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/CollapsePropertyMatrix/ActionRow/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/CollapsePropertyMatrix/ActionRow/index.js index a9c4a6c8b6..da4a6ef581 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/CollapsePropertyMatrix/ActionRow/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/CollapsePropertyMatrix/ActionRow/index.js @@ -1,9 +1,11 @@ import React, { memo, useCallback, useMemo, useState } from 'react'; + +import { BaseCheckbox, Flex } from '@strapi/design-system'; +import get from 'lodash/get'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; import styled from 'styled-components'; -import { BaseCheckbox, Flex } from '@strapi/design-system'; -import get from 'lodash/get'; + import { usePermissionsDataManager } from '../../../../../../../../../hooks'; import HiddenAction from '../../../HiddenAction'; import { cellWidth, rowHeight } from '../../../Permissions/utils/constants'; @@ -13,6 +15,7 @@ import { getCheckboxState } from '../../../utils'; import { activeStyle } from '../../utils'; import CarretIcon from '../CarretIcon'; import SubActionRow from '../SubActionRow'; + import getRowLabelCheckboxeState from './utils/getRowLabelCheckboxeState'; const Cell = styled(Flex)` diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/CollapsePropertyMatrix/CarretIcon/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/CollapsePropertyMatrix/CarretIcon/index.js index 9dd9ccea62..3800a4db5e 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/CollapsePropertyMatrix/CarretIcon/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/CollapsePropertyMatrix/CarretIcon/index.js @@ -1,5 +1,5 @@ -import styled from 'styled-components'; import { CarretDown } from '@strapi/icons'; +import styled from 'styled-components'; const CarretIcon = styled(CarretDown)` display: none; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/CollapsePropertyMatrix/Header/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/CollapsePropertyMatrix/Header/index.js index da8064940d..c40e31890c 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/CollapsePropertyMatrix/Header/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/CollapsePropertyMatrix/Header/index.js @@ -1,8 +1,10 @@ import React from 'react'; + +import { Flex, Typography } from '@strapi/design-system'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; import styled from 'styled-components'; -import { Flex, Typography } from '@strapi/design-system'; + import { cellWidth, firstRowWidth, rowHeight } from '../../../Permissions/utils/constants'; const HeaderLabel = styled(Flex)` diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/CollapsePropertyMatrix/SubActionRow/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/CollapsePropertyMatrix/SubActionRow/index.js index bc7e456d12..656f46900e 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/CollapsePropertyMatrix/SubActionRow/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/CollapsePropertyMatrix/SubActionRow/index.js @@ -1,10 +1,12 @@ import React, { memo, useMemo, useState } from 'react'; -import PropTypes from 'prop-types'; + +import { BaseCheckbox, Box, Flex, Typography } from '@strapi/design-system'; import get from 'lodash/get'; import upperFirst from 'lodash/upperFirst'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; import styled from 'styled-components'; -import { BaseCheckbox, Box, Flex, Typography } from '@strapi/design-system'; + import { usePermissionsDataManager } from '../../../../../../../../../hooks'; import CollapseLabel from '../../../CollapseLabel'; import Curve from '../../../Curve'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/CollapsePropertyMatrix/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/CollapsePropertyMatrix/index.js index a05dd12fcb..84db09bce1 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/CollapsePropertyMatrix/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/CollapsePropertyMatrix/index.js @@ -1,10 +1,12 @@ import React, { useMemo } from 'react'; + +import { Box } from '@strapi/design-system'; import PropTypes from 'prop-types'; import styled from 'styled-components'; -import { Box } from '@strapi/design-system'; -import generateHeadersFromActions from './utils/generateHeadersFromActions'; -import Header from './Header'; + import ActionRow from './ActionRow'; +import Header from './Header'; +import generateHeadersFromActions from './utils/generateHeadersFromActions'; const Wrapper = styled.div` display: inline-flex; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/index.js index 3f4f98b4ea..80b0124084 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/index.js @@ -1,6 +1,8 @@ -import PropTypes from 'prop-types'; import React, { useCallback, useMemo } from 'react'; + +import PropTypes from 'prop-types'; import styled from 'styled-components'; + import Collapse from './Collapse'; import CollapsePropertyMatrix from './CollapsePropertyMatrix'; import { getAvailableActions } from './utils'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/utils/activeStyle.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/utils/activeStyle.js index 2ad6aceda6..276bf7734b 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/utils/activeStyle.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/utils/activeStyle.js @@ -1,4 +1,5 @@ import { Typography } from '@strapi/design-system'; + import CarretIcon from '../CollapsePropertyMatrix/CarretIcon'; const activeStyle = (theme) => ` diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapses/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapses/index.js index ca12e2f6f2..4f7cd4a065 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapses/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapses/index.js @@ -1,5 +1,7 @@ import React, { memo, useState } from 'react'; + import PropTypes from 'prop-types'; + import ContentTypeCollapse from '../ContentTypeCollapse'; const ContentTypeCollapses = ({ actions, isFormDisabled, pathToData, subjects }) => { diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypes/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypes/index.js index 5a86350c4a..ecb08ca370 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypes/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypes/index.js @@ -1,8 +1,10 @@ import React, { memo } from 'react'; -import PropTypes from 'prop-types'; + import { Box } from '@strapi/design-system'; -import styled from 'styled-components'; import sortBy from 'lodash/sortBy'; +import PropTypes from 'prop-types'; +import styled from 'styled-components'; + import ContentTypeCollapses from '../ContentTypeCollapses'; import GlobalActions from '../GlobalActions'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Curve/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Curve/index.js index de5b5bbbec..9578e8975b 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Curve/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Curve/index.js @@ -1,7 +1,8 @@ import React, { memo } from 'react'; + +import { Box } from '@strapi/design-system'; import PropTypes from 'prop-types'; import styled from 'styled-components'; -import { Box } from '@strapi/design-system'; const StyledBox = styled(Box)` transform: translate(-4px, -12px); diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/GlobalActions/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/GlobalActions/index.js index cea8626830..a033b2dcb5 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/GlobalActions/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/GlobalActions/index.js @@ -1,11 +1,14 @@ import React, { memo, useMemo } from 'react'; -import PropTypes from 'prop-types'; + import { BaseCheckbox, Box, Flex, Typography } from '@strapi/design-system'; -import styled from 'styled-components'; import get from 'lodash/get'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; +import styled from 'styled-components'; + import { usePermissionsDataManager } from '../../../../../../../hooks'; import { cellWidth, firstRowWidth } from '../Permissions/utils/constants'; + import { findDisplayedActions, getCheckboxesState } from './utils'; const CenteredStack = styled(Flex)` diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/GlobalActions/utils/getRowLabelCheckboxesState.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/GlobalActions/utils/getRowLabelCheckboxesState.js index 36c5222936..a61bbff15c 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/GlobalActions/utils/getRowLabelCheckboxesState.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/GlobalActions/utils/getRowLabelCheckboxesState.js @@ -1,4 +1,5 @@ import get from 'lodash/get'; + import { getCheckboxState, removeConditionKeyFromData } from '../../utils'; const getActionsIds = (array) => array.map(({ actionId }) => actionId); diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/HiddenAction/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/HiddenAction/index.js index d796f48457..a3525831dd 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/HiddenAction/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/HiddenAction/index.js @@ -1,4 +1,5 @@ import styled from 'styled-components'; + import { cellWidth } from '../Permissions/utils/constants'; const HiddenAction = styled.div` diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/index.js index 48cf188e9e..04b0264922 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/index.js @@ -1,13 +1,16 @@ import React, { forwardRef, memo, useCallback, useImperativeHandle, useReducer } from 'react'; -import PropTypes from 'prop-types'; -import { difference } from '@strapi/helper-plugin'; + import { Tab, TabGroup, TabPanel, TabPanels, Tabs } from '@strapi/design-system'; +import { difference } from '@strapi/helper-plugin'; import has from 'lodash/has'; import isEmpty from 'lodash/isEmpty'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; + import ContentTypes from '../ContentTypes'; import PermissionsDataManagerProvider from '../PermissionsDataManagerProvider'; import PluginsAndSettings from '../PluginsAndSettings'; + import init from './init'; import reducer, { initialState } from './reducer'; import formatPermissionsToAPI from './utils/formatPermissionsToAPI'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/reducer.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/reducer.js index 75f00cb306..cc8eb57fde 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/reducer.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/reducer.js @@ -1,8 +1,8 @@ import produce from 'immer'; import cloneDeep from 'lodash/cloneDeep'; +import get from 'lodash/get'; import has from 'lodash/has'; import isObject from 'lodash/isObject'; -import get from 'lodash/get'; import set from 'lodash/set'; import updateConditionsToFalse from './utils/updateConditionsToFalse'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/utils/createDefaultCTFormFromLayout.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/utils/createDefaultCTFormFromLayout.js index 317ad7bc18..b9a49e8ade 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/utils/createDefaultCTFormFromLayout.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/utils/createDefaultCTFormFromLayout.js @@ -176,7 +176,7 @@ const createDefaultCTFormFromLayout = ( export default createDefaultCTFormFromLayout; export { createDefaultConditionsForm, - createDefaultPropertyForms, createDefaultPropertiesForm, + createDefaultPropertyForms, findLayouts, }; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/utils/createDefaultPluginsFormFromLayout.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/utils/createDefaultPluginsFormFromLayout.js index abc665a375..68136cf642 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/utils/createDefaultPluginsFormFromLayout.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/utils/createDefaultPluginsFormFromLayout.js @@ -45,4 +45,4 @@ const createDefaultPluginsFormFromLayout = (pluginsLayout, conditions, initialPe }; export default createDefaultPluginsFormFromLayout; -export { createSubCategoryForm, createChildrenDefaultForm }; +export { createChildrenDefaultForm, createSubCategoryForm }; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/utils/formatContentTypesPermissionToAPI.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/utils/formatContentTypesPermissionToAPI.js index b1d48cbb33..518566593c 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/utils/formatContentTypesPermissionToAPI.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/utils/formatContentTypesPermissionToAPI.js @@ -1,5 +1,7 @@ import isObject from 'lodash/isObject'; + import { createArrayOfValues } from '../../utils'; + import { createConditionsArray } from './formatSettingsPermissionsToAPI'; /** @@ -119,4 +121,4 @@ const formatContentTypesPermissionToAPI = (contentTypesPermissions) => { }; export default formatContentTypesPermissionToAPI; -export { createPropertyArray, createPermissionWithProperties }; +export { createPermissionWithProperties, createPropertyArray }; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/utils/tests/createDefaultCTFormFromLayout.test.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/utils/tests/createDefaultCTFormFromLayout.test.js index 8c83e2ae48..bb6a6cb5f9 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/utils/tests/createDefaultCTFormFromLayout.test.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/utils/tests/createDefaultCTFormFromLayout.test.js @@ -1,7 +1,7 @@ import createDefaultCTFormFromLayout, { createDefaultConditionsForm, - createDefaultPropertyForms, createDefaultPropertiesForm, + createDefaultPropertyForms, findLayouts, } from '../createDefaultCTFormFromLayout'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/utils/tests/createDefaultPluginsFormFromLayout.test.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/utils/tests/createDefaultPluginsFormFromLayout.test.js index 792a50f2a9..4099205b83 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/utils/tests/createDefaultPluginsFormFromLayout.test.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/utils/tests/createDefaultPluginsFormFromLayout.test.js @@ -1,6 +1,6 @@ import createDefaultPluginsFormFromLayout, { - createSubCategoryForm, createChildrenDefaultForm, + createSubCategoryForm, } from '../createDefaultPluginsFormFromLayout'; const conditions = [ diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/utils/tests/formatLayoutForSettingsAndPlugins.test.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/utils/tests/formatLayoutForSettingsAndPlugins.test.js index 1ff77e9e62..9bca80a9c4 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/utils/tests/formatLayoutForSettingsAndPlugins.test.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/utils/tests/formatLayoutForSettingsAndPlugins.test.js @@ -1,4 +1,5 @@ import formatLayoutForSettingsAndPlugins from '../formatLayoutForSettingsAndPlugins'; + import permissionsLayout from './data'; describe('ADMIN | COMPONENTS | ROLE | PluginsAndSettings | formatLayoutForSettingsAndPlugins', () => { diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/utils/updateConditionsToFalse.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/utils/updateConditionsToFalse.js index 19fbabcf88..9ebbb7cbf0 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/utils/updateConditionsToFalse.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/Permissions/utils/updateConditionsToFalse.js @@ -1,5 +1,5 @@ -import isObject from 'lodash/isObject'; import has from 'lodash/has'; +import isObject from 'lodash/isObject'; import omit from 'lodash/omit'; import { createArrayOfValues } from '../../utils'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/PermissionsDataManagerProvider/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/PermissionsDataManagerProvider/index.js index 6522a6484b..2ce8e94b0b 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/PermissionsDataManagerProvider/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/PermissionsDataManagerProvider/index.js @@ -1,5 +1,7 @@ import React from 'react'; + import PropTypes from 'prop-types'; + import { PermissionsDataManagerContext } from '../../../../../../../contexts'; const PermissionsDataManagerProvider = ({ children, value }) => { diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/PluginsAndSettings/Row/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/PluginsAndSettings/Row/index.js index c112684a2e..78ec7ab0b0 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/PluginsAndSettings/Row/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/PluginsAndSettings/Row/index.js @@ -1,8 +1,10 @@ import React, { useMemo } from 'react'; -import PropTypes from 'prop-types'; + import { Accordion, AccordionContent, AccordionToggle, Box } from '@strapi/design-system'; import upperFirst from 'lodash/upperFirst'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; + import SubCategory from '../SubCategory'; const PermissionRow = ({ diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/PluginsAndSettings/SubCategory/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/PluginsAndSettings/SubCategory/index.js index 9a81fff6d1..68599d849b 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/PluginsAndSettings/SubCategory/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/PluginsAndSettings/SubCategory/index.js @@ -1,13 +1,16 @@ import React, { useMemo, useState } from 'react'; -import styled from 'styled-components'; -import PropTypes from 'prop-types'; -import { Grid, GridItem, Box, Checkbox, Flex, Typography } from '@strapi/design-system'; -import { useIntl } from 'react-intl'; + +import { Box, Checkbox, Flex, Grid, GridItem, Typography } from '@strapi/design-system'; import get from 'lodash/get'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import styled from 'styled-components'; + import { usePermissionsDataManager } from '../../../../../../../../hooks'; -import { getCheckboxState, removeConditionKeyFromData } from '../../utils'; import ConditionsButton from '../../ConditionsButton'; import ConditionsModal from '../../ConditionsModal'; +import { getCheckboxState, removeConditionKeyFromData } from '../../utils'; + import { formatActions, getConditionsButtonState } from './utils'; const Border = styled.div` diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/PluginsAndSettings/SubCategory/utils/formatActions.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/PluginsAndSettings/SubCategory/utils/formatActions.js index ba202954db..f1811b16ac 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/PluginsAndSettings/SubCategory/utils/formatActions.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/PluginsAndSettings/SubCategory/utils/formatActions.js @@ -1,4 +1,5 @@ import get from 'lodash/get'; + import { createArrayOfValues } from '../../../utils'; /** diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/PluginsAndSettings/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/PluginsAndSettings/index.js index a668ecce5a..8326ab27d1 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/PluginsAndSettings/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/PluginsAndSettings/index.js @@ -1,6 +1,8 @@ import React, { useState } from 'react'; -import PropTypes from 'prop-types'; + import { Box } from '@strapi/design-system'; +import PropTypes from 'prop-types'; + import PermissionRow from './Row'; const PluginsAndSettingsPermissions = ({ isFormDisabled, kind, layout }) => { diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/RequiredSign/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/RequiredSign/index.js index 4d3bfa3ed5..b6443f0772 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/RequiredSign/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/RequiredSign/index.js @@ -1,4 +1,5 @@ import React from 'react'; + import styled from 'styled-components'; const Required = styled.span` diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/RoleForm/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/RoleForm/index.js index 8e077d2ba5..866338179f 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/RoleForm/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/RoleForm/index.js @@ -1,13 +1,14 @@ import React from 'react'; + import { Box, + Button, + Flex, Grid, GridItem, - Flex, - Typography, Textarea, TextInput, - Button, + Typography, } from '@strapi/design-system'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/RowLabelWithCheckbox/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/RowLabelWithCheckbox/index.js index 36aafd12f0..8aff106547 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/RowLabelWithCheckbox/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/RowLabelWithCheckbox/index.js @@ -1,8 +1,10 @@ import React, { memo } from 'react'; -import PropTypes from 'prop-types'; + import { BaseCheckbox, Box, Flex, Typography } from '@strapi/design-system'; import upperFirst from 'lodash/upperFirst'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; + import CollapseLabel from '../CollapseLabel'; import { firstRowWidth } from '../Permissions/utils/constants'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/utils/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/utils/index.js index b972a728f1..e043770098 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/utils/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/utils/index.js @@ -1,3 +1,3 @@ -export { default as getCheckboxState } from './getCheckboxState'; export { default as createArrayOfValues } from './createArrayOfValues'; +export { default as getCheckboxState } from './getCheckboxState'; export { default as removeConditionKeyFromData } from './removeConditionKeyFromData'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/index.js index 8ba6a28e6f..642f3edca1 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/index.js @@ -1,21 +1,24 @@ import React, { useRef, useState } from 'react'; + +import { Box, Button, ContentLayout, Flex, HeaderLayout, Main } from '@strapi/design-system'; import { + Link, + LoadingIndicatorPage, + SettingsPageTitle, useFetchClient, useNotification, useOverlayBlocker, useTracking, - LoadingIndicatorPage, - SettingsPageTitle, - Link, } from '@strapi/helper-plugin'; -import { Box, Button, ContentLayout, HeaderLayout, Main, Flex } from '@strapi/design-system'; -import { Formik } from 'formik'; import { ArrowLeft } from '@strapi/icons'; +import { Formik } from 'formik'; import get from 'lodash/get'; import { useIntl } from 'react-intl'; import { useRouteMatch } from 'react-router-dom'; -import { Permissions, RoleForm } from './components'; + import { useFetchPermissionsLayout, useFetchRole } from '../../../../../hooks'; + +import { Permissions, RoleForm } from './components'; import schema from './utils/schema'; const EditPage = () => { diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/tests/index.test.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/tests/index.test.js index 1bfa81fb5d..778932fff6 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/tests/index.test.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/tests/index.test.js @@ -5,14 +5,15 @@ */ import React from 'react'; + +import { darkTheme, lightTheme } from '@strapi/design-system'; import { act, render } from '@testing-library/react'; -import { IntlProvider } from 'react-intl'; -import { Router, Switch, Route } from 'react-router-dom'; import { createMemoryHistory } from 'history'; -import { lightTheme, darkTheme } from '@strapi/design-system'; +import { IntlProvider } from 'react-intl'; +import { Route, Router, Switch } from 'react-router-dom'; + import Theme from '../../../../../../components/Theme'; import ThemeToggleProvider from '../../../../../../components/ThemeToggleProvider'; - import EditPage from '../index'; jest.mock('@strapi/helper-plugin', () => ({ diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/utils/schema.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/utils/schema.js index 7fc1ec4d10..ce269199b4 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/utils/schema.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/EditPage/utils/schema.js @@ -1,5 +1,5 @@ -import * as yup from 'yup'; import { translatedErrors } from '@strapi/helper-plugin'; +import * as yup from 'yup'; const schema = yup.object().shape({ name: yup.string().required(translatedErrors.required), diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/ListPage/components/RoleRow/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/ListPage/components/RoleRow/index.js index 8d8042e164..990656846e 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/ListPage/components/RoleRow/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/ListPage/components/RoleRow/index.js @@ -1,7 +1,8 @@ import React from 'react'; + +import { Box, Flex, IconButton, Td, Tr, Typography } from '@strapi/design-system'; +import { onRowClick, pxToRem, stopPropagation } from '@strapi/helper-plugin'; import PropTypes from 'prop-types'; -import { Box, Flex, Td, Tr, Typography, IconButton } from '@strapi/design-system'; -import { stopPropagation, onRowClick, pxToRem } from '@strapi/helper-plugin'; import { useIntl } from 'react-intl'; const RoleRow = ({ id, name, description, usersCount, icons, rowIndex, canUpdate }) => { diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/ListPage/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/ListPage/index.js index a421df11bb..a559521381 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/ListPage/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/ListPage/index.js @@ -1,38 +1,41 @@ import React, { useCallback, useEffect, useReducer, useState } from 'react'; + import { - ConfirmDialog, - LoadingIndicatorPage, - SearchURLQuery, - SettingsPageTitle, - getFetchClient, - useNotification, - useQueryParams, - useRBAC, - useFocusWhenNavigate, - useFilter, - useCollator, -} from '@strapi/helper-plugin'; -import { Plus, Trash, Duplicate, Pencil } from '@strapi/icons'; -import { - Button, ActionLayout, + Button, ContentLayout, HeaderLayout, Main, Table, Tbody, TFooter, - Thead, Th, + Thead, Tr, Typography, VisuallyHidden, } from '@strapi/design-system'; +import { + ConfirmDialog, + getFetchClient, + LoadingIndicatorPage, + SearchURLQuery, + SettingsPageTitle, + useCollator, + useFilter, + useFocusWhenNavigate, + useNotification, + useQueryParams, + useRBAC, +} from '@strapi/helper-plugin'; +import { Duplicate, Pencil, Plus, Trash } from '@strapi/icons'; import get from 'lodash/get'; import { useIntl } from 'react-intl'; import { useHistory } from 'react-router-dom'; + import { useRolesList } from '../../../../../hooks'; import adminPermissions from '../../../../../permissions'; + import EmptyRole from './components/EmptyRole'; import BaseRoleRow from './components/RoleRow'; import reducer, { initialState } from './reducer'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/ListPage/tests/index.test.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/ListPage/tests/index.test.js index 3272054d19..d15c664f17 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/ListPage/tests/index.test.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/ListPage/tests/index.test.js @@ -5,16 +5,17 @@ */ import React from 'react'; + +import { darkTheme, lightTheme } from '@strapi/design-system'; +import { TrackingProvider, useRBAC } from '@strapi/helper-plugin'; import { render, screen } from '@testing-library/react'; import { createMemoryHistory } from 'history'; -import { Router } from 'react-router-dom'; import { IntlProvider } from 'react-intl'; -import { useRBAC, TrackingProvider } from '@strapi/helper-plugin'; -import { lightTheme, darkTheme } from '@strapi/design-system'; -import { useRolesList } from '../../../../../../hooks'; +import { Router } from 'react-router-dom'; import Theme from '../../../../../../components/Theme'; import ThemeToggleProvider from '../../../../../../components/ThemeToggleProvider'; +import { useRolesList } from '../../../../../../hooks'; import ListPage from '../index'; jest.mock('@strapi/helper-plugin', () => ({ diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/ProtectedEditPage/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/ProtectedEditPage/index.js index c5aba5cb81..f4ab8ecb2f 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/ProtectedEditPage/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/ProtectedEditPage/index.js @@ -1,6 +1,8 @@ import React, { useMemo } from 'react'; -import { useRBAC, LoadingIndicatorPage } from '@strapi/helper-plugin'; + +import { LoadingIndicatorPage, useRBAC } from '@strapi/helper-plugin'; import { Redirect } from 'react-router-dom'; + import adminPermissions from '../../../../../permissions'; import EditPage from '../EditPage'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/ProtectedListPage/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/ProtectedListPage/index.js index 0747478537..084fa74caf 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/ProtectedListPage/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/ProtectedListPage/index.js @@ -1,5 +1,7 @@ import React from 'react'; + import { CheckPagePermissions } from '@strapi/helper-plugin'; + import adminPermissions from '../../../../../permissions'; import ListPage from '../ListPage'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/components/FormTransferTokenContainer/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/components/FormTransferTokenContainer/index.js index b84b609cbe..b560bea0f3 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/components/FormTransferTokenContainer/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/components/FormTransferTokenContainer/index.js @@ -1,10 +1,12 @@ import React from 'react'; -import { useIntl } from 'react-intl'; + +import { Box, Flex, Grid, GridItem, Typography } from '@strapi/design-system'; import PropTypes from 'prop-types'; -import { Box, Grid, GridItem, Flex, Typography } from '@strapi/design-system'; +import { useIntl } from 'react-intl'; + import LifeSpanInput from '../../../../../components/Tokens/LifeSpanInput'; -import TokenName from '../../../../../components/Tokens/TokenName'; import TokenDescription from '../../../../../components/Tokens/TokenDescription'; +import TokenName from '../../../../../components/Tokens/TokenName'; import TokenTypeSelect from '../../../../../components/Tokens/TokenTypeSelect'; const FormTransferTokenContainer = ({ diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/components/LoadingView/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/components/LoadingView/index.js index c8af253616..b80b300b07 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/components/LoadingView/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/components/LoadingView/index.js @@ -1,13 +1,14 @@ import React from 'react'; + +import { Button, ContentLayout, HeaderLayout, Main } from '@strapi/design-system'; import { - SettingsPageTitle, LoadingIndicatorPage, + SettingsPageTitle, useFocusWhenNavigate, } from '@strapi/helper-plugin'; -import { HeaderLayout, ContentLayout, Main, Button } from '@strapi/design-system'; import { Check } from '@strapi/icons'; -import { useIntl } from 'react-intl'; import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; const LoadingView = ({ transferTokenName }) => { const { formatMessage } = useIntl(); diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/index.js index 6c46562bfe..feed282045 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/index.js @@ -1,29 +1,32 @@ -import React, { useState, useRef, useEffect } from 'react'; -import { useIntl } from 'react-intl'; -import { Formik } from 'formik'; -import { useRouteMatch, useHistory } from 'react-router-dom'; -import { useQuery } from 'react-query'; +import React, { useEffect, useRef, useState } from 'react'; + +import { ContentLayout, Flex, Main } from '@strapi/design-system'; import { - SettingsPageTitle, - useFocusWhenNavigate, Form, - useOverlayBlocker, - useNotification, - useTracking, - useGuidedTour, - useRBAC, - useFetchClient, + SettingsPageTitle, useAPIErrorHandler, + useFetchClient, + useFocusWhenNavigate, + useGuidedTour, + useNotification, + useOverlayBlocker, + useRBAC, + useTracking, } from '@strapi/helper-plugin'; -import { ContentLayout, Main, Flex } from '@strapi/design-system'; -import { formatAPIErrors } from '../../../../../utils'; -import { schema } from './utils'; -import LoadingView from './components/LoadingView'; +import { Formik } from 'formik'; +import { useIntl } from 'react-intl'; +import { useQuery } from 'react-query'; +import { useHistory, useRouteMatch } from 'react-router-dom'; + import adminPermissions from '../../../../../permissions'; -import FormTransferTokenContainer from './components/FormTransferTokenContainer'; -import TokenBox from '../../../components/Tokens/TokenBox'; -import FormHead from '../../../components/Tokens/FormHead'; +import { formatAPIErrors } from '../../../../../utils'; import { TRANSFER_TOKEN_TYPE } from '../../../components/Tokens/constants'; +import FormHead from '../../../components/Tokens/FormHead'; +import TokenBox from '../../../components/Tokens/TokenBox'; + +import FormTransferTokenContainer from './components/FormTransferTokenContainer'; +import LoadingView from './components/LoadingView'; +import { schema } from './utils'; const MSG_ERROR_NAME_TAKEN = 'Name already taken'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/tests/index.test.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/tests/index.test.js index 7b171277c1..f7ff016c86 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/tests/index.test.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/tests/index.test.js @@ -1,10 +1,12 @@ import React from 'react'; + +import { darkTheme, lightTheme } from '@strapi/design-system'; import { render, waitFor } from '@testing-library/react'; -import { IntlProvider } from 'react-intl'; -import { Router, Route } from 'react-router-dom'; import { createMemoryHistory } from 'history'; +import { IntlProvider } from 'react-intl'; import { QueryClient, QueryClientProvider } from 'react-query'; -import { lightTheme, darkTheme } from '@strapi/design-system'; +import { Route, Router } from 'react-router-dom'; + import Theme from '../../../../../../components/Theme'; import ThemeToggleProvider from '../../../../../../components/ThemeToggleProvider'; import EditView from '../index'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/utils/schema.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/utils/schema.js index de47da07c7..f212ed8d1f 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/utils/schema.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/utils/schema.js @@ -1,5 +1,5 @@ -import * as yup from 'yup'; import { translatedErrors } from '@strapi/helper-plugin'; +import * as yup from 'yup'; const schema = yup.object().shape({ name: yup.string(translatedErrors.string).max(100).required(translatedErrors.required), diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/TransferTokens/ListView/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/TransferTokens/ListView/index.js index fa7196ddf5..ea9f76a8ba 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/TransferTokens/ListView/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/TransferTokens/ListView/index.js @@ -1,28 +1,29 @@ import React, { useEffect, useRef } from 'react'; -import { useIntl } from 'react-intl'; -import { useQuery, useMutation, useQueryClient } from 'react-query'; -import { useHistory } from 'react-router-dom'; -import qs from 'qs'; +import { Button, ContentLayout, HeaderLayout, Main } from '@strapi/design-system'; import { - SettingsPageTitle, - useFocusWhenNavigate, - useNotification, - NoPermissions, - useRBAC, - NoContent, - useTracking, - useGuidedTour, LinkButton, + NoContent, + NoPermissions, + SettingsPageTitle, useFetchClient, + useFocusWhenNavigate, + useGuidedTour, + useNotification, + useRBAC, + useTracking, } from '@strapi/helper-plugin'; -import { HeaderLayout, ContentLayout, Main, Button } from '@strapi/design-system'; import { Plus } from '@strapi/icons'; +import qs from 'qs'; +import { useIntl } from 'react-intl'; +import { useMutation, useQuery, useQueryClient } from 'react-query'; +import { useHistory } from 'react-router-dom'; import adminPermissions from '../../../../../permissions'; -import tableHeaders from './utils/tableHeaders'; -import Table from '../../../components/Tokens/Table'; import { TRANSFER_TOKEN_TYPE } from '../../../components/Tokens/constants'; +import Table from '../../../components/Tokens/Table'; + +import tableHeaders from './utils/tableHeaders'; const TransferTokenListView = () => { useFocusWhenNavigate(); diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/TransferTokens/ListView/tests/index.test.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/TransferTokens/ListView/tests/index.test.js index 892d0d65db..95a01a14bf 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/TransferTokens/ListView/tests/index.test.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/TransferTokens/ListView/tests/index.test.js @@ -1,11 +1,13 @@ import React from 'react'; + +import { darkTheme, lightTheme } from '@strapi/design-system'; +import { TrackingProvider, useRBAC } from '@strapi/helper-plugin'; import { render, waitFor } from '@testing-library/react'; -import { IntlProvider } from 'react-intl'; -import { Router, Route } from 'react-router-dom'; import { createMemoryHistory } from 'history'; +import { IntlProvider } from 'react-intl'; import { QueryClient, QueryClientProvider } from 'react-query'; -import { useRBAC, TrackingProvider } from '@strapi/helper-plugin'; -import { lightTheme, darkTheme } from '@strapi/design-system'; +import { Route, Router } from 'react-router-dom'; + import Theme from '../../../../../../components/Theme'; import ThemeToggleProvider from '../../../../../../components/ThemeToggleProvider'; import ListView from '../index'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/TransferTokens/ProtectedCreateView/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/TransferTokens/ProtectedCreateView/index.js index 04c7e6efc5..f4a5b17af7 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/TransferTokens/ProtectedCreateView/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/TransferTokens/ProtectedCreateView/index.js @@ -1,5 +1,7 @@ import React from 'react'; + import { CheckPagePermissions } from '@strapi/helper-plugin'; + import adminPermissions from '../../../../../permissions'; import EditView from '../EditView'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/TransferTokens/ProtectedEditView/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/TransferTokens/ProtectedEditView/index.js index 9fc9feaf06..ff665e31d3 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/TransferTokens/ProtectedEditView/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/TransferTokens/ProtectedEditView/index.js @@ -1,5 +1,7 @@ import React from 'react'; + import { CheckPagePermissions } from '@strapi/helper-plugin'; + import adminPermissions from '../../../../../permissions'; import EditView from '../EditView'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/TransferTokens/ProtectedListView/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/TransferTokens/ProtectedListView/index.js index e749f6176c..f2a00b43c8 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/TransferTokens/ProtectedListView/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/TransferTokens/ProtectedListView/index.js @@ -1,5 +1,7 @@ import React from 'react'; + import { CheckPagePermissions } from '@strapi/helper-plugin'; + import adminPermissions from '../../../../../permissions'; import ListView from '../ListView'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/EditPage/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/EditPage/index.js index 9996782c6d..dbfec9e2f5 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/EditPage/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/EditPage/index.js @@ -1,43 +1,45 @@ import React from 'react'; -import { useRouteMatch, useHistory } from 'react-router-dom'; -import { useIntl } from 'react-intl'; -import PropTypes from 'prop-types'; -import pick from 'lodash/pick'; -import get from 'lodash/get'; -import omit from 'lodash/omit'; + import { + Box, + Button, + ContentLayout, + Flex, + Grid, + GridItem, + HeaderLayout, + Main, + Typography, +} from '@strapi/design-system'; +import { + auth, Form, GenericInput, + Link, + LoadingIndicatorPage, SettingsPageTitle, - auth, useAppInfo, useFocusWhenNavigate, useNotification, useOverlayBlocker, - LoadingIndicatorPage, - Link, } from '@strapi/helper-plugin'; -import { Formik } from 'formik'; -import { - Box, - Button, - Grid, - GridItem, - HeaderLayout, - ContentLayout, - Typography, - Main, - Flex, -} from '@strapi/design-system'; import { ArrowLeft, Check } from '@strapi/icons'; import MagicLink from 'ee_else_ce/pages/SettingsPage/pages/Users/components/MagicLink'; +import { Formik } from 'formik'; +import get from 'lodash/get'; +import omit from 'lodash/omit'; +import pick from 'lodash/pick'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import { useHistory, useRouteMatch } from 'react-router-dom'; +import { useAdminUsers } from '../../../../../hooks/useAdminUsers'; import { formatAPIErrors, getFullName } from '../../../../../utils'; +import SelectRoles from '../components/SelectRoles'; +import { editValidation } from '../utils/validations/users'; + import { putUser } from './utils/api'; import layout from './utils/layout'; -import { editValidation } from '../utils/validations/users'; -import SelectRoles from '../components/SelectRoles'; -import { useAdminUsers } from '../../../../../hooks/useAdminUsers'; const fieldsToPick = ['email', 'firstname', 'lastname', 'username', 'isActive', 'roles']; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/CreateAction/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/CreateAction/index.js index c51dbaa419..85f045cefb 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/CreateAction/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/CreateAction/index.js @@ -1,8 +1,9 @@ import React from 'react'; -import { useIntl } from 'react-intl'; -import PropTypes from 'prop-types'; + import { Button } from '@strapi/design-system'; import { Envelop } from '@strapi/icons'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; const CreateAction = ({ onClick }) => { const { formatMessage } = useIntl(); diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/CreateAction/tests/index.test.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/CreateAction/tests/index.test.js index dddb6dd5ec..06a5bec5e4 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/CreateAction/tests/index.test.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/CreateAction/tests/index.test.js @@ -1,7 +1,8 @@ import React from 'react'; -import { render, fireEvent } from '@testing-library/react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { fireEvent, render } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; import CreateAction from '..'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/DynamicTable/TableRows/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/DynamicTable/TableRows/index.js index 75e1eeaf53..b4d44601d7 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/DynamicTable/TableRows/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/DynamicTable/TableRows/index.js @@ -1,19 +1,21 @@ import React from 'react'; -import PropTypes from 'prop-types'; + import { BaseCheckbox, Box, - IconButton, Flex, - Typography, + IconButton, Tbody, Td, Tr, + Typography, } from '@strapi/design-system'; +import { onRowClick, stopPropagation } from '@strapi/helper-plugin'; import { Pencil, Trash } from '@strapi/icons'; -import { useHistory } from 'react-router-dom'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { stopPropagation, onRowClick } from '@strapi/helper-plugin'; +import { useHistory } from 'react-router-dom'; + import { getFullName } from '../../../../../../../utils'; const TableRows = ({ diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/ModalForm/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/ModalForm/index.js index 7b4a7df28e..3d65d81798 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/ModalForm/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/ModalForm/index.js @@ -1,34 +1,35 @@ import React, { useState } from 'react'; -import PropTypes from 'prop-types'; -import { useIntl } from 'react-intl'; + import { - ModalLayout, - ModalHeader, - ModalFooter, - ModalBody, - Grid, - GridItem, Box, Button, Flex, + Grid, + GridItem, + ModalBody, + ModalFooter, + ModalHeader, + ModalLayout, Typography, } from '@strapi/design-system'; import { Breadcrumbs, Crumb } from '@strapi/design-system/v2'; -import { Formik } from 'formik'; import { Form, GenericInput, + useFetchClient, useNotification, useOverlayBlocker, - useFetchClient, } from '@strapi/helper-plugin'; -import { useMutation } from 'react-query'; - +import MagicLink from 'ee_else_ce/pages/SettingsPage/pages/Users/components/MagicLink'; import formDataModel from 'ee_else_ce/pages/SettingsPage/pages/Users/ListPage/ModalForm/utils/formDataModel'; import roleSettingsForm from 'ee_else_ce/pages/SettingsPage/pages/Users/ListPage/ModalForm/utils/roleSettingsForm'; -import MagicLink from 'ee_else_ce/pages/SettingsPage/pages/Users/components/MagicLink'; +import { Formik } from 'formik'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import { useMutation } from 'react-query'; import SelectRoles from '../../components/SelectRoles'; + import layout from './utils/layout'; import schema from './utils/schema'; import stepper from './utils/stepper'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/ModalForm/utils/schema.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/ModalForm/utils/schema.js index adf046691b..f35757e80e 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/ModalForm/utils/schema.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/ModalForm/utils/schema.js @@ -1,5 +1,5 @@ -import * as yup from 'yup'; import { translatedErrors } from '@strapi/helper-plugin'; +import * as yup from 'yup'; const schema = yup.object().shape({ firstname: yup.string().trim().required(translatedErrors.required), diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/PaginationFooter/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/PaginationFooter/index.js index 489d9644e2..3acb87b598 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/PaginationFooter/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/PaginationFooter/index.js @@ -1,7 +1,8 @@ import React from 'react'; -import PropTypes from 'prop-types'; + import { Box, Flex } from '@strapi/design-system'; -import { PaginationURLQuery, PageSizeURLQuery } from '@strapi/helper-plugin'; +import { PageSizeURLQuery, PaginationURLQuery } from '@strapi/helper-plugin'; +import PropTypes from 'prop-types'; const PaginationFooter = ({ pagination }) => { return ( diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/PaginationFooter/tests/index.test.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/PaginationFooter/tests/index.test.js index a91248f80a..06c3eb991a 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/PaginationFooter/tests/index.test.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/PaginationFooter/tests/index.test.js @@ -1,10 +1,12 @@ import React from 'react'; -import { act, render } from '@testing-library/react'; -import { IntlProvider } from 'react-intl'; -import { createMemoryHistory } from 'history'; -import { Router, Route } from 'react-router-dom'; -import { lightTheme, darkTheme } from '@strapi/design-system'; + +import { darkTheme, lightTheme } from '@strapi/design-system'; import { TrackingProvider } from '@strapi/helper-plugin'; +import { act, render } from '@testing-library/react'; +import { createMemoryHistory } from 'history'; +import { IntlProvider } from 'react-intl'; +import { Route, Router } from 'react-router-dom'; + import Theme from '../../../../../../../components/Theme'; import ThemeToggleProvider from '../../../../../../../components/ThemeToggleProvider'; import PaginationFooter from '../index'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/index.js index 9a168f78c9..fb60fdbd35 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/index.js @@ -1,27 +1,29 @@ import React, { useState } from 'react'; -import qs from 'qs'; + +import { ActionLayout, ContentLayout, HeaderLayout, Main } from '@strapi/design-system'; import { DynamicTable, + NoPermissions, SearchURLQuery, SettingsPageTitle, - useRBAC, - useNotification, - useFocusWhenNavigate, - NoPermissions, useAPIErrorHandler, useFetchClient, + useFocusWhenNavigate, + useNotification, + useRBAC, } from '@strapi/helper-plugin'; -import { ActionLayout, ContentLayout, HeaderLayout, Main } from '@strapi/design-system'; -import { useLocation } from 'react-router-dom'; +import useLicenseLimitNotification from 'ee_else_ce/hooks/useLicenseLimitNotification'; +import CreateAction from 'ee_else_ce/pages/SettingsPage/pages/Users/ListPage/CreateAction'; +import qs from 'qs'; import { useIntl } from 'react-intl'; import { useMutation, useQueryClient } from 'react-query'; -import CreateAction from 'ee_else_ce/pages/SettingsPage/pages/Users/ListPage/CreateAction'; -import useLicenseLimitNotification from 'ee_else_ce/hooks/useLicenseLimitNotification'; +import { useLocation } from 'react-router-dom'; import { useAdminUsers } from '../../../../../hooks/useAdminUsers'; import adminPermissions from '../../../../../permissions'; -import TableRows from './DynamicTable/TableRows'; import Filters from '../../../components/Filters'; + +import TableRows from './DynamicTable/TableRows'; import ModalForm from './ModalForm'; import PaginationFooter from './PaginationFooter'; import displayedFilters from './utils/displayedFilters'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/tests/index.test.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/tests/index.test.js index d39d538c75..f779a1d005 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/tests/index.test.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/tests/index.test.js @@ -1,11 +1,12 @@ import React from 'react'; + +import { darkTheme, lightTheme } from '@strapi/design-system'; +import { TrackingProvider, useRBAC } from '@strapi/helper-plugin'; import { act, render, waitFor } from '@testing-library/react'; -import { IntlProvider } from 'react-intl'; -import { Router, Route } from 'react-router-dom'; -import { QueryClient, QueryClientProvider } from 'react-query'; import { createMemoryHistory } from 'history'; -import { useRBAC, TrackingProvider } from '@strapi/helper-plugin'; -import { lightTheme, darkTheme } from '@strapi/design-system'; +import { IntlProvider } from 'react-intl'; +import { QueryClient, QueryClientProvider } from 'react-query'; +import { Route, Router } from 'react-router-dom'; import Theme from '../../../../../../components/Theme'; import ThemeToggleProvider from '../../../../../../components/ThemeToggleProvider'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/utils/tableHeaders.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/utils/tableHeaders.js index 203d1873ad..e846a82f06 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/utils/tableHeaders.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/utils/tableHeaders.js @@ -1,4 +1,5 @@ import React from 'react'; + import { Flex, Typography } from '@strapi/design-system'; import { Status } from '@strapi/helper-plugin'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ProtectedEditPage/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ProtectedEditPage/index.js index 5e0357d693..c74c2c35bb 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ProtectedEditPage/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ProtectedEditPage/index.js @@ -1,5 +1,6 @@ import React, { useEffect, useMemo } from 'react'; -import { useRBAC, LoadingIndicatorPage, useNotification } from '@strapi/helper-plugin'; + +import { LoadingIndicatorPage, useNotification, useRBAC } from '@strapi/helper-plugin'; import { Redirect, useLocation } from 'react-router-dom'; import adminPermissions from '../../../../../permissions'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ProtectedListPage/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ProtectedListPage/index.js index 74bede9b9b..99d2953665 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ProtectedListPage/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ProtectedListPage/index.js @@ -1,5 +1,7 @@ import React from 'react'; + import { CheckPagePermissions } from '@strapi/helper-plugin'; + import adminPermissions from '../../../../../permissions'; import ListPage from '../ListPage'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/components/MagicLink/MagicLinkWrapper.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/components/MagicLink/MagicLinkWrapper.js index 3e9d3667df..ef283c58ff 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/components/MagicLink/MagicLinkWrapper.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/components/MagicLink/MagicLinkWrapper.js @@ -1,8 +1,9 @@ import React from 'react'; -import PropTypes from 'prop-types'; + import { IconButton } from '@strapi/design-system'; -import { useNotification, ContentBox, useClipboard } from '@strapi/helper-plugin'; +import { ContentBox, useClipboard, useNotification } from '@strapi/helper-plugin'; import { Duplicate } from '@strapi/icons'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; const MagicLinkWrapper = ({ children, target }) => { diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/components/MagicLink/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/components/MagicLink/index.js index e7bd4f7294..f7ba8435c7 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/components/MagicLink/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/components/MagicLink/index.js @@ -1,7 +1,10 @@ import React from 'react'; -import { useIntl } from 'react-intl'; + import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; + import basename from '../../../../../../core/utils/basename'; + import MagicLinkWrapper from './MagicLinkWrapper'; const MagicLink = ({ registrationToken }) => { diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/components/SelectRoles/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/components/SelectRoles/index.js index 92f200207b..e58e895aee 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/components/SelectRoles/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/components/SelectRoles/index.js @@ -1,11 +1,12 @@ import React from 'react'; + +import { Option, Select } from '@strapi/design-system'; +import { getFetchClient } from '@strapi/helper-plugin'; +import { Loader as LoadingIcon } from '@strapi/icons'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { Select, Option } from '@strapi/design-system'; import { useQuery } from 'react-query'; import styled, { keyframes } from 'styled-components'; -import { Loader as LoadingIcon } from '@strapi/icons'; -import { getFetchClient } from '@strapi/helper-plugin'; const rotation = keyframes` from { diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/utils/validations/users/edit.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/utils/validations/users/edit.js index 80db038e7c..9a4372e5c6 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/utils/validations/users/edit.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/utils/validations/users/edit.js @@ -1,4 +1,5 @@ import * as yup from 'yup'; + import { commonUserSchema } from './profile'; import rolesValidation from './roles'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/utils/validations/users/profile.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/utils/validations/users/profile.js index 69b5a14668..d4bdb006f3 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/utils/validations/users/profile.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/utils/validations/users/profile.js @@ -1,5 +1,5 @@ -import * as yup from 'yup'; import { translatedErrors } from '@strapi/helper-plugin'; +import * as yup from 'yup'; export const commonUserSchema = { firstname: yup.string().trim().required(translatedErrors.required), diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/utils/validations/users/roles.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/utils/validations/users/roles.js index 879cd04b7f..acfe69a94f 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/utils/validations/users/roles.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/utils/validations/users/roles.js @@ -1,5 +1,5 @@ -import * as yup from 'yup'; import { translatedErrors } from '@strapi/helper-plugin'; +import * as yup from 'yup'; const schema = { roles: yup.array().min(1, translatedErrors.required).required(translatedErrors.required), diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/Events/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/Events/index.js index 34082ed4e9..2433e64c48 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/Events/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/Events/index.js @@ -1,24 +1,24 @@ import * as React from 'react'; -import PropTypes from 'prop-types'; -import { useFormikContext } from 'formik'; -import { useIntl } from 'react-intl'; -import styled from 'styled-components'; import { - FieldLabel, - Flex, - Typography, BaseCheckbox, Checkbox, + FieldLabel, + Flex, Loader, RawTable as Table, - RawTh as Th, - RawTd as Td, - RawTr as Tr, - RawThead as Thead, RawTbody as Tbody, + RawTd as Td, + RawTh as Th, + RawThead as Thead, + RawTr as Tr, + Typography, VisuallyHidden, } from '@strapi/design-system'; +import { useFormikContext } from 'formik'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import styled from 'styled-components'; import { useContentTypes } from '../../../../../../../hooks/useContentTypes'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/HeadersInput/Combobox.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/HeadersInput/Combobox.js index ff35616073..68e5dbdbcd 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/HeadersInput/Combobox.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/HeadersInput/Combobox.js @@ -1,7 +1,8 @@ -import React, { useState, useEffect } from 'react'; -import PropTypes from 'prop-types'; -import { useFormikContext } from 'formik'; +import React, { useEffect, useState } from 'react'; + import { ComboboxOption, CreatableCombobox } from '@strapi/design-system'; +import { useFormikContext } from 'formik'; +import PropTypes from 'prop-types'; const HTTP_HEADERS = [ 'A-IM', diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/HeadersInput/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/HeadersInput/index.js index e52ba006ad..b440611f04 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/HeadersInput/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/HeadersInput/index.js @@ -1,17 +1,19 @@ import React from 'react'; -import { RemoveRoundedButton } from '@strapi/helper-plugin'; -import { Plus } from '@strapi/icons'; + import { Box, FieldLabel, + Flex, Grid, GridItem, - Flex, - TextInput, TextButton, + TextInput, } from '@strapi/design-system'; +import { RemoveRoundedButton } from '@strapi/helper-plugin'; +import { Plus } from '@strapi/icons'; import { Field, FieldArray, useFormikContext } from 'formik'; import { useIntl } from 'react-intl'; + import Combobox from './Combobox'; const HeadersInput = () => { diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/TriggerContainer/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/TriggerContainer/index.js index cc1c538d7f..74f0fe0c5d 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/TriggerContainer/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/TriggerContainer/index.js @@ -1,10 +1,11 @@ import React from 'react'; + +import { Box, Flex, Grid, GridItem, Typography } from '@strapi/design-system'; +import { pxToRem } from '@strapi/helper-plugin'; +import { Check, Cross, Loader } from '@strapi/icons'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; import styled from 'styled-components'; -import { pxToRem } from '@strapi/helper-plugin'; -import { Check, Cross, Loader } from '@strapi/icons'; -import { Box, Flex, Typography, Grid, GridItem } from '@strapi/design-system'; // Being discussed in Notion: create a component in Parts const Icon = styled.svg( diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/WebhookForm/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/WebhookForm/index.js index 35c2fae81a..466dbba526 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/WebhookForm/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/WebhookForm/index.js @@ -1,25 +1,27 @@ import React, { useState } from 'react'; -import PropTypes from 'prop-types'; -import { Field, FormikProvider, useFormik } from 'formik'; -import { useIntl } from 'react-intl'; -import { Form, Link } from '@strapi/helper-plugin'; -import { ArrowLeft, Check, Play as Publish } from '@strapi/icons'; + import { + Box, + Button, + ContentLayout, + Flex, Grid, GridItem, - Button, - Flex, - TextInput, HeaderLayout, - ContentLayout, - Box, + TextInput, } from '@strapi/design-system'; - +import { Form, Link } from '@strapi/helper-plugin'; +import { ArrowLeft, Check, Play as Publish } from '@strapi/icons'; import EventTable from 'ee_else_ce/pages/SettingsPage/pages/Webhooks/EditView/components/EventTable'; -import { makeWebhookValidationSchema } from './utils/makeWebhookValidationSchema'; +import { Field, FormikProvider, useFormik } from 'formik'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; + import HeadersInput from '../HeadersInput'; import TriggerContainer from '../TriggerContainer'; +import { makeWebhookValidationSchema } from './utils/makeWebhookValidationSchema'; + const WebhookForm = ({ handleSubmit, triggerWebhook, diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/WebhookForm/tests/index.test.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/WebhookForm/tests/index.test.js index d14861692e..cf453e09b7 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/WebhookForm/tests/index.test.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/WebhookForm/tests/index.test.js @@ -1,13 +1,14 @@ -import { render, screen, waitFor, fireEvent } from '@testing-library/react'; import React from 'react'; -import { Router } from 'react-router-dom'; -import { createMemoryHistory } from 'history'; -import { QueryClientProvider, QueryClient } from 'react-query'; + import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { NotificationsProvider } from '@strapi/helper-plugin'; +import { fireEvent, render, screen, waitFor } from '@testing-library/react'; +import { createMemoryHistory } from 'history'; +import { QueryClient, QueryClientProvider } from 'react-query'; +import { Router } from 'react-router-dom'; -import en from '../../../../../../../../translations/en.json'; import LanguageProvider from '../../../../../../../../components/LanguageProvider'; +import en from '../../../../../../../../translations/en.json'; import WebhookForm from '../index'; jest.mock('../../../../../../../../hooks/useContentTypes'); diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/WebhookForm/utils/makeWebhookValidationSchema.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/WebhookForm/utils/makeWebhookValidationSchema.js index f333902db7..778a8e99c3 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/WebhookForm/utils/makeWebhookValidationSchema.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/WebhookForm/utils/makeWebhookValidationSchema.js @@ -1,5 +1,5 @@ -import * as yup from 'yup'; import { translatedErrors } from '@strapi/helper-plugin'; +import * as yup from 'yup'; const NAME_REGEX = /(^$)|(^[A-Za-z][_0-9A-Za-z ]*$)/; const URL_REGEX = /(^$)|((https?:\/\/.*)(d*)\/?(.*))/; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/index.js index 69e534c653..b270181621 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/index.js @@ -1,15 +1,18 @@ import * as React from 'react'; + +import { Main } from '@strapi/design-system'; import { LoadingIndicatorPage, SettingsPageTitle, - useNotification, - useFetchClient, useAPIErrorHandler, + useFetchClient, + useNotification, } from '@strapi/helper-plugin'; -import { Main } from '@strapi/design-system'; import { useMutation, useQuery, useQueryClient } from 'react-query'; import { useHistory, useRouteMatch } from 'react-router-dom'; + import { useContentTypes } from '../../../../../hooks/useContentTypes'; + import WebhookForm from './components/WebhookForm'; const cleanData = (data) => ({ diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/ListView/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/ListView/index.js index 4f9ec37202..6898a6d9e6 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/ListView/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/ListView/index.js @@ -1,47 +1,48 @@ /* eslint-disable no-nested-ternary */ -import React, { useState, useEffect } from 'react'; -import { useHistory, useLocation } from 'react-router-dom'; -import { useIntl } from 'react-intl'; -import { useQuery, useMutation } from 'react-query'; +import React, { useEffect, useState } from 'react'; import { - useFetchClient, - useRBAC, - LoadingIndicatorPage, - useNotification, - useFocusWhenNavigate, - SettingsPageTitle, - ConfirmDialog, - onRowClick, - stopPropagation, - LinkButton, - useAPIErrorHandler, -} from '@strapi/helper-plugin'; -import { - HeaderLayout, - Layout, - ContentLayout, ActionLayout, + BaseCheckbox, + Box, + Button, + ContentLayout, EmptyStateLayout, Flex, + HeaderLayout, IconButton, - BaseCheckbox, + Layout, + Main, + Switch, Table, - Thead, - Tr, - Th, Tbody, Td, TFooter, + Th, + Thead, + Tr, Typography, - Button, - Switch, - Main, useNotifyAT, - Box, VisuallyHidden, } from '@strapi/design-system'; -import { Plus, Pencil, Trash, EmptyDocuments } from '@strapi/icons'; +import { + ConfirmDialog, + LinkButton, + LoadingIndicatorPage, + onRowClick, + SettingsPageTitle, + stopPropagation, + useAPIErrorHandler, + useFetchClient, + useFocusWhenNavigate, + useNotification, + useRBAC, +} from '@strapi/helper-plugin'; +import { EmptyDocuments, Pencil, Plus, Trash } from '@strapi/icons'; +import { useIntl } from 'react-intl'; +import { useMutation, useQuery } from 'react-query'; +import { useHistory, useLocation } from 'react-router-dom'; + import adminPermissions from '../../../../../permissions'; const ListView = () => { diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/ListView/tests/index.test.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/ListView/tests/index.test.js index c009578fb8..0e08afb499 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/ListView/tests/index.test.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/ListView/tests/index.test.js @@ -1,4 +1,7 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { useRBAC } from '@strapi/helper-plugin'; import { fireEvent, render as renderRTL, @@ -7,12 +10,11 @@ import { } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { IntlProvider } from 'react-intl'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; +import { QueryClient, QueryClientProvider } from 'react-query'; import { MemoryRouter } from 'react-router-dom'; -import { useRBAC } from '@strapi/helper-plugin'; -import { QueryClientProvider, QueryClient } from 'react-query'; import ListView from '../index'; + import server, { resetWebhooks } from './server'; const toggleNotification = jest.fn(); diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/ListView/tests/server.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/ListView/tests/server.js index bef2f24dc2..0990005b96 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/ListView/tests/server.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/ListView/tests/server.js @@ -1,5 +1,5 @@ -import { setupServer } from 'msw/node'; import { rest } from 'msw'; +import { setupServer } from 'msw/node'; const initialWebhooks = [ { id: 1, isEnabled: true, name: 'test', url: 'http:://strapi.io' }, diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/ProtectedCreateView/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/ProtectedCreateView/index.js index f6b04b82cd..3537269de4 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/ProtectedCreateView/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/ProtectedCreateView/index.js @@ -1,5 +1,7 @@ import React from 'react'; + import { CheckPagePermissions } from '@strapi/helper-plugin'; + import adminPermissions from '../../../../../permissions'; import EditView from '../EditView'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/ProtectedEditView/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/ProtectedEditView/index.js index 8212704d98..ad58f51445 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/ProtectedEditView/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/ProtectedEditView/index.js @@ -1,5 +1,7 @@ import React from 'react'; + import { CheckPagePermissions } from '@strapi/helper-plugin'; + import adminPermissions from '../../../../../permissions'; import EditView from '../EditView'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/ProtectedListView/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/ProtectedListView/index.js index 83b00d6584..1c2b2a1c57 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/ProtectedListView/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/ProtectedListView/index.js @@ -1,5 +1,7 @@ import React from 'react'; + import { CheckPagePermissions } from '@strapi/helper-plugin'; + import adminPermissions from '../../../../../permissions'; import ListView from '../ListView'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/tests/index.test.js b/packages/core/admin/admin/src/pages/SettingsPage/tests/index.test.js index 7de3bf8e3c..90cdeff3dd 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/tests/index.test.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/tests/index.test.js @@ -1,13 +1,15 @@ import React from 'react'; -import { Router, Route } from 'react-router-dom'; -import { StrapiAppProvider, AppInfosContext, TrackingProvider } from '@strapi/helper-plugin'; + +import { darkTheme, lightTheme } from '@strapi/design-system'; +import { AppInfosContext, StrapiAppProvider, TrackingProvider } from '@strapi/helper-plugin'; import { act, render, screen, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { createMemoryHistory } from 'history'; -import { lightTheme, darkTheme } from '@strapi/design-system'; +import { Route, Router } from 'react-router-dom'; + +import { SettingsPage } from '..'; import Theme from '../../../components/Theme'; import ThemeToggleProvider from '../../../components/ThemeToggleProvider'; -import { SettingsPage } from '..'; import { useSettingsMenu } from '../../../hooks'; jest.mock('../../../hooks', () => ({ diff --git a/packages/core/admin/admin/src/pages/SettingsPage/utils/createSectionsRoutes.js b/packages/core/admin/admin/src/pages/SettingsPage/utils/createSectionsRoutes.js index 9c78b4b42e..38dd49bb5c 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/utils/createSectionsRoutes.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/utils/createSectionsRoutes.js @@ -1,4 +1,5 @@ import flatMap from 'lodash/flatMap'; + import { createRoute } from '../../../utils'; const createSectionsRoutes = (settings) => { diff --git a/packages/core/admin/admin/src/pages/SettingsPage/utils/index.js b/packages/core/admin/admin/src/pages/SettingsPage/utils/index.js index 3ea369d8c3..ca968308d9 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/utils/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/utils/index.js @@ -1,4 +1,3 @@ export { default as createSectionsRoutes } from './createSectionsRoutes'; export { default as getSectionsToDisplay } from './getSectionsToDisplay'; - export { default as routes } from './routes'; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/utils/routes.js b/packages/core/admin/admin/src/pages/SettingsPage/utils/routes.js index 856e205ae9..663fd8cbdc 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/utils/routes.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/utils/routes.js @@ -1,5 +1,6 @@ // This file makes it easier to make the difference between the ee and ce version import customRoutes from 'ee_else_ce/pages/SettingsPage/utils/customRoutes'; + import defaultRoutes from './defaultRoutes'; export default [...customRoutes, ...defaultRoutes]; diff --git a/packages/core/admin/admin/src/pages/UseCasePage/index.js b/packages/core/admin/admin/src/pages/UseCasePage/index.js index 97d16cfd3a..40e08fea9d 100644 --- a/packages/core/admin/admin/src/pages/UseCasePage/index.js +++ b/packages/core/admin/admin/src/pages/UseCasePage/index.js @@ -1,20 +1,22 @@ import React, { useState } from 'react'; + +import { + Box, + Button, + Flex, + Main, + Option, + Select, + TextButton, + TextInput, + Typography, +} from '@strapi/design-system'; +import { auth, pxToRem, useFetchClient, useNotification } from '@strapi/helper-plugin'; +import { parse } from 'qs'; import { useIntl } from 'react-intl'; import { useHistory } from 'react-router-dom'; import styled from 'styled-components'; -import { parse } from 'qs'; -import { pxToRem, useFetchClient, useNotification, auth } from '@strapi/helper-plugin'; -import { - Main, - Flex, - Box, - Typography, - Select, - Option, - TextInput, - TextButton, - Button, -} from '@strapi/design-system'; + import Logo from '../../components/UnauthenticatedLogo'; import UnauthenticatedLayout, { LayoutContent } from '../../layouts/UnauthenticatedLayout'; diff --git a/packages/core/admin/admin/src/pages/UseCasePage/tests/index.test.js b/packages/core/admin/admin/src/pages/UseCasePage/tests/index.test.js index cf08fd08cb..993f7ee147 100644 --- a/packages/core/admin/admin/src/pages/UseCasePage/tests/index.test.js +++ b/packages/core/admin/admin/src/pages/UseCasePage/tests/index.test.js @@ -1,10 +1,12 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; +import { createMemoryHistory } from 'history'; import { IntlProvider } from 'react-intl'; import { Router } from 'react-router-dom'; -import { createMemoryHistory } from 'history'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; + import UseCasePage from '../index'; jest.mock('../../../components/LocalesProvider/useLocalesProvider', () => () => ({ diff --git a/packages/core/admin/admin/src/permissions/index.js b/packages/core/admin/admin/src/permissions/index.js index 83742a9995..dae81642a2 100644 --- a/packages/core/admin/admin/src/permissions/index.js +++ b/packages/core/admin/admin/src/permissions/index.js @@ -1,5 +1,6 @@ -import merge from 'lodash/merge'; import customPermissions from 'ee_else_ce/permissions/customPermissions'; +import merge from 'lodash/merge'; + import defaultPermissions from './defaultPermissions'; const permissions = merge(defaultPermissions, customPermissions); diff --git a/packages/core/admin/admin/src/reducers.js b/packages/core/admin/admin/src/reducers.js index 2dc6180ec1..912cbff289 100644 --- a/packages/core/admin/admin/src/reducers.js +++ b/packages/core/admin/admin/src/reducers.js @@ -1,10 +1,10 @@ -import appReducer from './pages/App/reducer'; import rbacProviderReducer from './components/RBACProvider/reducer'; +import rbacManagerReducer from './content-manager/hooks/useSyncRbac/reducer'; import cmAppReducer from './content-manager/pages/App/reducer'; import editViewLayoutManagerReducer from './content-manager/pages/EditViewLayoutManager/reducer'; import listViewReducer from './content-manager/pages/ListView/reducer'; -import rbacManagerReducer from './content-manager/hooks/useSyncRbac/reducer'; import editViewCrudReducer from './content-manager/sharedReducers/crudReducer/reducer'; +import appReducer from './pages/App/reducer'; const contentManagerReducers = { 'content-manager_app': cmAppReducer, diff --git a/packages/core/admin/admin/src/shared/components/InjectionZone/index.js b/packages/core/admin/admin/src/shared/components/InjectionZone/index.js index 7451cc1d3e..36bb011a79 100644 --- a/packages/core/admin/admin/src/shared/components/InjectionZone/index.js +++ b/packages/core/admin/admin/src/shared/components/InjectionZone/index.js @@ -1,5 +1,7 @@ import React from 'react'; + import PropTypes from 'prop-types'; + import { useInjectionZone } from '../../hooks'; const InjectionZone = ({ area, ...props }) => { diff --git a/packages/core/admin/admin/src/shared/hooks/useAdminProvider/index.js b/packages/core/admin/admin/src/shared/hooks/useAdminProvider/index.js index bb562542a6..418d7baf14 100644 --- a/packages/core/admin/admin/src/shared/hooks/useAdminProvider/index.js +++ b/packages/core/admin/admin/src/shared/hooks/useAdminProvider/index.js @@ -1,4 +1,5 @@ import { useContext } from 'react'; + import { AdminContext } from '../../../contexts'; const useAdminProvider = () => { diff --git a/packages/core/admin/admin/src/tests/StrapiApp.test.js b/packages/core/admin/admin/src/tests/StrapiApp.test.js index 8056169895..e11d67efd8 100644 --- a/packages/core/admin/admin/src/tests/StrapiApp.test.js +++ b/packages/core/admin/admin/src/tests/StrapiApp.test.js @@ -1,8 +1,9 @@ -import { render } from '@testing-library/react'; import { fixtures } from '@strapi/admin-test-utils'; +import { render } from '@testing-library/react'; + import { Components, Fields } from '../core/apis'; -import StrapiApp from '../StrapiApp'; import appReducers from '../reducers'; +import StrapiApp from '../StrapiApp'; const library = { fields: Fields(), components: Components() }; const middlewares = { middlewares: [] }; diff --git a/packages/core/admin/admin/src/translations/tests/index.test.js b/packages/core/admin/admin/src/translations/tests/index.test.js index 230ee1dba7..12e9ae6b00 100644 --- a/packages/core/admin/admin/src/translations/tests/index.test.js +++ b/packages/core/admin/admin/src/translations/tests/index.test.js @@ -1,5 +1,6 @@ const fs = require('fs-extra'); const path = require('path'); + const languageNativeNames = require('../languageNativeNames').default; const languages = fs diff --git a/packages/core/admin/admin/src/utils/createRoute.js b/packages/core/admin/admin/src/utils/createRoute.js index e30f47517c..3481a7e456 100644 --- a/packages/core/admin/admin/src/utils/createRoute.js +++ b/packages/core/admin/admin/src/utils/createRoute.js @@ -1,7 +1,8 @@ import React, { useEffect, useState } from 'react'; + +import { LoadingIndicatorPage } from '@strapi/helper-plugin'; import PropTypes from 'prop-types'; import { Route } from 'react-router-dom'; -import { LoadingIndicatorPage } from '@strapi/helper-plugin'; const LazyCompo = ({ loadComponent }) => { const [Compo, setCompo] = useState(null); diff --git a/packages/core/admin/admin/src/utils/index.js b/packages/core/admin/admin/src/utils/index.js index 0dddd94e0e..39787a6bde 100644 --- a/packages/core/admin/admin/src/utils/index.js +++ b/packages/core/admin/admin/src/utils/index.js @@ -2,9 +2,9 @@ export { default as checkFormValidity } from './checkFormValidity'; export { default as createRoute } from './createRoute'; export { default as formatAPIErrors } from './formatAPIErrors'; export { default as getAttributesToDisplay } from './getAttributesToDisplay'; +export { default as getExistingActions } from './getExistingActions'; +export { default as getFullName } from './getFullName'; +export { default as getRequestUrl } from './getRequestUrl'; export { default as makeUniqueRoutes } from './makeUniqueRoutes'; export { default as sortLinks } from './sortLinks'; -export { default as getExistingActions } from './getExistingActions'; -export { default as getRequestUrl } from './getRequestUrl'; -export { default as getFullName } from './getFullName'; export { default as hashAdminUserEmail } from './uniqueAdminHash'; diff --git a/packages/core/admin/admin/src/utils/tests/getExistingActions.test.js b/packages/core/admin/admin/src/utils/tests/getExistingActions.test.js index 66da4a5867..81228d9eef 100644 --- a/packages/core/admin/admin/src/utils/tests/getExistingActions.test.js +++ b/packages/core/admin/admin/src/utils/tests/getExistingActions.test.js @@ -1,4 +1,5 @@ import getExistingActions from '../getExistingActions'; + import data from './data'; describe('ADMIN | utils | getExistingActions', () => { diff --git a/packages/core/admin/admin/src/utils/tests/uniqueAdminHash.test.js b/packages/core/admin/admin/src/utils/tests/uniqueAdminHash.test.js index e305835b37..c609b10076 100644 --- a/packages/core/admin/admin/src/utils/tests/uniqueAdminHash.test.js +++ b/packages/core/admin/admin/src/utils/tests/uniqueAdminHash.test.js @@ -1,5 +1,6 @@ import crypto from 'crypto'; import { TextEncoder } from 'util'; + import hashAdminUserEmail, { utils } from '../uniqueAdminHash'; const testHashValue = '8544bf5b5389959462912699664f03ed664a4b6d24f03b13bdbc362efc147873'; diff --git a/packages/core/admin/ee/admin/content-manager/components/DynamicTable/CellContent/ReviewWorkflowsStage/ReviewWorkflowsStageEE.js b/packages/core/admin/ee/admin/content-manager/components/DynamicTable/CellContent/ReviewWorkflowsStage/ReviewWorkflowsStageEE.js index 830e760b96..d10767b7f7 100644 --- a/packages/core/admin/ee/admin/content-manager/components/DynamicTable/CellContent/ReviewWorkflowsStage/ReviewWorkflowsStageEE.js +++ b/packages/core/admin/ee/admin/content-manager/components/DynamicTable/CellContent/ReviewWorkflowsStage/ReviewWorkflowsStageEE.js @@ -1,7 +1,8 @@ import React from 'react'; -import PropTypes from 'prop-types'; + import { Box, Flex, Typography } from '@strapi/design-system'; import { pxToRem } from '@strapi/helper-plugin'; +import PropTypes from 'prop-types'; import { getStageColorByHex } from '../../../../../pages/SettingsPage/pages/ReviewWorkflows/utils/colors'; diff --git a/packages/core/admin/ee/admin/content-manager/components/DynamicTable/CellContent/ReviewWorkflowsStage/getTableColumn.js b/packages/core/admin/ee/admin/content-manager/components/DynamicTable/CellContent/ReviewWorkflowsStage/getTableColumn.js index 685fe7c455..c5afe6c8de 100644 --- a/packages/core/admin/ee/admin/content-manager/components/DynamicTable/CellContent/ReviewWorkflowsStage/getTableColumn.js +++ b/packages/core/admin/ee/admin/content-manager/components/DynamicTable/CellContent/ReviewWorkflowsStage/getTableColumn.js @@ -1,11 +1,13 @@ import React from 'react'; -import { useIntl } from 'react-intl'; -import { Typography } from '@strapi/design-system'; -import ReviewWorkflowsStage from '.'; +import { Typography } from '@strapi/design-system'; +import { useIntl } from 'react-intl'; + import getTrad from '../../../../../../../admin/src/content-manager/utils/getTrad'; import { STAGE_COLOR_DEFAULT } from '../../../../../pages/SettingsPage/pages/ReviewWorkflows/constants'; +import ReviewWorkflowsStage from '.'; + export default (layout) => { const { formatMessage } = useIntl(); diff --git a/packages/core/admin/ee/admin/content-manager/components/DynamicTable/CellContent/ReviewWorkflowsStage/tests/ReviewWorkflowsStage.test.js b/packages/core/admin/ee/admin/content-manager/components/DynamicTable/CellContent/ReviewWorkflowsStage/tests/ReviewWorkflowsStage.test.js index ff92710118..76ec2a92a4 100644 --- a/packages/core/admin/ee/admin/content-manager/components/DynamicTable/CellContent/ReviewWorkflowsStage/tests/ReviewWorkflowsStage.test.js +++ b/packages/core/admin/ee/admin/content-manager/components/DynamicTable/CellContent/ReviewWorkflowsStage/tests/ReviewWorkflowsStage.test.js @@ -1,6 +1,7 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render } from '@testing-library/react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; import { IntlProvider } from 'react-intl'; import ReviewWorkflowsStage from '..'; diff --git a/packages/core/admin/ee/admin/content-manager/pages/EditView/InformationBox/InformationBoxEE.js b/packages/core/admin/ee/admin/content-manager/pages/EditView/InformationBox/InformationBoxEE.js index d297db2745..1840f7849e 100644 --- a/packages/core/admin/ee/admin/content-manager/pages/EditView/InformationBox/InformationBoxEE.js +++ b/packages/core/admin/ee/admin/content-manager/pages/EditView/InformationBox/InformationBoxEE.js @@ -1,16 +1,17 @@ import React from 'react'; + +import { Flex, Loader, SingleSelect, SingleSelectOption, Typography } from '@strapi/design-system'; import { - useCMEditViewDataManager, useAPIErrorHandler, + useCMEditViewDataManager, useFetchClient, useNotification, } from '@strapi/helper-plugin'; -import { Flex, Loader, SingleSelect, SingleSelectOption, Typography } from '@strapi/design-system'; import { useIntl } from 'react-intl'; import { useMutation } from 'react-query'; -import { useReviewWorkflows } from '../../../../pages/SettingsPage/pages/ReviewWorkflows/hooks/useReviewWorkflows'; import Information from '../../../../../../admin/src/content-manager/pages/EditView/Information'; +import { useReviewWorkflows } from '../../../../pages/SettingsPage/pages/ReviewWorkflows/hooks/useReviewWorkflows'; import { getStageColorByHex } from '../../../../pages/SettingsPage/pages/ReviewWorkflows/utils/colors'; const ATTRIBUTE_NAME = 'strapi_reviewWorkflows_stage'; diff --git a/packages/core/admin/ee/admin/content-manager/pages/EditView/InformationBox/tests/InformationBoxEE.test.js b/packages/core/admin/ee/admin/content-manager/pages/EditView/InformationBox/tests/InformationBoxEE.test.js index cd75366216..31a37c0652 100644 --- a/packages/core/admin/ee/admin/content-manager/pages/EditView/InformationBox/tests/InformationBoxEE.test.js +++ b/packages/core/admin/ee/admin/content-manager/pages/EditView/InformationBox/tests/InformationBoxEE.test.js @@ -1,10 +1,11 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { useCMEditViewDataManager } from '@strapi/helper-plugin'; import { render } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { IntlProvider } from 'react-intl'; -import { useCMEditViewDataManager } from '@strapi/helper-plugin'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import { QueryClientProvider, QueryClient } from 'react-query'; +import { QueryClient, QueryClientProvider } from 'react-query'; import { Provider } from 'react-redux'; import { createStore } from 'redux'; diff --git a/packages/core/admin/ee/admin/hooks/useAuthProviders/index.js b/packages/core/admin/ee/admin/hooks/useAuthProviders/index.js index b1396773a2..842ce5c709 100644 --- a/packages/core/admin/ee/admin/hooks/useAuthProviders/index.js +++ b/packages/core/admin/ee/admin/hooks/useAuthProviders/index.js @@ -1,7 +1,9 @@ -import { useReducer, useEffect } from 'react'; +import { useEffect, useReducer } from 'react'; + import { useFetchClient, useNotification } from '@strapi/helper-plugin'; import { getRequestUrl } from '../../../../admin/src/utils'; + import reducer, { initialState } from './reducer'; const useAuthProviders = ({ ssoEnabled }) => { diff --git a/packages/core/admin/ee/admin/hooks/useLicenseLimitNotification/index.js b/packages/core/admin/ee/admin/hooks/useLicenseLimitNotification/index.js index 5c3d1b63d9..7768ba4fc7 100644 --- a/packages/core/admin/ee/admin/hooks/useLicenseLimitNotification/index.js +++ b/packages/core/admin/ee/admin/hooks/useLicenseLimitNotification/index.js @@ -4,10 +4,12 @@ * */ import { useEffect } from 'react'; -import { useIntl } from 'react-intl'; -import { useLocation } from 'react-router-dom'; + import { useNotification } from '@strapi/helper-plugin'; import isNil from 'lodash/isNil'; +import { useIntl } from 'react-intl'; +import { useLocation } from 'react-router-dom'; + import useLicenseLimits from '../useLicenseLimits'; const STORAGE_KEY_PREFIX = 'strapi-notification-seat-limit'; diff --git a/packages/core/admin/ee/admin/hooks/useLicenseLimitNotification/tests/index.test.js b/packages/core/admin/ee/admin/hooks/useLicenseLimitNotification/tests/index.test.js index 8f9e7c1662..0570e986aa 100644 --- a/packages/core/admin/ee/admin/hooks/useLicenseLimitNotification/tests/index.test.js +++ b/packages/core/admin/ee/admin/hooks/useLicenseLimitNotification/tests/index.test.js @@ -1,4 +1,5 @@ import { renderHook } from '@testing-library/react'; + import useLicenseLimitNotification from '..'; import useLicenseLimits from '../../useLicenseLimits'; diff --git a/packages/core/admin/ee/admin/hooks/useLicenseLimits/index.js b/packages/core/admin/ee/admin/hooks/useLicenseLimits/index.js index a927403b4f..90b52192fd 100644 --- a/packages/core/admin/ee/admin/hooks/useLicenseLimits/index.js +++ b/packages/core/admin/ee/admin/hooks/useLicenseLimits/index.js @@ -1,5 +1,6 @@ import { useFetchClient, useRBAC } from '@strapi/helper-plugin'; import { useQuery } from 'react-query'; + import adminPermissions from '../../../../admin/src/permissions'; const useLicenseLimits = () => { diff --git a/packages/core/admin/ee/admin/hooks/useLicenseLimits/tests/index.test.js b/packages/core/admin/ee/admin/hooks/useLicenseLimits/tests/index.test.js index e525f62f5f..806bae3b77 100644 --- a/packages/core/admin/ee/admin/hooks/useLicenseLimits/tests/index.test.js +++ b/packages/core/admin/ee/admin/hooks/useLicenseLimits/tests/index.test.js @@ -1,6 +1,7 @@ -import { renderHook } from '@testing-library/react'; import { useFetchClient } from '@strapi/helper-plugin'; +import { renderHook } from '@testing-library/react'; import { useQuery } from 'react-query'; + import useLicenseLimits from '..'; jest.mock('@strapi/helper-plugin', () => ({ diff --git a/packages/core/admin/ee/admin/pages/AuthPage/components/Login/index.js b/packages/core/admin/ee/admin/pages/AuthPage/components/Login/index.js index 30c6407012..f625f3ae3b 100644 --- a/packages/core/admin/ee/admin/pages/AuthPage/components/Login/index.js +++ b/packages/core/admin/ee/admin/pages/AuthPage/components/Login/index.js @@ -1,11 +1,13 @@ import React from 'react'; + +import { Box, Divider, Flex, Typography } from '@strapi/design-system'; import PropTypes from 'prop-types'; -import styled from 'styled-components'; -import { Box, Flex, Divider, Typography } from '@strapi/design-system'; import { useIntl } from 'react-intl'; +import styled from 'styled-components'; + +import UnauthenticatedLayout from '../../../../../../admin/src/layouts/UnauthenticatedLayout'; import BaseLogin from '../../../../../../admin/src/pages/AuthPage/components/Login/BaseLogin'; import { useAuthProviders } from '../../../../hooks'; -import UnauthenticatedLayout from '../../../../../../admin/src/layouts/UnauthenticatedLayout'; import SSOProviders from '../Providers/SSOProviders'; const DividerFull = styled(Divider)` diff --git a/packages/core/admin/ee/admin/pages/AuthPage/components/Providers/SSOProviders.js b/packages/core/admin/ee/admin/pages/AuthPage/components/Providers/SSOProviders.js index 404fefe0b2..674aedbf9b 100644 --- a/packages/core/admin/ee/admin/pages/AuthPage/components/Providers/SSOProviders.js +++ b/packages/core/admin/ee/admin/pages/AuthPage/components/Providers/SSOProviders.js @@ -1,9 +1,10 @@ import React from 'react'; + +import { Flex, Grid, GridItem, Tooltip, Typography } from '@strapi/design-system'; import PropTypes from 'prop-types'; -import { Grid, GridItem, Flex, Typography, Tooltip } from '@strapi/design-system'; -import styled from 'styled-components'; import { useIntl } from 'react-intl'; import { Link } from 'react-router-dom'; +import styled from 'styled-components'; const SSOButton = styled.a` width: ${136 / 16}rem; diff --git a/packages/core/admin/ee/admin/pages/AuthPage/components/Providers/index.js b/packages/core/admin/ee/admin/pages/AuthPage/components/Providers/index.js index 03c259c02b..30e726dd55 100644 --- a/packages/core/admin/ee/admin/pages/AuthPage/components/Providers/index.js +++ b/packages/core/admin/ee/admin/pages/AuthPage/components/Providers/index.js @@ -1,16 +1,19 @@ import React from 'react'; + +import { Box, Button, Divider, Flex, Loader, Main, Typography } from '@strapi/design-system'; +import { Link } from '@strapi/helper-plugin'; +import { useIntl } from 'react-intl'; import { Redirect, useHistory } from 'react-router-dom'; import styled from 'styled-components'; -import { Link } from '@strapi/helper-plugin'; -import { Divider, Flex, Box, Button, Loader, Typography, Main } from '@strapi/design-system'; -import { useIntl } from 'react-intl'; -import { useAuthProviders } from '../../../../hooks'; + +import Logo from '../../../../../../admin/src/components/UnauthenticatedLogo'; import UnauthenticatedLayout, { Column, LayoutContent, } from '../../../../../../admin/src/layouts/UnauthenticatedLayout'; +import { useAuthProviders } from '../../../../hooks'; + import SSOProviders from './SSOProviders'; -import Logo from '../../../../../../admin/src/components/UnauthenticatedLogo'; const DividerFull = styled(Divider)` flex: 1; diff --git a/packages/core/admin/ee/admin/pages/AuthPage/utils/forms.js b/packages/core/admin/ee/admin/pages/AuthPage/utils/forms.js index d2d9eb5bde..3b562561da 100644 --- a/packages/core/admin/ee/admin/pages/AuthPage/utils/forms.js +++ b/packages/core/admin/ee/admin/pages/AuthPage/utils/forms.js @@ -1,5 +1,5 @@ -import Providers from '../components/Providers'; import baseForms from '../../../../../admin/src/pages/AuthPage/utils/forms'; +import Providers from '../components/Providers'; const forms = { ...baseForms, diff --git a/packages/core/admin/ee/admin/pages/AuthResponse/index.js b/packages/core/admin/ee/admin/pages/AuthResponse/index.js index dc1b8a7108..b6c8081280 100644 --- a/packages/core/admin/ee/admin/pages/AuthResponse/index.js +++ b/packages/core/admin/ee/admin/pages/AuthResponse/index.js @@ -1,8 +1,10 @@ -import React, { useEffect, useRef, useCallback } from 'react'; -import { useHistory, useRouteMatch } from 'react-router-dom'; -import { useIntl } from 'react-intl'; -import Cookies from 'js-cookie'; +import React, { useCallback, useEffect, useRef } from 'react'; + import { auth, LoadingIndicatorPage, useFetchClient } from '@strapi/helper-plugin'; +import Cookies from 'js-cookie'; +import { useIntl } from 'react-intl'; +import { useHistory, useRouteMatch } from 'react-router-dom'; + import { getRequestUrl } from '../../../../admin/src/utils'; const AuthResponse = () => { diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ApplicationInfosPage/components/AdminSeatInfo/index.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ApplicationInfosPage/components/AdminSeatInfo/index.js index 7741a221f6..019acddc83 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ApplicationInfosPage/components/AdminSeatInfo/index.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ApplicationInfosPage/components/AdminSeatInfo/index.js @@ -1,9 +1,11 @@ import React from 'react'; -import { useIntl } from 'react-intl'; -import { Flex, Tooltip, Icon, GridItem, Typography } from '@strapi/design-system'; + +import { Flex, GridItem, Icon, Tooltip, Typography } from '@strapi/design-system'; import { Link } from '@strapi/design-system/v2'; -import { ExternalLink, ExclamationMarkCircle } from '@strapi/icons'; import { pxToRem } from '@strapi/helper-plugin'; +import { ExclamationMarkCircle, ExternalLink } from '@strapi/icons'; +import { useIntl } from 'react-intl'; + import { useLicenseLimits } from '../../../../../../hooks'; const BILLING_STRAPI_CLOUD_URL = 'https://cloud.strapi.io/profile/billing'; diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ApplicationInfosPage/components/AdminSeatInfo/tests/index.test.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ApplicationInfosPage/components/AdminSeatInfo/tests/index.test.js index c6ee77f685..1ed7896758 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ApplicationInfosPage/components/AdminSeatInfo/tests/index.test.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ApplicationInfosPage/components/AdminSeatInfo/tests/index.test.js @@ -1,10 +1,11 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import { useLicenseLimits } from '../../../../../../../hooks'; import AdminSeatInfo from '..'; +import { useLicenseLimits } from '../../../../../../../hooks'; const LICENSE_MOCK = { license: { diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/ComboboxFilter/index.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/ComboboxFilter/index.js index d6d525c663..95958b3fe8 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/ComboboxFilter/index.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/ComboboxFilter/index.js @@ -1,7 +1,8 @@ import React from 'react'; + +import { Combobox, ComboboxOption } from '@strapi/design-system'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { Combobox, ComboboxOption } from '@strapi/design-system'; const ComboboxFilter = ({ value, options, onChange }) => { const { formatMessage } = useIntl(); diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/Modal/ActionBody.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/Modal/ActionBody.js index 307d83bd81..b1c95079ec 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/Modal/ActionBody.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/Modal/ActionBody.js @@ -1,8 +1,11 @@ import React from 'react'; + +import { Box, Flex, Grid, JSONInput, Loader, Typography } from '@strapi/design-system'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { Loader, Grid, Box, Flex, Typography, JSONInput } from '@strapi/design-system'; + import { getDefaultMessage } from '../utils/getActionTypesDefaultMessages'; + import ActionItem from './ActionItem'; const ActionBody = ({ status, data, formattedDate }) => { diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/Modal/ActionItem.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/Modal/ActionItem.js index ad874268f7..14ab202bc3 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/Modal/ActionItem.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/Modal/ActionItem.js @@ -1,6 +1,7 @@ import React from 'react'; -import PropTypes from 'prop-types'; + import { Flex, Typography } from '@strapi/design-system'; +import PropTypes from 'prop-types'; const ActionItem = ({ actionLabel, actionName }) => { return ( diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/Modal/index.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/Modal/index.js index 68c5a53fca..b945d9c733 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/Modal/index.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/Modal/index.js @@ -1,10 +1,13 @@ import React from 'react'; + +import { ModalBody, ModalHeader, ModalLayout } from '@strapi/design-system'; +import { Breadcrumbs, Crumb } from '@strapi/design-system/v2'; +import { useFetchClient, useNotification } from '@strapi/helper-plugin'; import PropTypes from 'prop-types'; import { useQuery } from 'react-query'; -import { ModalLayout, ModalHeader, ModalBody } from '@strapi/design-system'; -import { Breadcrumbs, Crumb } from '@strapi/design-system/v2'; -import { useNotification, useFetchClient } from '@strapi/helper-plugin'; + import useFormatTimeStamp from '../hooks/useFormatTimeStamp'; + import ActionBody from './ActionBody'; const Modal = ({ handleClose, logId }) => { diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/PaginationFooter/index.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/PaginationFooter/index.js index 83b0ffabd6..03e921300d 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/PaginationFooter/index.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/PaginationFooter/index.js @@ -1,7 +1,8 @@ import React from 'react'; -import PropTypes from 'prop-types'; + import { Box, Flex } from '@strapi/design-system'; -import { PaginationURLQuery, PageSizeURLQuery } from '@strapi/helper-plugin'; +import { PageSizeURLQuery, PaginationURLQuery } from '@strapi/helper-plugin'; +import PropTypes from 'prop-types'; const PaginationFooter = ({ pagination }) => { return ( diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/TableRows/index.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/TableRows/index.js index 9a41d46047..a4b7512831 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/TableRows/index.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/TableRows/index.js @@ -1,9 +1,11 @@ import React from 'react'; + +import { Flex, IconButton, Tbody, Td, Tr, Typography } from '@strapi/design-system'; +import { onRowClick, stopPropagation } from '@strapi/helper-plugin'; +import { Eye } from '@strapi/icons'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { IconButton, Flex, Typography, Tbody, Td, Tr } from '@strapi/design-system'; -import { Eye } from '@strapi/icons'; -import { onRowClick, stopPropagation } from '@strapi/helper-plugin'; + import useFormatTimeStamp from '../hooks/useFormatTimeStamp'; import { getDefaultMessage } from '../utils/getActionTypesDefaultMessages'; diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/TableRows/tests/index.test.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/TableRows/tests/index.test.js index 7d4d22bba8..0c3efd57f6 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/TableRows/tests/index.test.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/TableRows/tests/index.test.js @@ -1,9 +1,11 @@ import React from 'react'; -import { Router } from 'react-router-dom'; -import { IntlProvider } from 'react-intl'; -import { createMemoryHistory } from 'history'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { fireEvent, render, screen } from '@testing-library/react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; +import { createMemoryHistory } from 'history'; +import { IntlProvider } from 'react-intl'; +import { Router } from 'react-router-dom'; + import TableRows from '..'; const history = createMemoryHistory(); diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/hooks/useAuditLogsData.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/hooks/useAuditLogsData.js index b7e098f322..943e496501 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/hooks/useAuditLogsData.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/hooks/useAuditLogsData.js @@ -1,5 +1,5 @@ +import { useFetchClient, useNotification } from '@strapi/helper-plugin'; import { useQuery } from 'react-query'; -import { useNotification, useFetchClient } from '@strapi/helper-plugin'; import { useLocation } from 'react-router-dom'; import { useAdminUsers } from '../../../../../../../../admin/src/hooks/useAdminUsers'; diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/hooks/useFormatTimeStamp.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/hooks/useFormatTimeStamp.js index 6c6951619a..2e985c5b26 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/hooks/useFormatTimeStamp.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/hooks/useFormatTimeStamp.js @@ -1,5 +1,5 @@ -import { useIntl } from 'react-intl'; import parseISO from 'date-fns/parseISO'; +import { useIntl } from 'react-intl'; const useFormatTimeStamp = () => { const { formatDate } = useIntl(); diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/index.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/index.js index 8393560089..a28cb66581 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/index.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/index.js @@ -1,29 +1,32 @@ import React from 'react'; -import { useIntl } from 'react-intl'; + import { - SettingsPageTitle, - DynamicTable, - useRBAC, - useFocusWhenNavigate, - useQueryParams, - AnErrorOccurred, -} from '@strapi/helper-plugin'; -import { - Box, - HeaderLayout, - ContentLayout, ActionLayout, + Box, + ContentLayout, + HeaderLayout, Layout, Main, } from '@strapi/design-system'; -import adminPermissions from '../../../../../../../admin/src/permissions'; -import TableRows from './TableRows'; -import tableHeaders from './utils/tableHeaders'; -import PaginationFooter from './PaginationFooter'; -import Modal from './Modal'; +import { + AnErrorOccurred, + DynamicTable, + SettingsPageTitle, + useFocusWhenNavigate, + useQueryParams, + useRBAC, +} from '@strapi/helper-plugin'; +import { useIntl } from 'react-intl'; + import Filters from '../../../../../../../admin/src/pages/SettingsPage/components/Filters'; -import getDisplayedFilters from './utils/getDisplayedFilters'; +import adminPermissions from '../../../../../../../admin/src/permissions'; + import useAuditLogsData from './hooks/useAuditLogsData'; +import Modal from './Modal'; +import PaginationFooter from './PaginationFooter'; +import TableRows from './TableRows'; +import getDisplayedFilters from './utils/getDisplayedFilters'; +import tableHeaders from './utils/tableHeaders'; const auditLogsPermissions = { ...adminPermissions.settings.auditLogs, diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/tests/index.test.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/tests/index.test.js index 5f358d8556..a4148c8285 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/tests/index.test.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/tests/index.test.js @@ -1,14 +1,17 @@ import React from 'react'; -import { Router } from 'react-router-dom'; -import { IntlProvider } from 'react-intl'; -import { createMemoryHistory } from 'history'; -import { render, screen, waitFor, within, fireEvent } from '@testing-library/react'; -import { QueryClient, QueryClientProvider } from 'react-query'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { fireEvent, render, screen, waitFor, within } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; +import { createMemoryHistory } from 'history'; +import { IntlProvider } from 'react-intl'; +import { QueryClient, QueryClientProvider } from 'react-query'; +import { Router } from 'react-router-dom'; + import useAuditLogsData from '../hooks/useAuditLogsData'; import ListView from '../index'; -import { TEST_PAGE_DATA, TEST_SINGLE_DATA, getBigTestPageData } from './utils/data'; + +import { getBigTestPageData, TEST_PAGE_DATA, TEST_SINGLE_DATA } from './utils/data'; const history = createMemoryHistory(); const user = userEvent.setup(); diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/tests/utils/data.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/tests/utils/data.js index bdf72b388b..b5a59f2db9 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/tests/utils/data.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/tests/utils/data.js @@ -70,4 +70,4 @@ const getBigTestPageData = (quantity) => { return data; }; -export { TEST_PAGE_DATA, TEST_SINGLE_DATA, getBigTestPageData }; +export { getBigTestPageData, TEST_PAGE_DATA, TEST_SINGLE_DATA }; diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/utils/getDisplayedFilters.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/utils/getDisplayedFilters.js index 2ab5224600..9f05861805 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/utils/getDisplayedFilters.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/utils/getDisplayedFilters.js @@ -1,5 +1,6 @@ import ComboboxFilter from '../ComboboxFilter'; -import { getDefaultMessage, actionTypes } from './getActionTypesDefaultMessages'; + +import { actionTypes, getDefaultMessage } from './getActionTypesDefaultMessages'; const customOperators = [ { diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ProtectedListPage/index.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ProtectedListPage/index.js index 8c13833b37..6df441287a 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ProtectedListPage/index.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ProtectedListPage/index.js @@ -1,5 +1,7 @@ import React from 'react'; + import { CheckPagePermissions } from '@strapi/helper-plugin'; + import adminPermissions from '../../../../../../../admin/src/permissions'; import ListView from '../ListView'; diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/ReviewWorkflows.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/ReviewWorkflows.js index 174dd397d2..beaee8e358 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/ReviewWorkflows.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/ReviewWorkflows.js @@ -1,9 +1,6 @@ import React, { useEffect, useState } from 'react'; -import { FormikProvider, useFormik, Form } from 'formik'; -import { useIntl } from 'react-intl'; -import { useSelector, useDispatch } from 'react-redux'; -import { useMutation } from 'react-query'; +import { Button, ContentLayout, HeaderLayout, Layout, Loader, Main } from '@strapi/design-system'; import { CheckPagePermissions, ConfirmDialog, @@ -13,19 +10,23 @@ import { useNotification, useTracking, } from '@strapi/helper-plugin'; -import { Button, ContentLayout, HeaderLayout, Layout, Loader, Main } from '@strapi/design-system'; import { Check } from '@strapi/icons'; +import { Form, FormikProvider, useFormik } from 'formik'; +import { useIntl } from 'react-intl'; +import { useMutation } from 'react-query'; +import { useDispatch, useSelector } from 'react-redux'; -import { Stages } from './components/Stages'; -import { reducer, initialState } from './reducer'; -import { REDUX_NAMESPACE, DRAG_DROP_TYPES } from './constants'; -import { useInjectReducer } from '../../../../../../admin/src/hooks/useInjectReducer'; -import { useReviewWorkflows } from './hooks/useReviewWorkflows'; -import { setWorkflows } from './actions'; -import { getWorkflowValidationSchema } from './utils/getWorkflowValidationSchema'; -import adminPermissions from '../../../../../../admin/src/permissions'; -import { StageDragPreview } from './components/StageDragPreview'; import { DragLayer } from '../../../../../../admin/src/components/DragLayer'; +import { useInjectReducer } from '../../../../../../admin/src/hooks/useInjectReducer'; +import adminPermissions from '../../../../../../admin/src/permissions'; + +import { setWorkflows } from './actions'; +import { StageDragPreview } from './components/StageDragPreview'; +import { Stages } from './components/Stages'; +import { DRAG_DROP_TYPES, REDUX_NAMESPACE } from './constants'; +import { useReviewWorkflows } from './hooks/useReviewWorkflows'; +import { initialState, reducer } from './reducer'; +import { getWorkflowValidationSchema } from './utils/getWorkflowValidationSchema'; function renderDragLayerItem({ type, item }) { switch (type) { diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/actions/index.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/actions/index.js index 59d294d830..20353a4e81 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/actions/index.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/actions/index.js @@ -1,7 +1,7 @@ import { - ACTION_SET_WORKFLOWS, - ACTION_DELETE_STAGE, ACTION_ADD_STAGE, + ACTION_DELETE_STAGE, + ACTION_SET_WORKFLOWS, ACTION_UPDATE_STAGE, ACTION_UPDATE_STAGE_POSITION, } from '../constants'; diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/actions/tests/index.test.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/actions/tests/index.test.js index 0edaf00262..51d48b3d11 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/actions/tests/index.test.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/actions/tests/index.test.js @@ -1,9 +1,8 @@ -import { setWorkflows, deleteStage, updateStage, addStage } from '..'; - +import { addStage, deleteStage, setWorkflows, updateStage } from '..'; import { - ACTION_SET_WORKFLOWS, - ACTION_DELETE_STAGE, ACTION_ADD_STAGE, + ACTION_DELETE_STAGE, + ACTION_SET_WORKFLOWS, ACTION_UPDATE_STAGE, } from '../../constants'; diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/AddStage/AddStage.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/AddStage/AddStage.js index 84f4883009..ad15f81d71 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/AddStage/AddStage.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/AddStage/AddStage.js @@ -1,9 +1,9 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import styled from 'styled-components'; import { Box, Flex, Typography } from '@strapi/design-system'; import { PlusCircle } from '@strapi/icons'; +import PropTypes from 'prop-types'; +import styled from 'styled-components'; const StyledAddIcon = styled(PlusCircle)` > circle { diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/AddStage/tests/AddStage.test.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/AddStage/tests/AddStage.test.js index 98d08af1cd..5dd2e423e2 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/AddStage/tests/AddStage.test.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/AddStage/tests/AddStage.test.js @@ -1,7 +1,7 @@ import React from 'react'; -import { render } from '@testing-library/react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { render } from '@testing-library/react'; import { AddStage } from '../AddStage'; diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/StageDragPreview/StageDragPreview.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/StageDragPreview/StageDragPreview.js index 18c08f1fd4..257cef10ee 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/StageDragPreview/StageDragPreview.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/StageDragPreview/StageDragPreview.js @@ -1,9 +1,10 @@ import * as React from 'react'; + +import { Flex, Typography } from '@strapi/design-system'; +import { pxToRem } from '@strapi/helper-plugin'; +import { CarretDown } from '@strapi/icons'; import PropTypes from 'prop-types'; import styled from 'styled-components'; -import { Flex, Typography } from '@strapi/design-system'; -import { CarretDown } from '@strapi/icons'; -import { pxToRem } from '@strapi/helper-plugin'; const Toggle = styled(Flex)` svg path { diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/Stages/Stage/Stage.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/Stages/Stage/Stage.js index 99cbabae96..9558770e6d 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/Stages/Stage/Stage.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/Stages/Stage/Stage.js @@ -1,31 +1,32 @@ import * as React from 'react'; -import PropTypes from 'prop-types'; -import { useField } from 'formik'; -import { useIntl } from 'react-intl'; -import { useDispatch } from 'react-redux'; + import { Accordion, - AccordionToggle, AccordionContent, + AccordionToggle, Box, Flex, Grid, GridItem, IconButton, - TextInput, - VisuallyHidden, SingleSelect, SingleSelectOption, + TextInput, + VisuallyHidden, } from '@strapi/design-system'; import { useTracking } from '@strapi/helper-plugin'; import { Drag, Trash } from '@strapi/icons'; +import { useField } from 'formik'; +import PropTypes from 'prop-types'; import { getEmptyImage } from 'react-dnd-html5-backend'; +import { useIntl } from 'react-intl'; +import { useDispatch } from 'react-redux'; -import { deleteStage, updateStagePosition, updateStage } from '../../../actions'; -import { getAvailableStageColors, getStageColorByHex } from '../../../utils/colors'; import { useDragAndDrop } from '../../../../../../../../../admin/src/content-manager/hooks'; import { composeRefs } from '../../../../../../../../../admin/src/content-manager/utils'; +import { deleteStage, updateStage, updateStagePosition } from '../../../actions'; import { DRAG_DROP_TYPES } from '../../../constants'; +import { getAvailableStageColors, getStageColorByHex } from '../../../utils/colors'; const AVAILABLE_COLORS = getAvailableStageColors(); diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/Stages/Stage/tests/Stage.test.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/Stages/Stage/tests/Stage.test.js index 34858d61eb..b2f2e578fe 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/Stages/Stage/tests/Stage.test.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/Stages/Stage/tests/Stage.test.js @@ -1,19 +1,18 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { IntlProvider } from 'react-intl'; import { FormikProvider, useFormik } from 'formik'; -import { Provider } from 'react-redux'; import { DndProvider } from 'react-dnd'; import { HTML5Backend } from 'react-dnd-html5-backend'; - -import { ThemeProvider, lightTheme } from '@strapi/design-system'; +import { IntlProvider } from 'react-intl'; +import { Provider } from 'react-redux'; import configureStore from '../../../../../../../../../../admin/src/core/store/configureStore'; -import { Stage } from '../Stage'; -import { reducer } from '../../../../reducer'; - import { STAGE_COLOR_DEFAULT } from '../../../../constants'; +import { reducer } from '../../../../reducer'; +import { Stage } from '../Stage'; const STAGES_FIXTURE = { id: 1, diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/Stages/Stages.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/Stages/Stages.js index 3bb55d8459..da7cfffb02 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/Stages/Stages.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/Stages/Stages.js @@ -1,13 +1,15 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import styled from 'styled-components'; -import { useIntl } from 'react-intl'; -import { useDispatch } from 'react-redux'; + import { Box, Flex } from '@strapi/design-system'; import { useTracking } from '@strapi/helper-plugin'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import { useDispatch } from 'react-redux'; +import styled from 'styled-components'; import { addStage } from '../../actions'; import { AddStage } from '../AddStage'; + import { Stage } from './Stage'; const StagesContainer = styled(Box)` diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/Stages/tests/Stages.test.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/Stages/tests/Stages.test.js index 5efca68741..ec3c9b688c 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/Stages/tests/Stages.test.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/Stages/tests/Stages.test.js @@ -1,19 +1,19 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { fireEvent, render } from '@testing-library/react'; -import { IntlProvider } from 'react-intl'; -import { Provider } from 'react-redux'; -import { FormikProvider, useFormik } from 'formik'; import userEvent from '@testing-library/user-event'; +import { FormikProvider, useFormik } from 'formik'; import { DndProvider } from 'react-dnd'; import { HTML5Backend } from 'react-dnd-html5-backend'; - -import { ThemeProvider, lightTheme } from '@strapi/design-system'; +import { IntlProvider } from 'react-intl'; +import { Provider } from 'react-redux'; import configureStore from '../../../../../../../../../admin/src/core/store/configureStore'; -import { Stages } from '../Stages'; -import { reducer } from '../../../reducer'; -import { ACTION_SET_WORKFLOWS, STAGE_COLOR_DEFAULT } from '../../../constants'; import * as actions from '../../../actions'; +import { ACTION_SET_WORKFLOWS, STAGE_COLOR_DEFAULT } from '../../../constants'; +import { reducer } from '../../../reducer'; +import { Stages } from '../Stages'; // without mocking actions as ESM it is impossible to spy on named exports jest.mock('../../../actions', () => ({ diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/hooks/tests/useReviewWorkflows.test.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/hooks/tests/useReviewWorkflows.test.js index b2e2cc01c7..530f2b381d 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/hooks/tests/useReviewWorkflows.test.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/hooks/tests/useReviewWorkflows.test.js @@ -1,9 +1,10 @@ import React from 'react'; -import { QueryClientProvider, QueryClient } from 'react-query'; + import { renderHook, waitFor } from '@testing-library/react'; -import { IntlProvider } from 'react-intl'; -import { setupServer } from 'msw/node'; import { rest } from 'msw'; +import { setupServer } from 'msw/node'; +import { IntlProvider } from 'react-intl'; +import { QueryClient, QueryClientProvider } from 'react-query'; import { useReviewWorkflows } from '../useReviewWorkflows'; diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/hooks/useReviewWorkflows.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/hooks/useReviewWorkflows.js index 1ed17aa141..9d186bdc55 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/hooks/useReviewWorkflows.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/hooks/useReviewWorkflows.js @@ -1,6 +1,6 @@ -import { useQuery } from 'react-query'; import { useFetchClient } from '@strapi/helper-plugin'; import { stringify } from 'qs'; +import { useQuery } from 'react-query'; export function useReviewWorkflows(params = {}) { const { id = '', ...queryParams } = params; diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/reducer/index.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/reducer/index.js index 7a9d6db2bc..ae24cb0145 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/reducer/index.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/reducer/index.js @@ -2,9 +2,9 @@ import { current, produce } from 'immer'; import isEqual from 'lodash/isEqual'; import { - ACTION_SET_WORKFLOWS, - ACTION_DELETE_STAGE, ACTION_ADD_STAGE, + ACTION_DELETE_STAGE, + ACTION_SET_WORKFLOWS, ACTION_UPDATE_STAGE, ACTION_UPDATE_STAGE_POSITION, STAGE_COLOR_DEFAULT, diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/reducer/tests/index.test.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/reducer/tests/index.test.js index 083708ea9a..450b317154 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/reducer/tests/index.test.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/reducer/tests/index.test.js @@ -1,9 +1,8 @@ import { initialState, reducer } from '..'; - import { - ACTION_SET_WORKFLOWS, - ACTION_DELETE_STAGE, ACTION_ADD_STAGE, + ACTION_DELETE_STAGE, + ACTION_SET_WORKFLOWS, ACTION_UPDATE_STAGE, ACTION_UPDATE_STAGE_POSITION, } from '../../constants'; diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/tests/ReviewWorkflows.test.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/tests/ReviewWorkflows.test.js index 4d4d406152..57efcb109c 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/tests/ReviewWorkflows.test.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/tests/ReviewWorkflows.test.js @@ -1,18 +1,19 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { useNotification } from '@strapi/helper-plugin'; import { fireEvent, render, waitFor } from '@testing-library/react'; -import { IntlProvider } from 'react-intl'; -import { Provider } from 'react-redux'; -import { QueryClientProvider, QueryClient } from 'react-query'; import userEvent from '@testing-library/user-event'; import { rest } from 'msw'; import { setupServer } from 'msw/node'; -import { useNotification } from '@strapi/helper-plugin'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; import { DndProvider } from 'react-dnd'; import { HTML5Backend } from 'react-dnd-html5-backend'; +import { IntlProvider } from 'react-intl'; +import { QueryClient, QueryClientProvider } from 'react-query'; +import { Provider } from 'react-redux'; -import configureStore from '../../../../../../../admin/src/core/store/configureStore'; import ReviewWorkflowsPage from '..'; +import configureStore from '../../../../../../../admin/src/core/store/configureStore'; import { reducer } from '../reducer'; const notificationMock = jest.fn(); diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/SingleSignOn/index.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/SingleSignOn/index.js index 79d5d20dbb..0c4fb5ad53 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/SingleSignOn/index.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/SingleSignOn/index.js @@ -1,33 +1,36 @@ import React, { useEffect } from 'react'; + import { - CheckPagePermissions, - SettingsPageTitle, - useRBAC, - LoadingIndicatorPage, - useFocusWhenNavigate, -} from '@strapi/helper-plugin'; -import { Check } from '@strapi/icons'; -import { - ContentLayout, - HeaderLayout, - Layout, Button, - Main, - Typography, - ToggleInput, - Select, - Option, + ContentLayout, + Flex, Grid, GridItem, - Flex, + HeaderLayout, + Layout, + Main, MultiSelect, MultiSelectOption, + Option, + Select, + ToggleInput, + Typography, } from '@strapi/design-system'; -import { useIntl } from 'react-intl'; +import { + CheckPagePermissions, + LoadingIndicatorPage, + SettingsPageTitle, + useFocusWhenNavigate, + useRBAC, +} from '@strapi/helper-plugin'; +import { Check } from '@strapi/icons'; import isEqual from 'lodash/isEqual'; -import { getRequestUrl } from '../../../../../../admin/src/utils'; +import { useIntl } from 'react-intl'; + import { useRolesList, useSettingsForm } from '../../../../../../admin/src/hooks'; import adminPermissions from '../../../../../../admin/src/permissions'; +import { getRequestUrl } from '../../../../../../admin/src/utils'; + import schema from './utils/schema'; const ssoPermissions = { diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/SingleSignOn/tests/index.test.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/SingleSignOn/tests/index.test.js index 94b31c2b43..22b52ea2ff 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/SingleSignOn/tests/index.test.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/SingleSignOn/tests/index.test.js @@ -1,12 +1,14 @@ import React from 'react'; -import { getByLabelText, render, screen, waitFor, fireEvent } from '@testing-library/react'; -import { IntlProvider } from 'react-intl'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { useRBAC } from '@strapi/helper-plugin'; -import server from './server'; +import { fireEvent, getByLabelText, render, screen, waitFor } from '@testing-library/react'; +import { IntlProvider } from 'react-intl'; + import { SingleSignOn } from '../index'; +import server from './server'; + jest.mock('@strapi/helper-plugin', () => ({ ...jest.requireActual('@strapi/helper-plugin'), useNotification: jest.fn().mockImplementation(() => jest.fn()), diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/SingleSignOn/tests/server.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/SingleSignOn/tests/server.js index 63241f11ec..db1d5c366e 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/SingleSignOn/tests/server.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/SingleSignOn/tests/server.js @@ -1,5 +1,5 @@ -import { setupServer } from 'msw/node'; import { rest } from 'msw'; +import { setupServer } from 'msw/node'; const handlers = [ rest.get('*/providers/options', (req, res, ctx) => { diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/Users/ListPage/CreateAction/index.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/Users/ListPage/CreateAction/index.js index 59ad790f9e..0ab9df51d5 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/Users/ListPage/CreateAction/index.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/Users/ListPage/CreateAction/index.js @@ -1,9 +1,11 @@ import React from 'react'; -import { useIntl } from 'react-intl'; -import PropTypes from 'prop-types'; -import { Flex, Button, Tooltip, Icon } from '@strapi/design-system'; + +import { Button, Flex, Icon, Tooltip } from '@strapi/design-system'; import { Envelop, ExclamationMarkCircle } from '@strapi/icons'; import isNil from 'lodash/isNil'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; + import { useLicenseLimits } from '../../../../../../hooks'; const CreateAction = ({ onClick }) => { diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/Users/components/MagicLink/index.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/Users/components/MagicLink/index.js index 51723368aa..7450915c6a 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/Users/components/MagicLink/index.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/Users/components/MagicLink/index.js @@ -1,6 +1,8 @@ import React from 'react'; -import { useIntl } from 'react-intl'; + import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; + import basename from '../../../../../../../../admin/src/core/utils/basename'; import MagicLinkWrapper from '../../../../../../../../admin/src/pages/SettingsPage/pages/Users/components/MagicLink/MagicLinkWrapper'; diff --git a/packages/core/content-type-builder/admin/src/components/AllowedTypesSelect/index.js b/packages/core/content-type-builder/admin/src/components/AllowedTypesSelect/index.js index b647d2decf..0b183be031 100644 --- a/packages/core/content-type-builder/admin/src/components/AllowedTypesSelect/index.js +++ b/packages/core/content-type-builder/admin/src/components/AllowedTypesSelect/index.js @@ -1,8 +1,9 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import { useIntl } from 'react-intl'; + import { MultiSelectNested } from '@strapi/design-system'; import upperFirst from 'lodash/upperFirst'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; const options = [ { diff --git a/packages/core/content-type-builder/admin/src/components/AttributeIcon/index.js b/packages/core/content-type-builder/admin/src/components/AttributeIcon/index.js index dc4fc27f04..a0bd9747d8 100644 --- a/packages/core/content-type-builder/admin/src/components/AttributeIcon/index.js +++ b/packages/core/content-type-builder/admin/src/components/AttributeIcon/index.js @@ -1,26 +1,27 @@ import React from 'react'; -import styled from 'styled-components'; -import PropTypes from 'prop-types'; + import { Box } from '@strapi/design-system'; +import { pxToRem, useCustomFields } from '@strapi/helper-plugin'; import { - Component, - CollectionType, - Date, Boolean, + CollectionType, + Component, + Date, DynamicZone, Email, Enumeration, Json, - RichText, Media, + Number, Password, Relation, + RichText, SingleType, Text, Uid, - Number, } from '@strapi/icons'; -import { pxToRem, useCustomFields } from '@strapi/helper-plugin'; +import PropTypes from 'prop-types'; +import styled from 'styled-components'; const iconByTypes = { biginteger: Number, diff --git a/packages/core/content-type-builder/admin/src/components/AttributeOptions/AttributeList/index.js b/packages/core/content-type-builder/admin/src/components/AttributeOptions/AttributeList/index.js index 1f14ec9d6c..02e70e6259 100644 --- a/packages/core/content-type-builder/admin/src/components/AttributeOptions/AttributeList/index.js +++ b/packages/core/content-type-builder/admin/src/components/AttributeOptions/AttributeList/index.js @@ -1,6 +1,8 @@ import React from 'react'; + +import { Box, Flex, Grid, GridItem, KeyboardNavigable } from '@strapi/design-system'; import PropTypes from 'prop-types'; -import { Box, Grid, GridItem, KeyboardNavigable, Flex } from '@strapi/design-system'; + import AttributeOption from '../AttributeOption'; import getPadding from '../utils/getPadding'; diff --git a/packages/core/content-type-builder/admin/src/components/AttributeOptions/AttributeOption/index.js b/packages/core/content-type-builder/admin/src/components/AttributeOptions/AttributeOption/index.js index 710e4cd055..997d4c55b4 100644 --- a/packages/core/content-type-builder/admin/src/components/AttributeOptions/AttributeOption/index.js +++ b/packages/core/content-type-builder/admin/src/components/AttributeOptions/AttributeOption/index.js @@ -5,9 +5,11 @@ */ import React from 'react'; + +import { Box, Flex, Typography } from '@strapi/design-system'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { Box, Flex, Typography } from '@strapi/design-system'; + import useFormModalNavigation from '../../../hooks/useFormModalNavigation'; import getTrad from '../../../utils/getTrad'; import AttributeIcon from '../../AttributeIcon'; diff --git a/packages/core/content-type-builder/admin/src/components/AttributeOptions/CustomFieldOption/index.js b/packages/core/content-type-builder/admin/src/components/AttributeOptions/CustomFieldOption/index.js index 8ec76d90ae..20b6e535d8 100644 --- a/packages/core/content-type-builder/admin/src/components/AttributeOptions/CustomFieldOption/index.js +++ b/packages/core/content-type-builder/admin/src/components/AttributeOptions/CustomFieldOption/index.js @@ -5,12 +5,14 @@ */ import React from 'react'; + +import { Box, Flex, Typography } from '@strapi/design-system'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { Box, Flex, Typography } from '@strapi/design-system'; -import OptionBoxWrapper from '../OptionBoxWrapper'; -import AttributeIcon from '../../AttributeIcon'; + import useFormModalNavigation from '../../../hooks/useFormModalNavigation'; +import AttributeIcon from '../../AttributeIcon'; +import OptionBoxWrapper from '../OptionBoxWrapper'; const CustomFieldOption = ({ customFieldUid, customField }) => { const { type, intlLabel, intlDescription } = customField; diff --git a/packages/core/content-type-builder/admin/src/components/AttributeOptions/CustomFieldsList/index.js b/packages/core/content-type-builder/admin/src/components/AttributeOptions/CustomFieldsList/index.js index 624359081e..c28af76bac 100644 --- a/packages/core/content-type-builder/admin/src/components/AttributeOptions/CustomFieldsList/index.js +++ b/packages/core/content-type-builder/admin/src/components/AttributeOptions/CustomFieldsList/index.js @@ -1,11 +1,13 @@ import React from 'react'; + +import { Box, Flex, Grid, GridItem, KeyboardNavigable, Link } from '@strapi/design-system'; import { useCustomFields } from '@strapi/helper-plugin'; -import { Box, Grid, GridItem, KeyboardNavigable, Flex, Link } from '@strapi/design-system'; import { useIntl } from 'react-intl'; -import EmptyAttributes from '../EmptyAttributes'; -import CustomFieldOption from '../CustomFieldOption'; -import getPadding from '../utils/getPadding'; + import { getTrad } from '../../../utils'; +import CustomFieldOption from '../CustomFieldOption'; +import EmptyAttributes from '../EmptyAttributes'; +import getPadding from '../utils/getPadding'; const CustomFieldsList = () => { const { formatMessage } = useIntl(); diff --git a/packages/core/content-type-builder/admin/src/components/AttributeOptions/EmptyAttributes/index.js b/packages/core/content-type-builder/admin/src/components/AttributeOptions/EmptyAttributes/index.js index d07ba8c617..ce0318372c 100644 --- a/packages/core/content-type-builder/admin/src/components/AttributeOptions/EmptyAttributes/index.js +++ b/packages/core/content-type-builder/admin/src/components/AttributeOptions/EmptyAttributes/index.js @@ -1,9 +1,11 @@ import React from 'react'; -import styled from 'styled-components'; -import { useIntl } from 'react-intl'; + +import { Box, Flex, Icon, LinkButton, Typography } from '@strapi/design-system'; +import { EmptyDocuments, Plus } from '@strapi/icons'; import qs from 'qs'; -import { Box, Flex, Typography, LinkButton, Icon } from '@strapi/design-system'; -import { Plus, EmptyDocuments } from '@strapi/icons'; +import { useIntl } from 'react-intl'; +import styled from 'styled-components'; + import { getTrad } from '../../../utils'; const EmptyCard = styled(Box)` diff --git a/packages/core/content-type-builder/admin/src/components/AttributeOptions/OptionBoxWrapper/index.js b/packages/core/content-type-builder/admin/src/components/AttributeOptions/OptionBoxWrapper/index.js index db17bac88b..b8fdafb1df 100644 --- a/packages/core/content-type-builder/admin/src/components/AttributeOptions/OptionBoxWrapper/index.js +++ b/packages/core/content-type-builder/admin/src/components/AttributeOptions/OptionBoxWrapper/index.js @@ -1,5 +1,5 @@ -import styled from 'styled-components'; import { Box } from '@strapi/design-system'; +import styled from 'styled-components'; const BoxWrapper = styled(Box)` width: 100%; diff --git a/packages/core/content-type-builder/admin/src/components/AttributeOptions/index.js b/packages/core/content-type-builder/admin/src/components/AttributeOptions/index.js index d3774f91f8..ab33774994 100644 --- a/packages/core/content-type-builder/admin/src/components/AttributeOptions/index.js +++ b/packages/core/content-type-builder/admin/src/components/AttributeOptions/index.js @@ -5,21 +5,24 @@ */ import React from 'react'; -import { useIntl } from 'react-intl'; -import PropTypes from 'prop-types'; + import { Box, Divider, - ModalBody, Flex, - Typography, - Tabs, + ModalBody, Tab, TabGroup, - TabPanels, TabPanel, + TabPanels, + Tabs, + Typography, } from '@strapi/design-system'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; + import { getTrad } from '../../utils'; + import AttributeList from './AttributeList'; import CustomFieldsList from './CustomFieldsList'; diff --git a/packages/core/content-type-builder/admin/src/components/AttributeOptions/tests/index.test.js b/packages/core/content-type-builder/admin/src/components/AttributeOptions/tests/index.test.js index 181cca5591..dcab8ed0d5 100644 --- a/packages/core/content-type-builder/admin/src/components/AttributeOptions/tests/index.test.js +++ b/packages/core/content-type-builder/admin/src/components/AttributeOptions/tests/index.test.js @@ -1,9 +1,11 @@ import React from 'react'; -import { Router } from 'react-router-dom'; -import { createMemoryHistory } from 'history'; -import { render, screen, fireEvent } from '@testing-library/react'; + import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { fireEvent, render, screen } from '@testing-library/react'; +import { createMemoryHistory } from 'history'; import { IntlProvider } from 'react-intl'; +import { Router } from 'react-router-dom'; + import FormModalNavigationProvider from '../../FormModalNavigationProvider'; import AttributeOptions from '../index'; diff --git a/packages/core/content-type-builder/admin/src/components/BooleanDefaultValueSelect/index.js b/packages/core/content-type-builder/admin/src/components/BooleanDefaultValueSelect/index.js index bf53dd5dfd..5c86668695 100644 --- a/packages/core/content-type-builder/admin/src/components/BooleanDefaultValueSelect/index.js +++ b/packages/core/content-type-builder/admin/src/components/BooleanDefaultValueSelect/index.js @@ -5,9 +5,10 @@ */ import React from 'react'; + +import { Option, Select } from '@strapi/design-system'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { Select, Option } from '@strapi/design-system'; const BooleanDefaultValueSelect = ({ intlLabel, name, options, onChange, value }) => { const { formatMessage } = useIntl(); diff --git a/packages/core/content-type-builder/admin/src/components/BooleanRadioGroup/index.js b/packages/core/content-type-builder/admin/src/components/BooleanRadioGroup/index.js index 5ebc5386c2..1364f9b16e 100644 --- a/packages/core/content-type-builder/admin/src/components/BooleanRadioGroup/index.js +++ b/packages/core/content-type-builder/admin/src/components/BooleanRadioGroup/index.js @@ -1,5 +1,7 @@ import React from 'react'; + import PropTypes from 'prop-types'; + import CustomRadioGroup from '../CustomRadioGroup'; const BooleanRadioGroup = ({ onChange, name, ...rest }) => { diff --git a/packages/core/content-type-builder/admin/src/components/CheckboxWithNumberField/index.js b/packages/core/content-type-builder/admin/src/components/CheckboxWithNumberField/index.js index 82a792cb6d..dd7c6f9dc7 100644 --- a/packages/core/content-type-builder/admin/src/components/CheckboxWithNumberField/index.js +++ b/packages/core/content-type-builder/admin/src/components/CheckboxWithNumberField/index.js @@ -5,9 +5,10 @@ */ import React, { useState } from 'react'; -import { useIntl } from 'react-intl'; -import PropTypes from 'prop-types'; + import { Box, Checkbox, Flex, NumberInput, TextInput } from '@strapi/design-system'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; const CheckboxWithNumberField = ({ error, intlLabel, modifiedData, name, onChange, value }) => { const { formatMessage } = useIntl(); diff --git a/packages/core/content-type-builder/admin/src/components/ComponentCard/ComponentIcon/ComponentIcon.js b/packages/core/content-type-builder/admin/src/components/ComponentCard/ComponentIcon/ComponentIcon.js index 8d8b389af9..6c5a9e4bfa 100644 --- a/packages/core/content-type-builder/admin/src/components/ComponentCard/ComponentIcon/ComponentIcon.js +++ b/packages/core/content-type-builder/admin/src/components/ComponentCard/ComponentIcon/ComponentIcon.js @@ -1,7 +1,8 @@ -import PropTypes from 'prop-types'; import React from 'react'; import { Flex, Icon } from '@strapi/design-system'; +import PropTypes from 'prop-types'; + import { COMPONENT_ICONS } from '../../IconPicker/constants'; export function ComponentIcon({ isActive, icon }) { diff --git a/packages/core/content-type-builder/admin/src/components/ComponentCard/index.js b/packages/core/content-type-builder/admin/src/components/ComponentCard/index.js index 3f83bcad12..738edaeb92 100644 --- a/packages/core/content-type-builder/admin/src/components/ComponentCard/index.js +++ b/packages/core/content-type-builder/admin/src/components/ComponentCard/index.js @@ -5,17 +5,18 @@ */ import React from 'react'; -import get from 'lodash/get'; -import PropTypes from 'prop-types'; + import { Box, Flex, Typography } from '@strapi/design-system'; import { pxToRem } from '@strapi/helper-plugin'; import { Cross } from '@strapi/icons'; +import get from 'lodash/get'; +import PropTypes from 'prop-types'; import styled from 'styled-components'; -import { ComponentIcon } from './ComponentIcon'; - import useDataManager from '../../hooks/useDataManager'; +import { ComponentIcon } from './ComponentIcon'; + const CloseButton = styled(Box)` position: absolute; display: none; diff --git a/packages/core/content-type-builder/admin/src/components/ComponentList/index.js b/packages/core/content-type-builder/admin/src/components/ComponentList/index.js index 586e397887..fcf93b75a4 100644 --- a/packages/core/content-type-builder/admin/src/components/ComponentList/index.js +++ b/packages/core/content-type-builder/admin/src/components/ComponentList/index.js @@ -5,10 +5,12 @@ */ /* eslint-disable import/no-cycle */ import React from 'react'; + import get from 'lodash/get'; import PropTypes from 'prop-types'; -import List from '../List'; + import useDataManager from '../../hooks/useDataManager'; +import List from '../List'; import Tr from '../Tr'; function ComponentList({ diff --git a/packages/core/content-type-builder/admin/src/components/ContentTypeBuilderNav/index.js b/packages/core/content-type-builder/admin/src/components/ContentTypeBuilderNav/index.js index 9e5384aa37..3fbf4fdedd 100644 --- a/packages/core/content-type-builder/admin/src/components/ContentTypeBuilderNav/index.js +++ b/packages/core/content-type-builder/admin/src/components/ContentTypeBuilderNav/index.js @@ -1,8 +1,5 @@ import React from 'react'; -import upperFirst from 'lodash/upperFirst'; -import { useIntl } from 'react-intl'; -import { NavLink } from 'react-router-dom'; -import { Plus } from '@strapi/icons'; + import { Box, Icon, TextButton } from '@strapi/design-system'; import { SubNav, @@ -13,9 +10,14 @@ import { SubNavSections, } from '@strapi/design-system/v2'; import { pxToRem } from '@strapi/helper-plugin'; +import { Plus } from '@strapi/icons'; +import upperFirst from 'lodash/upperFirst'; +import { useIntl } from 'react-intl'; +import { NavLink } from 'react-router-dom'; + +import getTrad from '../../utils/getTrad'; import useContentTypeBuilderMenu from './useContentTypeBuilderMenu'; -import getTrad from '../../utils/getTrad'; const ContentTypeBuilderNav = () => { const { menu, searchValue, onSearchChange } = useContentTypeBuilderMenu(); diff --git a/packages/core/content-type-builder/admin/src/components/ContentTypeBuilderNav/tests/index.test.js b/packages/core/content-type-builder/admin/src/components/ContentTypeBuilderNav/tests/index.test.js index c983699cb6..21c0242cb2 100644 --- a/packages/core/content-type-builder/admin/src/components/ContentTypeBuilderNav/tests/index.test.js +++ b/packages/core/content-type-builder/admin/src/components/ContentTypeBuilderNav/tests/index.test.js @@ -4,13 +4,16 @@ * */ +import React from 'react'; + import { Layout, lightTheme, ThemeProvider } from '@strapi/design-system'; -import { IntlProvider } from 'react-intl'; import { render } from '@testing-library/react'; import { createMemoryHistory } from 'history'; -import React from 'react'; +import { IntlProvider } from 'react-intl'; import { Router } from 'react-router-dom'; + import ContentTypeBuilderNav from '../index'; + import mockData from './mockData'; jest.mock('../useContentTypeBuilderMenu.js', () => { diff --git a/packages/core/content-type-builder/admin/src/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.js b/packages/core/content-type-builder/admin/src/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.js index 34e50edffb..4f338a397f 100644 --- a/packages/core/content-type-builder/admin/src/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.js +++ b/packages/core/content-type-builder/admin/src/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.js @@ -1,11 +1,11 @@ import { useState } from 'react'; -import { useNotification, useTracking, useFilter, useCollator } from '@strapi/helper-plugin'; + +import { useCollator, useFilter, useNotification, useTracking } from '@strapi/helper-plugin'; import isEqual from 'lodash/isEqual'; import { useIntl } from 'react-intl'; import useDataManager from '../../hooks/useDataManager'; import useFormModalNavigation from '../../hooks/useFormModalNavigation'; - import pluginId from '../../pluginId'; import getTrad from '../../utils/getTrad'; diff --git a/packages/core/content-type-builder/admin/src/components/ContentTypeRadioGroup/index.js b/packages/core/content-type-builder/admin/src/components/ContentTypeRadioGroup/index.js index a05e8ddc0d..aa82baa94c 100644 --- a/packages/core/content-type-builder/admin/src/components/ContentTypeRadioGroup/index.js +++ b/packages/core/content-type-builder/admin/src/components/ContentTypeRadioGroup/index.js @@ -1,6 +1,8 @@ import React from 'react'; -import PropTypes from 'prop-types'; + import { useNotification } from '@strapi/helper-plugin'; +import PropTypes from 'prop-types'; + import { getTrad } from '../../utils'; import CustomRadioGroup from '../CustomRadioGroup'; diff --git a/packages/core/content-type-builder/admin/src/components/CustomRadioGroup/components.js b/packages/core/content-type-builder/admin/src/components/CustomRadioGroup/components.js index 30cb232e99..cf5e1c8852 100644 --- a/packages/core/content-type-builder/admin/src/components/CustomRadioGroup/components.js +++ b/packages/core/content-type-builder/admin/src/components/CustomRadioGroup/components.js @@ -1,5 +1,5 @@ +import { Flex, inputFocusStyle, Typography } from '@strapi/design-system'; import styled from 'styled-components'; -import { Flex, Typography, inputFocusStyle } from '@strapi/design-system'; const Wrapper = styled(Flex)` position: relative; diff --git a/packages/core/content-type-builder/admin/src/components/CustomRadioGroup/index.js b/packages/core/content-type-builder/admin/src/components/CustomRadioGroup/index.js index 5b6ecda640..4448e59cce 100644 --- a/packages/core/content-type-builder/admin/src/components/CustomRadioGroup/index.js +++ b/packages/core/content-type-builder/admin/src/components/CustomRadioGroup/index.js @@ -1,7 +1,9 @@ import React from 'react'; + +import { Box, Flex, Typography } from '@strapi/design-system'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { Typography, Box, Flex } from '@strapi/design-system'; + import { Wrapper } from './components'; const CustomRadioGroup = ({ intlLabel, name, onChange, radios, value }) => { diff --git a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/index.js b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/index.js index 46ca2bce3a..83c12d569e 100644 --- a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/index.js +++ b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/index.js @@ -1,60 +1,62 @@ import React, { memo, useEffect, useMemo, useRef } from 'react'; -import PropTypes from 'prop-types'; + +import { + LoadingIndicatorPage, + useAppInfo, + useAutoReloadOverlayBlocker, + useFetchClient, + useGuidedTour, + useNotification, + useRBACProvider, + useStrapiApp, + useTracking, +} from '@strapi/helper-plugin'; import get from 'lodash/get'; import groupBy from 'lodash/groupBy'; import set from 'lodash/set'; import size from 'lodash/size'; -import { - LoadingIndicatorPage, - useTracking, - useNotification, - useStrapiApp, - useAutoReloadOverlayBlocker, - useAppInfo, - useRBACProvider, - useGuidedTour, - useFetchClient, -} from '@strapi/helper-plugin'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { useLocation, useRouteMatch, Redirect } from 'react-router-dom'; import { connect, useDispatch } from 'react-redux'; +import { Redirect, useLocation, useRouteMatch } from 'react-router-dom'; import { compose } from 'redux'; + import DataManagerContext from '../../contexts/DataManagerContext'; import useFormModalNavigation from '../../hooks/useFormModalNavigation'; +import pluginId from '../../pluginId'; import getTrad from '../../utils/getTrad'; import makeUnique from '../../utils/makeUnique'; -import pluginId from '../../pluginId'; import FormModal from '../FormModal'; -import createDataObject from './utils/createDataObject'; -import createModifiedDataSchema from './utils/createModifiedDataSchema'; -import retrieveSpecificInfoFromComponents from './utils/retrieveSpecificInfoFromComponents'; -import retrieveComponentsFromSchema from './utils/retrieveComponentsFromSchema'; -import retrieveNestedComponents from './utils/retrieveNestedComponents'; -import { retrieveComponentsThatHaveComponents } from './utils/retrieveComponentsThatHaveComponents'; -import { getComponentsToPost, formatMainDataType, sortContentType } from './utils/cleanData'; -import serverRestartWatcher from './utils/serverRestartWatcher'; -import validateSchema from './utils/validateSchema'; import { ADD_ATTRIBUTE, - ADD_CUSTOM_FIELD_ATTRIBUTE, ADD_CREATED_COMPONENT_TO_DYNAMIC_ZONE, + ADD_CUSTOM_FIELD_ATTRIBUTE, CHANGE_DYNAMIC_ZONE_COMPONENTS, - CREATE_SCHEMA, CREATE_COMPONENT_SCHEMA, + CREATE_SCHEMA, DELETE_NOT_SAVED_TYPE, EDIT_ATTRIBUTE, EDIT_CUSTOM_FIELD_ATTRIBUTE, GET_DATA_SUCCEEDED, RELOAD_PLUGIN, - REMOVE_FIELD_FROM_DISPLAYED_COMPONENT, REMOVE_COMPONENT_FROM_DYNAMIC_ZONE, REMOVE_FIELD, + REMOVE_FIELD_FROM_DISPLAYED_COMPONENT, SET_MODIFIED_DATA, UPDATE_SCHEMA, } from './constants'; import makeSelectDataManagerProvider from './selectors'; +import { formatMainDataType, getComponentsToPost, sortContentType } from './utils/cleanData'; +import createDataObject from './utils/createDataObject'; +import createModifiedDataSchema from './utils/createModifiedDataSchema'; import formatSchemas from './utils/formatSchemas'; +import retrieveComponentsFromSchema from './utils/retrieveComponentsFromSchema'; +import { retrieveComponentsThatHaveComponents } from './utils/retrieveComponentsThatHaveComponents'; +import retrieveNestedComponents from './utils/retrieveNestedComponents'; +import retrieveSpecificInfoFromComponents from './utils/retrieveSpecificInfoFromComponents'; +import serverRestartWatcher from './utils/serverRestartWatcher'; +import validateSchema from './utils/validateSchema'; const DataManagerProvider = ({ children, diff --git a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/reducer.js b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/reducer.js index a16c2fd627..5e5a5e88bc 100644 --- a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/reducer.js +++ b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/reducer.js @@ -1,10 +1,12 @@ import produce, { current } from 'immer'; import get from 'lodash/get'; import set from 'lodash/set'; -import makeUnique from '../../utils/makeUnique'; + import getRelationType from '../../utils/getRelationType'; -import retrieveComponentsFromSchema from './utils/retrieveComponentsFromSchema'; +import makeUnique from '../../utils/makeUnique'; + import * as actions from './constants'; +import retrieveComponentsFromSchema from './utils/retrieveComponentsFromSchema'; const initialState = { components: {}, diff --git a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/selectors.js b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/selectors.js index fe2c51005a..dcc5f10b24 100644 --- a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/selectors.js +++ b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/selectors.js @@ -1,5 +1,7 @@ import { createSelector } from 'reselect'; + import pluginId from '../../pluginId'; + import { initialState } from './reducer'; /** diff --git a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/tests/reducer_add_attribute_action.test.js b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/tests/reducer_add_attribute_action.test.js index d20aaba7c5..83a760bd1a 100644 --- a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/tests/reducer_add_attribute_action.test.js +++ b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/tests/reducer_add_attribute_action.test.js @@ -1,5 +1,5 @@ -import reducer, { initialState } from '../reducer'; import { ADD_ATTRIBUTE } from '../constants'; +import reducer, { initialState } from '../reducer'; describe('CTB | components | DataManagerProvider | reducer | ADD_ATTRIBUTE', () => { describe('Adding a common field that is not a relation', () => { diff --git a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/tests/reducer_add_custom_field_attribute_action.test.js b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/tests/reducer_add_custom_field_attribute_action.test.js index 8df41618d0..7d30bd886f 100644 --- a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/tests/reducer_add_custom_field_attribute_action.test.js +++ b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/tests/reducer_add_custom_field_attribute_action.test.js @@ -1,6 +1,7 @@ import cloneDeep from 'lodash/cloneDeep'; -import reducer, { initialState } from '../reducer'; + import { ADD_CUSTOM_FIELD_ATTRIBUTE } from '../constants'; +import reducer, { initialState } from '../reducer'; describe('CTB | components | DataManagerProvider | reducer | ADD_CUSTOM_FIELD_ATTRIBUTE', () => { it('adds a custom field to a contentType', () => { diff --git a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/tests/reducer_basic_actions.test.js b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/tests/reducer_basic_actions.test.js index e24269e5d1..1235a7f0ac 100644 --- a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/tests/reducer_basic_actions.test.js +++ b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/tests/reducer_basic_actions.test.js @@ -1,7 +1,9 @@ import get from 'lodash/get'; -import reducer, { initialState } from '../reducer'; -import testData from './data'; + import * as actions from '../constants'; +import reducer, { initialState } from '../reducer'; + +import testData from './data'; describe('CTB | components | DataManagerProvider | reducer | basics actions ', () => { it('Should return the initial state', () => { diff --git a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/tests/reducer_edit_attribute_action.test.js b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/tests/reducer_edit_attribute_action.test.js index b0564f1013..cad1463bfe 100644 --- a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/tests/reducer_edit_attribute_action.test.js +++ b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/tests/reducer_edit_attribute_action.test.js @@ -1,5 +1,5 @@ -import reducer, { initialState } from '../reducer'; import { EDIT_ATTRIBUTE } from '../constants'; +import reducer, { initialState } from '../reducer'; describe('CTB | components | DataManagerProvider | reducer | EDIT_ATTRIBUTE', () => { describe('Editing a common attribute (string, integer, json, media, ...)', () => { diff --git a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/tests/reducer_edit_custom_field_attribute_action.test.js b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/tests/reducer_edit_custom_field_attribute_action.test.js index f7a39ca2c3..5444669530 100644 --- a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/tests/reducer_edit_custom_field_attribute_action.test.js +++ b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/tests/reducer_edit_custom_field_attribute_action.test.js @@ -1,6 +1,7 @@ import cloneDeep from 'lodash/cloneDeep'; -import reducer, { initialState } from '../reducer'; + import { EDIT_CUSTOM_FIELD_ATTRIBUTE } from '../constants'; +import reducer, { initialState } from '../reducer'; describe('CTB | components | DataManagerProvider | reducer | EDIT_CUSTOM_FIELD_ATTRIBUTE', () => { it('edits a custom field attribute on a content type', () => { diff --git a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/tests/reducer_remove_field_action.test.js b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/tests/reducer_remove_field_action.test.js index afe9664412..80a48f34e3 100644 --- a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/tests/reducer_remove_field_action.test.js +++ b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/tests/reducer_remove_field_action.test.js @@ -1,6 +1,7 @@ -import reducer, { initialState } from '../reducer'; -import testData from './data'; import { REMOVE_FIELD } from '../constants'; +import reducer, { initialState } from '../reducer'; + +import testData from './data'; describe('CTB | components | DataManagerProvider | reducer | REMOVE_FIELD', () => { describe('Removing a field that is not a relation', () => { diff --git a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/cleanData.js b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/cleanData.js index 5e31863aa9..f5480d0d66 100644 --- a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/cleanData.js +++ b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/cleanData.js @@ -1,8 +1,8 @@ +import camelCase from 'lodash/camelCase'; import get from 'lodash/get'; import isEqual from 'lodash/isEqual'; import omit from 'lodash/omit'; import sortBy from 'lodash/sortBy'; -import camelCase from 'lodash/camelCase'; import pluginId from '../../../pluginId'; import makeUnique from '../../../utils/makeUnique'; @@ -155,8 +155,8 @@ const sortContentType = (types) => export { formatComponent, + formatMainDataType, getComponentsToPost, getCreatedAndModifiedComponents, - formatMainDataType, sortContentType, }; diff --git a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/retrieveComponentsFromSchema.js b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/retrieveComponentsFromSchema.js index bb5ffab657..4cac93cfa0 100644 --- a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/retrieveComponentsFromSchema.js +++ b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/retrieveComponentsFromSchema.js @@ -1,4 +1,5 @@ import get from 'lodash/get'; + import makeUnique from '../../../utils/makeUnique'; const retrieveComponentsFromSchema = (attributes, allComponentsData) => { diff --git a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/retrieveComponentsThatHaveComponents.js b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/retrieveComponentsThatHaveComponents.js index 2cf8f2b599..97f3be7861 100644 --- a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/retrieveComponentsThatHaveComponents.js +++ b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/retrieveComponentsThatHaveComponents.js @@ -1,4 +1,5 @@ import get from 'lodash/get'; + import makeUnique from '../../../utils/makeUnique'; const retrieveComponentsThatHaveComponents = (allComponents) => { diff --git a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/retrieveSpecificInfoFromComponents.js b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/retrieveSpecificInfoFromComponents.js index e5185ea2eb..a0ba3935ca 100644 --- a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/retrieveSpecificInfoFromComponents.js +++ b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/retrieveSpecificInfoFromComponents.js @@ -1,4 +1,5 @@ import get from 'lodash/get'; + import makeUnique from '../../../utils/makeUnique'; const retrieveSpecificInfoFromComponents = (allComponents, keysToRetrieve) => { diff --git a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/tests/cleanData.test.js b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/tests/cleanData.test.js index dbb3ba63c5..e1d3d2f241 100644 --- a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/tests/cleanData.test.js +++ b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/tests/cleanData.test.js @@ -5,8 +5,9 @@ import { getCreatedAndModifiedComponents, sortContentType, } from '../cleanData'; -import rawData from './rawData'; + import expectedData from './expectedFormattedData'; +import rawData from './rawData'; describe('CleanData utils', () => { describe('FormatComponent', () => { diff --git a/packages/core/content-type-builder/admin/src/components/DraftAndPublishToggle/index.js b/packages/core/content-type-builder/admin/src/components/DraftAndPublishToggle/index.js index 2badda3293..71a1550b8b 100644 --- a/packages/core/content-type-builder/admin/src/components/DraftAndPublishToggle/index.js +++ b/packages/core/content-type-builder/admin/src/components/DraftAndPublishToggle/index.js @@ -5,10 +5,12 @@ */ import React, { useState } from 'react'; -import PropTypes from 'prop-types'; -import { useIntl } from 'react-intl'; + import { Checkbox } from '@strapi/design-system'; import { ConfirmDialog } from '@strapi/helper-plugin'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; + import { getTrad } from '../../utils'; const DraftAndPublishToggle = ({ diff --git a/packages/core/content-type-builder/admin/src/components/DynamicZoneList/index.js b/packages/core/content-type-builder/admin/src/components/DynamicZoneList/index.js index 541569e6b7..74091e0ee9 100644 --- a/packages/core/content-type-builder/admin/src/components/DynamicZoneList/index.js +++ b/packages/core/content-type-builder/admin/src/components/DynamicZoneList/index.js @@ -6,12 +6,14 @@ /* eslint-disable import/no-cycle */ import React, { useState } from 'react'; -import PropTypes from 'prop-types'; + +import { Box, Flex, Typography } from '@strapi/design-system'; import { pxToRem } from '@strapi/helper-plugin'; import { Plus } from '@strapi/icons'; -import { Box, Flex, Typography } from '@strapi/design-system'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; import styled from 'styled-components'; + import useDataManager from '../../hooks/useDataManager'; import getTrad from '../../utils/getTrad'; import ComponentCard from '../ComponentCard'; diff --git a/packages/core/content-type-builder/admin/src/components/FormModal/attributes/advancedForm.js b/packages/core/content-type-builder/admin/src/components/FormModal/attributes/advancedForm.js index beb3a10fd0..e27b832949 100644 --- a/packages/core/content-type-builder/admin/src/components/FormModal/attributes/advancedForm.js +++ b/packages/core/content-type-builder/admin/src/components/FormModal/attributes/advancedForm.js @@ -3,6 +3,7 @@ // import isEmpty from 'lodash/isEmpty'; import getTrad from '../../../utils/getTrad'; import { componentForm } from '../component'; + import options from './attributeOptions'; const advancedForm = { diff --git a/packages/core/content-type-builder/admin/src/components/FormModal/attributes/baseForm.js b/packages/core/content-type-builder/admin/src/components/FormModal/attributes/baseForm.js index 7e32398928..f34ba0e34b 100644 --- a/packages/core/content-type-builder/admin/src/components/FormModal/attributes/baseForm.js +++ b/packages/core/content-type-builder/admin/src/components/FormModal/attributes/baseForm.js @@ -2,6 +2,7 @@ // import { FormattedMessage } from 'react-intl'; import getTrad from '../../../utils/getTrad'; import { componentField, componentForm } from '../component'; + import { nameField } from './nameField'; const baseForm = { diff --git a/packages/core/content-type-builder/admin/src/components/FormModal/attributes/index.js b/packages/core/content-type-builder/admin/src/components/FormModal/attributes/index.js index 96d8bae11f..171a832176 100644 --- a/packages/core/content-type-builder/admin/src/components/FormModal/attributes/index.js +++ b/packages/core/content-type-builder/admin/src/components/FormModal/attributes/index.js @@ -1,4 +1,4 @@ // eslint-disable-next-line import/prefer-default-export -export { default as attributesForm } from './form'; export { default as commonBaseForm } from './commonBaseForm'; +export { default as attributesForm } from './form'; export { default as attributeTypes } from './types'; diff --git a/packages/core/content-type-builder/admin/src/components/FormModal/attributes/types.js b/packages/core/content-type-builder/admin/src/components/FormModal/attributes/types.js index f02cb07b76..9094359ed7 100644 --- a/packages/core/content-type-builder/admin/src/components/FormModal/attributes/types.js +++ b/packages/core/content-type-builder/admin/src/components/FormModal/attributes/types.js @@ -1,16 +1,18 @@ +import { translatedErrors as errorsTrads } from '@strapi/helper-plugin'; import uniq from 'lodash/uniq'; import * as yup from 'yup'; -import { translatedErrors as errorsTrads } from '@strapi/helper-plugin'; -import getTrad from '../../../utils/getTrad'; + import getRelationType from '../../../utils/getRelationType'; +import getTrad from '../../../utils/getTrad'; import toRegressedEnumValue from '../../../utils/toRegressedEnumValue'; + import { alreadyUsedAttributeNames, createTextShape, isMinSuperiorThanMax, isNameAllowed, - validators, NAME_REGEX, + validators, } from './validation/common'; const types = { diff --git a/packages/core/content-type-builder/admin/src/components/FormModal/attributes/validation/common.js b/packages/core/content-type-builder/admin/src/components/FormModal/attributes/validation/common.js index d71fc1b0a9..8b647db479 100644 --- a/packages/core/content-type-builder/admin/src/components/FormModal/attributes/validation/common.js +++ b/packages/core/content-type-builder/admin/src/components/FormModal/attributes/validation/common.js @@ -1,6 +1,6 @@ -import * as yup from 'yup'; -import toNumber from 'lodash/toNumber'; import { translatedErrors as errorsTrads } from '@strapi/helper-plugin'; +import toNumber from 'lodash/toNumber'; +import * as yup from 'yup'; import getTrad from '../../../../utils/getTrad'; @@ -140,6 +140,6 @@ export { getUsedContentTypeAttributeNames, isMinSuperiorThanMax, isNameAllowed, - validators, NAME_REGEX, + validators, }; diff --git a/packages/core/content-type-builder/admin/src/components/FormModal/category/createCategorySchema.js b/packages/core/content-type-builder/admin/src/components/FormModal/category/createCategorySchema.js index 7c081f3369..f016e04571 100644 --- a/packages/core/content-type-builder/admin/src/components/FormModal/category/createCategorySchema.js +++ b/packages/core/content-type-builder/admin/src/components/FormModal/category/createCategorySchema.js @@ -1,5 +1,5 @@ -import * as yup from 'yup'; import { translatedErrors as errorsTrads } from '@strapi/helper-plugin'; +import * as yup from 'yup'; import CATEGORY_NAME_REGEX from './regex'; diff --git a/packages/core/content-type-builder/admin/src/components/FormModal/category/index.js b/packages/core/content-type-builder/admin/src/components/FormModal/category/index.js index 59260d60f9..e10078131b 100644 --- a/packages/core/content-type-builder/admin/src/components/FormModal/category/index.js +++ b/packages/core/content-type-builder/admin/src/components/FormModal/category/index.js @@ -1,3 +1,3 @@ -export { default as categoryForm } from './form'; export { default as createCategorySchema } from './createCategorySchema'; +export { default as categoryForm } from './form'; export { default as CATEGORY_NAME_REGEX } from './regex'; diff --git a/packages/core/content-type-builder/admin/src/components/FormModal/component/createComponentSchema.js b/packages/core/content-type-builder/admin/src/components/FormModal/component/createComponentSchema.js index 3a6b6f14e9..38be82a4c1 100644 --- a/packages/core/content-type-builder/admin/src/components/FormModal/component/createComponentSchema.js +++ b/packages/core/content-type-builder/admin/src/components/FormModal/component/createComponentSchema.js @@ -1,9 +1,9 @@ -import * as yup from 'yup'; import { translatedErrors as errorsTrads } from '@strapi/helper-plugin'; +import * as yup from 'yup'; import getTrad from '../../../utils/getTrad'; -import { createComponentUid } from '../utils/createUid'; import { CATEGORY_NAME_REGEX } from '../category'; +import { createComponentUid } from '../utils/createUid'; const createComponentSchema = (usedComponentNames, reservedNames, category) => { const shape = { diff --git a/packages/core/content-type-builder/admin/src/components/FormModal/component/index.js b/packages/core/content-type-builder/admin/src/components/FormModal/component/index.js index af3142a565..8a0043ccdf 100644 --- a/packages/core/content-type-builder/admin/src/components/FormModal/component/index.js +++ b/packages/core/content-type-builder/admin/src/components/FormModal/component/index.js @@ -1,4 +1,4 @@ // eslint-disable-next-line import/prefer-default-export -export { default as createComponentSchema } from './createComponentSchema'; export { default as componentField } from './componentField'; +export { default as createComponentSchema } from './createComponentSchema'; export { default as componentForm } from './form'; diff --git a/packages/core/content-type-builder/admin/src/components/FormModal/contentType/createContentTypeSchema.js b/packages/core/content-type-builder/admin/src/components/FormModal/contentType/createContentTypeSchema.js index 96a445414c..fb76dc0ce4 100644 --- a/packages/core/content-type-builder/admin/src/components/FormModal/contentType/createContentTypeSchema.js +++ b/packages/core/content-type-builder/admin/src/components/FormModal/contentType/createContentTypeSchema.js @@ -1,5 +1,5 @@ -import * as yup from 'yup'; import { translatedErrors as errorsTrads } from '@strapi/helper-plugin'; +import * as yup from 'yup'; import getTrad from '../../../utils/getTrad'; import { createUid } from '../utils/createUid'; diff --git a/packages/core/content-type-builder/admin/src/components/FormModal/contentType/index.js b/packages/core/content-type-builder/admin/src/components/FormModal/contentType/index.js index 89caa271e5..6635fd2b91 100644 --- a/packages/core/content-type-builder/admin/src/components/FormModal/contentType/index.js +++ b/packages/core/content-type-builder/admin/src/components/FormModal/contentType/index.js @@ -1,2 +1,2 @@ -export { default as contentTypeForm } from './form'; export { default as createContentTypeSchema } from './createContentTypeSchema'; +export { default as contentTypeForm } from './form'; diff --git a/packages/core/content-type-builder/admin/src/components/FormModal/forms/index.js b/packages/core/content-type-builder/admin/src/components/FormModal/forms/index.js index dafeaea375..42daa91940 100644 --- a/packages/core/content-type-builder/admin/src/components/FormModal/forms/index.js +++ b/packages/core/content-type-builder/admin/src/components/FormModal/forms/index.js @@ -1,12 +1,13 @@ +import getTrad from '../../../utils/getTrad'; import { attributesForm, attributeTypes, commonBaseForm } from '../attributes'; -import { categoryForm, createCategorySchema } from '../category'; -import { contentTypeForm, createContentTypeSchema } from '../contentType'; -import { createComponentSchema, componentForm } from '../component'; -import { dynamiczoneForm } from '../dynamicZone'; import { nameField } from '../attributes/nameField'; +import { categoryForm, createCategorySchema } from '../category'; +import { componentForm, createComponentSchema } from '../component'; +import { contentTypeForm, createContentTypeSchema } from '../contentType'; +import { dynamiczoneForm } from '../dynamicZone'; + import addItemsToFormSection from './utils/addItemsToFormSection'; import getUsedAttributeNames from './utils/getUsedAttributeNames'; -import getTrad from '../../../utils/getTrad'; const forms = { customField: { diff --git a/packages/core/content-type-builder/admin/src/components/FormModal/forms/tests/customField.test.js b/packages/core/content-type-builder/admin/src/components/FormModal/forms/tests/customField.test.js index 6c1d542716..b0b5e99a3b 100644 --- a/packages/core/content-type-builder/admin/src/components/FormModal/forms/tests/customField.test.js +++ b/packages/core/content-type-builder/admin/src/components/FormModal/forms/tests/customField.test.js @@ -1,4 +1,5 @@ import * as yup from 'yup'; + import forms from '..'; import ctbFormsAPI from '../../../../utils/formAPI'; diff --git a/packages/core/content-type-builder/admin/src/components/FormModal/index.js b/packages/core/content-type-builder/admin/src/components/FormModal/index.js index 11a86f78e5..306bfc7cdf 100644 --- a/packages/core/content-type-builder/admin/src/components/FormModal/index.js +++ b/packages/core/content-type-builder/admin/src/components/FormModal/index.js @@ -1,53 +1,56 @@ import React, { useCallback, useEffect, useMemo, useRef } from 'react'; -import { - getYupInnerErrors, - useTracking, - useNotification, - useStrapiApp, - useCustomFields, -} from '@strapi/helper-plugin'; -import { useIntl } from 'react-intl'; -import { useHistory } from 'react-router-dom'; -import get from 'lodash/get'; -import has from 'lodash/has'; -import set from 'lodash/set'; -import toLower from 'lodash/toLower'; -import { useSelector, useDispatch, shallowEqual } from 'react-redux'; + import { Box, Button, Divider, - ModalLayout, + Flex, ModalBody, ModalFooter, - Tabs, + ModalLayout, Tab, TabGroup, - TabPanels, TabPanel, - Flex, + TabPanels, + Tabs, } from '@strapi/design-system'; +import { + getYupInnerErrors, + useCustomFields, + useNotification, + useStrapiApp, + useTracking, +} from '@strapi/helper-plugin'; +import get from 'lodash/get'; +import has from 'lodash/has'; import isEqual from 'lodash/isEqual'; -import pluginId from '../../pluginId'; +import set from 'lodash/set'; +import toLower from 'lodash/toLower'; +import { useIntl } from 'react-intl'; +import { shallowEqual, useDispatch, useSelector } from 'react-redux'; +import { useHistory } from 'react-router-dom'; + import useDataManager from '../../hooks/useDataManager'; import useFormModalNavigation from '../../hooks/useFormModalNavigation'; +import pluginId from '../../pluginId'; +import { getTrad, isAllowedContentTypesForRelations } from '../../utils'; +import findAttribute from '../../utils/findAttribute'; // New compos import AllowedTypesSelect from '../AllowedTypesSelect'; import AttributeOptions from '../AttributeOptions'; -import DraftAndPublishToggle from '../DraftAndPublishToggle'; -import ReviewWorkflowsToggle from '../ReviewWorkflowsToggle'; -import FormModalHeader from '../FormModalHeader'; -import FormModalEndActions from '../FormModalEndActions'; -import FormModalSubHeader from '../FormModalSubHeader'; - import BooleanDefaultValueSelect from '../BooleanDefaultValueSelect'; import BooleanRadioGroup from '../BooleanRadioGroup'; import CheckboxWithNumberField from '../CheckboxWithNumberField'; -import CustomRadioGroup from '../CustomRadioGroup'; import ContentTypeRadioGroup from '../ContentTypeRadioGroup'; +import CustomRadioGroup from '../CustomRadioGroup'; +import DraftAndPublishToggle from '../DraftAndPublishToggle'; +import FormModalEndActions from '../FormModalEndActions'; +import FormModalHeader from '../FormModalHeader'; +import FormModalSubHeader from '../FormModalSubHeader'; import IconPicker from '../IconPicker'; -import Relation from '../Relation'; import PluralName from '../PluralName'; +import Relation from '../Relation'; +import ReviewWorkflowsToggle from '../ReviewWorkflowsToggle'; import SelectCategory from '../SelectCategory'; import SelectComponent from '../SelectComponent'; import SelectComponents from '../SelectComponents'; @@ -56,25 +59,23 @@ import SelectNumber from '../SelectNumber'; import SingularName from '../SingularName'; import TabForm from '../TabForm'; import TextareaEnum from '../TextareaEnum'; -import findAttribute from '../../utils/findAttribute'; -import { getTrad, isAllowedContentTypesForRelations } from '../../utils'; -import { canEditContentType, getAttributesToDisplay, getFormInputNames } from './utils'; -import forms from './forms'; -import { createComponentUid, createUid } from './utils/createUid'; -import makeSelectFormModal from './selectors'; import { - SET_DATA_TO_EDIT, - SET_DYNAMIC_ZONE_DATA_SCHEMA, + ON_CHANGE, + RESET_PROPS, + RESET_PROPS_AND_SAVE_CURRENT_DATA, + RESET_PROPS_AND_SET_FORM_FOR_ADDING_AN_EXISTING_COMPO, + RESET_PROPS_AND_SET_THE_FORM_FOR_ADDING_A_COMPO_TO_A_DZ, SET_ATTRIBUTE_DATA_SCHEMA, SET_CUSTOM_FIELD_DATA_SCHEMA, + SET_DATA_TO_EDIT, + SET_DYNAMIC_ZONE_DATA_SCHEMA, SET_ERRORS, - ON_CHANGE, - RESET_PROPS_AND_SET_THE_FORM_FOR_ADDING_A_COMPO_TO_A_DZ, - RESET_PROPS_AND_SET_FORM_FOR_ADDING_AN_EXISTING_COMPO, - RESET_PROPS_AND_SAVE_CURRENT_DATA, - RESET_PROPS, } from './constants'; +import forms from './forms'; +import makeSelectFormModal from './selectors'; +import { canEditContentType, getAttributesToDisplay, getFormInputNames } from './utils'; +import { createComponentUid, createUid } from './utils/createUid'; /* eslint-disable indent */ /* eslint-disable react/no-array-index-key */ diff --git a/packages/core/content-type-builder/admin/src/components/FormModal/reducer.js b/packages/core/content-type-builder/admin/src/components/FormModal/reducer.js index c85f4e8898..4ae6578ab7 100644 --- a/packages/core/content-type-builder/admin/src/components/FormModal/reducer.js +++ b/packages/core/content-type-builder/admin/src/components/FormModal/reducer.js @@ -1,14 +1,15 @@ import produce from 'immer'; -import pluralize from 'pluralize'; import set from 'lodash/set'; import snakeCase from 'lodash/snakeCase'; +import pluralize from 'pluralize'; import getRelationType from '../../utils/getRelationType'; import nameToSlug from '../../utils/nameToSlug'; -import { createComponentUid } from './utils/createUid'; -import { shouldPluralizeName, shouldPluralizeTargetAttribute } from './utils/relations'; + import * as actions from './constants'; +import { createComponentUid } from './utils/createUid'; import { customFieldDefaultOptionsReducer } from './utils/customFieldDefaultOptionsReducer'; +import { shouldPluralizeName, shouldPluralizeTargetAttribute } from './utils/relations'; const initialState = { formErrors: {}, diff --git a/packages/core/content-type-builder/admin/src/components/FormModal/selectors.js b/packages/core/content-type-builder/admin/src/components/FormModal/selectors.js index 35eef699fa..6337e80f9e 100644 --- a/packages/core/content-type-builder/admin/src/components/FormModal/selectors.js +++ b/packages/core/content-type-builder/admin/src/components/FormModal/selectors.js @@ -1,5 +1,7 @@ import { createSelector } from 'reselect'; + import pluginId from '../../pluginId'; + import { initialState } from './reducer'; /** diff --git a/packages/core/content-type-builder/admin/src/components/FormModal/tests/reducer.set-custom-field-data-schema.test.js b/packages/core/content-type-builder/admin/src/components/FormModal/tests/reducer.set-custom-field-data-schema.test.js index aad09a3bd7..629503dd79 100644 --- a/packages/core/content-type-builder/admin/src/components/FormModal/tests/reducer.set-custom-field-data-schema.test.js +++ b/packages/core/content-type-builder/admin/src/components/FormModal/tests/reducer.set-custom-field-data-schema.test.js @@ -1,5 +1,5 @@ -import reducer, { initialState } from '../reducer'; import * as actions from '../constants'; +import reducer, { initialState } from '../reducer'; const mockCustomField = { type: 'string', diff --git a/packages/core/content-type-builder/admin/src/components/FormModal/tests/reducer.test.js b/packages/core/content-type-builder/admin/src/components/FormModal/tests/reducer.test.js index 69e894bbf4..e2a285ebce 100644 --- a/packages/core/content-type-builder/admin/src/components/FormModal/tests/reducer.test.js +++ b/packages/core/content-type-builder/admin/src/components/FormModal/tests/reducer.test.js @@ -1,5 +1,5 @@ -import reducer, { initialState } from '../reducer'; import * as actions from '../constants'; +import reducer, { initialState } from '../reducer'; describe('CTB | components | FormModal | reducer | actions', () => { describe(actions.ON_CHANGE, () => { diff --git a/packages/core/content-type-builder/admin/src/components/FormModal/utils/canEditContentType.js b/packages/core/content-type-builder/admin/src/components/FormModal/utils/canEditContentType.js index f6dd3d552e..153a9438b5 100644 --- a/packages/core/content-type-builder/admin/src/components/FormModal/utils/canEditContentType.js +++ b/packages/core/content-type-builder/admin/src/components/FormModal/utils/canEditContentType.js @@ -1,4 +1,5 @@ import get from 'lodash/get'; + import getRelationType from '../../../utils/getRelationType'; const canEditContentType = (data, modifiedData) => { diff --git a/packages/core/content-type-builder/admin/src/components/FormModal/utils/tests/canEditContentType.test.js b/packages/core/content-type-builder/admin/src/components/FormModal/utils/tests/canEditContentType.test.js index 4ca0cbc7de..6d37745b0f 100644 --- a/packages/core/content-type-builder/admin/src/components/FormModal/utils/tests/canEditContentType.test.js +++ b/packages/core/content-type-builder/admin/src/components/FormModal/utils/tests/canEditContentType.test.js @@ -1,4 +1,5 @@ import canEditContentType from '../canEditContentType'; + import rawData from './rawData'; describe('canEditContentType', () => { diff --git a/packages/core/content-type-builder/admin/src/components/FormModalEndActions/index.js b/packages/core/content-type-builder/admin/src/components/FormModalEndActions/index.js index 92c72d4a87..eb2c6603d5 100644 --- a/packages/core/content-type-builder/admin/src/components/FormModalEndActions/index.js +++ b/packages/core/content-type-builder/admin/src/components/FormModalEndActions/index.js @@ -5,10 +5,12 @@ */ import React from 'react'; -import { useIntl } from 'react-intl'; -import PropTypes from 'prop-types'; + import { Button } from '@strapi/design-system'; import { Plus } from '@strapi/icons'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; + import { getTrad } from '../../utils'; const FormModalEndActions = ({ diff --git a/packages/core/content-type-builder/admin/src/components/FormModalHeader/index.js b/packages/core/content-type-builder/admin/src/components/FormModalHeader/index.js index b0444859da..ea3ec6f489 100644 --- a/packages/core/content-type-builder/admin/src/components/FormModalHeader/index.js +++ b/packages/core/content-type-builder/admin/src/components/FormModalHeader/index.js @@ -5,11 +5,13 @@ */ import React from 'react'; + +import { Box, Flex, ModalHeader, Typography } from '@strapi/design-system'; +import { Breadcrumbs, Crumb } from '@strapi/design-system/v2'; +import upperFirst from 'lodash/upperFirst'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import upperFirst from 'lodash/upperFirst'; -import { ModalHeader, Box, Flex, Typography } from '@strapi/design-system'; -import { Breadcrumbs, Crumb } from '@strapi/design-system/v2'; + import useDataManager from '../../hooks/useDataManager'; import getTrad from '../../utils/getTrad'; import AttributeIcon from '../AttributeIcon'; diff --git a/packages/core/content-type-builder/admin/src/components/FormModalNavigationProvider/index.js b/packages/core/content-type-builder/admin/src/components/FormModalNavigationProvider/index.js index a02b018a44..f89e47d7ef 100644 --- a/packages/core/content-type-builder/admin/src/components/FormModalNavigationProvider/index.js +++ b/packages/core/content-type-builder/admin/src/components/FormModalNavigationProvider/index.js @@ -1,7 +1,10 @@ import React, { useState } from 'react'; -import PropTypes from 'prop-types'; + import { useTracking } from '@strapi/helper-plugin'; +import PropTypes from 'prop-types'; + import FormModalNavigationContext from '../../contexts/FormModalNavigationContext'; + import { INITIAL_STATE_DATA } from './constants'; const FormModalNavigationProvider = ({ children }) => { diff --git a/packages/core/content-type-builder/admin/src/components/FormModalNavigationProvider/tests/index.test.js b/packages/core/content-type-builder/admin/src/components/FormModalNavigationProvider/tests/index.test.js index b79ade450d..261b5687b3 100644 --- a/packages/core/content-type-builder/admin/src/components/FormModalNavigationProvider/tests/index.test.js +++ b/packages/core/content-type-builder/admin/src/components/FormModalNavigationProvider/tests/index.test.js @@ -1,7 +1,8 @@ -import { renderHook, act } from '@testing-library/react'; +import { act, renderHook } from '@testing-library/react'; + +import useFormModalNavigation from '../../../hooks/useFormModalNavigation'; import { INITIAL_STATE_DATA } from '../constants'; import FormModalNavigationProvider from '../index'; -import useFormModalNavigation from '../../../hooks/useFormModalNavigation'; const removeFunctionsFromObject = (state) => { const stringified = JSON.stringify(state); diff --git a/packages/core/content-type-builder/admin/src/components/FormModalSubHeader/index.js b/packages/core/content-type-builder/admin/src/components/FormModalSubHeader/index.js index 7753b4956d..4295f45fb6 100644 --- a/packages/core/content-type-builder/admin/src/components/FormModalSubHeader/index.js +++ b/packages/core/content-type-builder/admin/src/components/FormModalSubHeader/index.js @@ -1,8 +1,9 @@ import React from 'react'; + +import { Flex, Typography } from '@strapi/design-system'; +import upperFirst from 'lodash/upperFirst'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import upperFirst from 'lodash/upperFirst'; -import { Flex, Typography } from '@strapi/design-system'; import { getTrad } from '../../utils'; diff --git a/packages/core/content-type-builder/admin/src/components/IconPicker/index.js b/packages/core/content-type-builder/admin/src/components/IconPicker/index.js index ee0dda8d52..adafada8c1 100644 --- a/packages/core/content-type-builder/admin/src/components/IconPicker/index.js +++ b/packages/core/content-type-builder/admin/src/components/IconPicker/index.js @@ -1,24 +1,26 @@ -import React, { useState, useRef, useEffect } from 'react'; +import React, { useEffect, useRef, useState } from 'react'; + import { Box, + Field, + FieldInput, + FieldLabel, Flex, Icon, - Typography, - Searchbar, IconButton, inputFocusStyle, - VisuallyHidden, - Field, - FieldLabel, - FieldInput, + Searchbar, Tooltip, + Typography, + VisuallyHidden, } from '@strapi/design-system'; -import { Trash, Search } from '@strapi/icons'; +import { Search, Trash } from '@strapi/icons'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; import styled from 'styled-components'; -import PropTypes from 'prop-types'; import { getTrad } from '../../utils'; + import { COMPONENT_ICONS } from './constants'; const IconPickerWrapper = styled(Flex)` diff --git a/packages/core/content-type-builder/admin/src/components/IconPicker/tests/index.test.js b/packages/core/content-type-builder/admin/src/components/IconPicker/tests/index.test.js index 4d86884a23..71f91510f8 100644 --- a/packages/core/content-type-builder/admin/src/components/IconPicker/tests/index.test.js +++ b/packages/core/content-type-builder/admin/src/components/IconPicker/tests/index.test.js @@ -1,9 +1,11 @@ import React from 'react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import { IntlProvider } from 'react-intl'; -import { render, fireEvent } from '@testing-library/react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { fireEvent, render } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; +import { IntlProvider } from 'react-intl'; import { MemoryRouter } from 'react-router-dom'; + import IconPicker from '../index'; const defaultProps = { diff --git a/packages/core/content-type-builder/admin/src/components/List/index.js b/packages/core/content-type-builder/admin/src/components/List/index.js index 3156b64ea7..dbc16cae59 100644 --- a/packages/core/content-type-builder/admin/src/components/List/index.js +++ b/packages/core/content-type-builder/admin/src/components/List/index.js @@ -6,19 +6,22 @@ /* eslint-disable import/no-cycle */ import React from 'react'; -import PropTypes from 'prop-types'; + +import { Box, Button, Table, TFooter, Th, Thead, Tr, Typography } from '@strapi/design-system'; import { EmptyBodyTable, useTracking } from '@strapi/helper-plugin'; -import { Box, Button, Typography, Table, Thead, Tr, Th, TFooter } from '@strapi/design-system'; import { Plus } from '@strapi/icons'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import useFormModalNavigation from '../../hooks/useFormModalNavigation'; + import useDataManager from '../../hooks/useDataManager'; -import DynamicZoneList from '../DynamicZoneList'; -import ComponentList from '../ComponentList'; -import BoxWrapper from './BoxWrapper'; +import useFormModalNavigation from '../../hooks/useFormModalNavigation'; import getTrad from '../../utils/getTrad'; +import ComponentList from '../ComponentList'; +import DynamicZoneList from '../DynamicZoneList'; import NestedTFooter from '../NestedTFooter'; +import BoxWrapper from './BoxWrapper'; + /* eslint-disable jsx-a11y/click-events-have-key-events */ /* eslint-disable jsx-a11y/no-static-element-interactions */ diff --git a/packages/core/content-type-builder/admin/src/components/ListRow/BoxWrapper.js b/packages/core/content-type-builder/admin/src/components/ListRow/BoxWrapper.js index 356fec98c8..6f98eb0578 100644 --- a/packages/core/content-type-builder/admin/src/components/ListRow/BoxWrapper.js +++ b/packages/core/content-type-builder/admin/src/components/ListRow/BoxWrapper.js @@ -4,8 +4,8 @@ * */ -import styled from 'styled-components'; import { Box } from '@strapi/design-system'; +import styled from 'styled-components'; const BoxWrapper = styled(Box)` position: relative; diff --git a/packages/core/content-type-builder/admin/src/components/ListRow/DisplayedType.js b/packages/core/content-type-builder/admin/src/components/ListRow/DisplayedType.js index 4dcde9428c..675c801ee0 100644 --- a/packages/core/content-type-builder/admin/src/components/ListRow/DisplayedType.js +++ b/packages/core/content-type-builder/admin/src/components/ListRow/DisplayedType.js @@ -1,7 +1,9 @@ import React from 'react'; + +import { Typography } from '@strapi/design-system'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { Typography } from '@strapi/design-system'; + import getTrad from '../../utils/getTrad'; const DisplayedType = ({ type, customField, repeatable }) => { diff --git a/packages/core/content-type-builder/admin/src/components/ListRow/index.js b/packages/core/content-type-builder/admin/src/components/ListRow/index.js index 00a63422d9..99050b64fa 100644 --- a/packages/core/content-type-builder/admin/src/components/ListRow/index.js +++ b/packages/core/content-type-builder/admin/src/components/ListRow/index.js @@ -1,16 +1,19 @@ import React, { memo } from 'react'; -import PropTypes from 'prop-types'; -import get from 'lodash/get'; -import { useIntl } from 'react-intl'; -import { IconButton, Flex, Typography, Box } from '@strapi/design-system'; + +import { Box, Flex, IconButton, Typography } from '@strapi/design-system'; +import { onRowClick, pxToRem, stopPropagation } from '@strapi/helper-plugin'; import { Lock, Pencil, Trash } from '@strapi/icons'; -import { stopPropagation, onRowClick, pxToRem } from '@strapi/helper-plugin'; +import get from 'lodash/get'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; + import useDataManager from '../../hooks/useDataManager'; -import getTrad from '../../utils/getTrad'; import Curve from '../../icons/Curve'; -import UpperFist from '../UpperFirst'; -import BoxWrapper from './BoxWrapper'; +import getTrad from '../../utils/getTrad'; import AttributeIcon from '../AttributeIcon'; +import UpperFist from '../UpperFirst'; + +import BoxWrapper from './BoxWrapper'; import DisplayedType from './DisplayedType'; function ListRow({ diff --git a/packages/core/content-type-builder/admin/src/components/NestedTFooter/index.js b/packages/core/content-type-builder/admin/src/components/NestedTFooter/index.js index 02cb19fa0e..888551c55c 100644 --- a/packages/core/content-type-builder/admin/src/components/NestedTFooter/index.js +++ b/packages/core/content-type-builder/admin/src/components/NestedTFooter/index.js @@ -1,6 +1,7 @@ import React from 'react'; + +import { Box, Flex, Typography } from '@strapi/design-system'; import PropTypes from 'prop-types'; -import { Flex, Box, Typography } from '@strapi/design-system'; import styled from 'styled-components'; const IconBox = styled(Box)` diff --git a/packages/core/content-type-builder/admin/src/components/PluginIcon/index.js b/packages/core/content-type-builder/admin/src/components/PluginIcon/index.js index 8c7f27a277..75e66b0541 100644 --- a/packages/core/content-type-builder/admin/src/components/PluginIcon/index.js +++ b/packages/core/content-type-builder/admin/src/components/PluginIcon/index.js @@ -5,6 +5,7 @@ */ import React from 'react'; + import { Layout } from '@strapi/icons'; const PluginIcon = () => ; diff --git a/packages/core/content-type-builder/admin/src/components/PluralName/index.js b/packages/core/content-type-builder/admin/src/components/PluralName/index.js index 220d861bd1..62b640d980 100644 --- a/packages/core/content-type-builder/admin/src/components/PluralName/index.js +++ b/packages/core/content-type-builder/admin/src/components/PluralName/index.js @@ -5,10 +5,12 @@ */ import React, { useEffect, useRef } from 'react'; + +import { TextInput } from '@strapi/design-system'; +import pluralize from 'pluralize'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import pluralize from 'pluralize'; -import { TextInput } from '@strapi/design-system'; + import nameToSlug from '../../utils/nameToSlug'; const PluralName = ({ description, error, intlLabel, modifiedData, name, onChange, value }) => { diff --git a/packages/core/content-type-builder/admin/src/components/Relation/RelationField/RelationTargetPicker/index.js b/packages/core/content-type-builder/admin/src/components/Relation/RelationField/RelationTargetPicker/index.js index 203211b30a..a670579a24 100644 --- a/packages/core/content-type-builder/admin/src/components/Relation/RelationField/RelationTargetPicker/index.js +++ b/packages/core/content-type-builder/admin/src/components/Relation/RelationField/RelationTargetPicker/index.js @@ -1,11 +1,13 @@ import React from 'react'; + +import { MenuItem, SimpleMenu } from '@strapi/design-system'; +import get from 'lodash/get'; import PropTypes from 'prop-types'; import { useDispatch } from 'react-redux'; -import get from 'lodash/get'; -import { MenuItem, SimpleMenu } from '@strapi/design-system'; + import useDataManager from '../../../../hooks/useDataManager'; -import { ON_CHANGE_RELATION_TARGET } from '../../../FormModal/constants'; import { isAllowedContentTypesForRelations } from '../../../../utils'; +import { ON_CHANGE_RELATION_TARGET } from '../../../FormModal/constants'; const RelationTargetPicker = ({ oneThatIsCreatingARelationWithAnother, target }) => { const { contentTypes, sortedContentTypesList } = useDataManager(); diff --git a/packages/core/content-type-builder/admin/src/components/Relation/RelationField/index.js b/packages/core/content-type-builder/admin/src/components/Relation/RelationField/index.js index 9ae3a17bd3..49ab1e8064 100644 --- a/packages/core/content-type-builder/admin/src/components/Relation/RelationField/index.js +++ b/packages/core/content-type-builder/admin/src/components/Relation/RelationField/index.js @@ -1,8 +1,11 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import { Box, Flex, Divider, Typography } from '@strapi/design-system'; + +import { Box, Divider, Flex, Typography } from '@strapi/design-system'; import { GenericInput } from '@strapi/helper-plugin'; +import PropTypes from 'prop-types'; + import getTrad from '../../../utils/getTrad'; + import RelationTargetPicker from './RelationTargetPicker'; const RelationFormBox = ({ diff --git a/packages/core/content-type-builder/admin/src/components/Relation/RelationNaturePicker/components.js b/packages/core/content-type-builder/admin/src/components/Relation/RelationNaturePicker/components.js index 3775ff9eb5..04f3d8c8f0 100644 --- a/packages/core/content-type-builder/admin/src/components/Relation/RelationNaturePicker/components.js +++ b/packages/core/content-type-builder/admin/src/components/Relation/RelationNaturePicker/components.js @@ -1,5 +1,5 @@ -import styled from 'styled-components'; import { Box, Flex } from '@strapi/design-system'; +import styled from 'styled-components'; const Wrapper = styled(Box)` position: relative; diff --git a/packages/core/content-type-builder/admin/src/components/Relation/RelationNaturePicker/index.js b/packages/core/content-type-builder/admin/src/components/Relation/RelationNaturePicker/index.js index 89d0a69171..0b746c0897 100644 --- a/packages/core/content-type-builder/admin/src/components/Relation/RelationNaturePicker/index.js +++ b/packages/core/content-type-builder/admin/src/components/Relation/RelationNaturePicker/index.js @@ -1,22 +1,25 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import { useIntl } from 'react-intl'; -import { useDispatch } from 'react-redux'; + +import { Flex, KeyboardNavigable, Typography } from '@strapi/design-system'; +import { + ManyToMany, + ManyToOne, + ManyWays as ManyWay, + OneToMany, + OneToOne, + OneWay, +} from '@strapi/icons'; import get from 'lodash/get'; import truncate from 'lodash/truncate'; import pluralize from 'pluralize'; -import { - OneToOne, - OneWay, - ManyWays as ManyWay, - OneToMany, - ManyToOne, - ManyToMany, -} from '@strapi/icons'; -import { Flex, Typography, KeyboardNavigable } from '@strapi/design-system'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import { useDispatch } from 'react-redux'; + import useDataManager from '../../../hooks/useDataManager'; -import { ON_CHANGE_RELATION_TYPE } from '../../FormModal/constants'; import getTrad from '../../../utils/getTrad'; +import { ON_CHANGE_RELATION_TYPE } from '../../FormModal/constants'; + import { IconWrapper, InfosWrapper, Wrapper } from './components'; const relations = { diff --git a/packages/core/content-type-builder/admin/src/components/Relation/index.js b/packages/core/content-type-builder/admin/src/components/Relation/index.js index df2ad300ab..bcc618f409 100644 --- a/packages/core/content-type-builder/admin/src/components/Relation/index.js +++ b/packages/core/content-type-builder/admin/src/components/Relation/index.js @@ -5,9 +5,12 @@ */ import React from 'react'; -import PropTypes from 'prop-types'; + import { Flex } from '@strapi/design-system'; +import PropTypes from 'prop-types'; + import getRelationType from '../../utils/getRelationType'; + import RelationField from './RelationField'; import RelationNaturePicker from './RelationNaturePicker'; diff --git a/packages/core/content-type-builder/admin/src/components/ReviewWorkflowsToggle/index.js b/packages/core/content-type-builder/admin/src/components/ReviewWorkflowsToggle/index.js index e794087187..9e57835be5 100644 --- a/packages/core/content-type-builder/admin/src/components/ReviewWorkflowsToggle/index.js +++ b/packages/core/content-type-builder/admin/src/components/ReviewWorkflowsToggle/index.js @@ -1,8 +1,9 @@ import React, { useState } from 'react'; -import PropTypes from 'prop-types'; -import { useIntl } from 'react-intl'; + import { Checkbox } from '@strapi/design-system'; import { ConfirmDialog, useTracking } from '@strapi/helper-plugin'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; import { getTrad } from '../../utils'; diff --git a/packages/core/content-type-builder/admin/src/components/SelectCategory/index.js b/packages/core/content-type-builder/admin/src/components/SelectCategory/index.js index a1093e9817..662b8a4a8b 100644 --- a/packages/core/content-type-builder/admin/src/components/SelectCategory/index.js +++ b/packages/core/content-type-builder/admin/src/components/SelectCategory/index.js @@ -5,9 +5,11 @@ */ import React, { useState } from 'react'; -import { useIntl } from 'react-intl'; -import PropTypes from 'prop-types'; + import { ComboboxOption, CreatableCombobox } from '@strapi/design-system'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; + import useDataManager from '../../hooks/useDataManager'; const SelectCategory = ({ error, intlLabel, name, onChange, value }) => { diff --git a/packages/core/content-type-builder/admin/src/components/SelectComponent/index.js b/packages/core/content-type-builder/admin/src/components/SelectComponent/index.js index f7824f66ad..b90f090a90 100644 --- a/packages/core/content-type-builder/admin/src/components/SelectComponent/index.js +++ b/packages/core/content-type-builder/admin/src/components/SelectComponent/index.js @@ -5,9 +5,11 @@ */ import React from 'react'; -import { useIntl } from 'react-intl'; + +import { Option, Select } from '@strapi/design-system'; import PropTypes from 'prop-types'; -import { Select, Option } from '@strapi/design-system'; +import { useIntl } from 'react-intl'; + import useDataManager from '../../hooks/useDataManager'; const SelectComponent = ({ diff --git a/packages/core/content-type-builder/admin/src/components/SelectComponents/index.js b/packages/core/content-type-builder/admin/src/components/SelectComponents/index.js index 629a82e976..f6d70cd94d 100644 --- a/packages/core/content-type-builder/admin/src/components/SelectComponents/index.js +++ b/packages/core/content-type-builder/admin/src/components/SelectComponents/index.js @@ -5,12 +5,14 @@ */ import React from 'react'; -import PropTypes from 'prop-types'; + import { MultiSelectNested } from '@strapi/design-system'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; + import useDataManager from '../../hooks/useDataManager'; -import findAttribute from '../../utils/findAttribute'; import { getTrad } from '../../utils'; +import findAttribute from '../../utils/findAttribute'; const SelectComponents = ({ dynamicZoneTarget, intlLabel, name, onChange, value }) => { const { formatMessage } = useIntl(); diff --git a/packages/core/content-type-builder/admin/src/components/SelectDateType/index.js b/packages/core/content-type-builder/admin/src/components/SelectDateType/index.js index 41fbc2c347..7df1cfcd63 100644 --- a/packages/core/content-type-builder/admin/src/components/SelectDateType/index.js +++ b/packages/core/content-type-builder/admin/src/components/SelectDateType/index.js @@ -5,9 +5,10 @@ */ import React from 'react'; + +import { Option, Select } from '@strapi/design-system'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { Select, Option } from '@strapi/design-system'; const SelectDateType = ({ intlLabel, error, modifiedData, name, onChange, options, value }) => { const { formatMessage } = useIntl(); diff --git a/packages/core/content-type-builder/admin/src/components/SelectNumber/index.js b/packages/core/content-type-builder/admin/src/components/SelectNumber/index.js index 62a71e0e72..79c4824735 100644 --- a/packages/core/content-type-builder/admin/src/components/SelectNumber/index.js +++ b/packages/core/content-type-builder/admin/src/components/SelectNumber/index.js @@ -5,9 +5,10 @@ */ import React from 'react'; + +import { Option, Select } from '@strapi/design-system'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { Select, Option } from '@strapi/design-system'; const SelectNumber = ({ intlLabel, error, modifiedData, name, onChange, options, value }) => { const { formatMessage } = useIntl(); diff --git a/packages/core/content-type-builder/admin/src/components/SingularName/index.js b/packages/core/content-type-builder/admin/src/components/SingularName/index.js index ef11a55339..31b6d7f393 100644 --- a/packages/core/content-type-builder/admin/src/components/SingularName/index.js +++ b/packages/core/content-type-builder/admin/src/components/SingularName/index.js @@ -5,9 +5,11 @@ */ import React, { useEffect, useRef } from 'react'; + +import { TextInput } from '@strapi/design-system'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { TextInput } from '@strapi/design-system'; + import nameToSlug from '../../utils/nameToSlug'; const SingularName = ({ description, error, intlLabel, modifiedData, name, onChange, value }) => { diff --git a/packages/core/content-type-builder/admin/src/components/TabForm/index.js b/packages/core/content-type-builder/admin/src/components/TabForm/index.js index ec1dac92c2..cf17f02e59 100644 --- a/packages/core/content-type-builder/admin/src/components/TabForm/index.js +++ b/packages/core/content-type-builder/admin/src/components/TabForm/index.js @@ -5,11 +5,12 @@ */ import React from 'react'; + +import { Box, Grid, GridItem, Typography } from '@strapi/design-system'; +import { GenericInput } from '@strapi/helper-plugin'; +import get from 'lodash/get'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import get from 'lodash/get'; -import { GenericInput } from '@strapi/helper-plugin'; -import { Box, Grid, GridItem, Typography } from '@strapi/design-system'; /* eslint-disable react/no-array-index-key */ const TabForm = ({ form, formErrors, genericInputProps, modifiedData, onChange }) => { diff --git a/packages/core/content-type-builder/admin/src/components/TextareaEnum/index.js b/packages/core/content-type-builder/admin/src/components/TextareaEnum/index.js index fb607f67d8..d7f584d284 100644 --- a/packages/core/content-type-builder/admin/src/components/TextareaEnum/index.js +++ b/packages/core/content-type-builder/admin/src/components/TextareaEnum/index.js @@ -1,7 +1,8 @@ import React from 'react'; + +import { Textarea } from '@strapi/design-system'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { Textarea } from '@strapi/design-system'; const TextareaEnum = ({ description, diff --git a/packages/core/content-type-builder/admin/src/components/UpperFirst/index.js b/packages/core/content-type-builder/admin/src/components/UpperFirst/index.js index 606d51b3a6..32182a7f32 100644 --- a/packages/core/content-type-builder/admin/src/components/UpperFirst/index.js +++ b/packages/core/content-type-builder/admin/src/components/UpperFirst/index.js @@ -1,5 +1,5 @@ -import PropTypes from 'prop-types'; import upperFirst from 'lodash/upperFirst'; +import PropTypes from 'prop-types'; const UpperFirst = ({ content }) => upperFirst(content); diff --git a/packages/core/content-type-builder/admin/src/hooks/useDataManager.js b/packages/core/content-type-builder/admin/src/hooks/useDataManager.js index baf8bef63e..a9b61e8636 100644 --- a/packages/core/content-type-builder/admin/src/hooks/useDataManager.js +++ b/packages/core/content-type-builder/admin/src/hooks/useDataManager.js @@ -1,4 +1,5 @@ import { useContext } from 'react'; + import DataManagerContext from '../contexts/DataManagerContext'; const useDataManager = () => useContext(DataManagerContext); diff --git a/packages/core/content-type-builder/admin/src/hooks/useFormModalNavigation.js b/packages/core/content-type-builder/admin/src/hooks/useFormModalNavigation.js index 765e8f94b3..b309922b4e 100644 --- a/packages/core/content-type-builder/admin/src/hooks/useFormModalNavigation.js +++ b/packages/core/content-type-builder/admin/src/hooks/useFormModalNavigation.js @@ -1,4 +1,5 @@ import { useContext } from 'react'; + import FormModalNavigationContext from '../contexts/FormModalNavigationContext'; const useFormModalNavigation = () => useContext(FormModalNavigationContext); diff --git a/packages/core/content-type-builder/admin/src/icons/Curve.js b/packages/core/content-type-builder/admin/src/icons/Curve.js index a3a2761744..719e9fe04d 100644 --- a/packages/core/content-type-builder/admin/src/icons/Curve.js +++ b/packages/core/content-type-builder/admin/src/icons/Curve.js @@ -1,7 +1,8 @@ import React from 'react'; + +import { Box } from '@strapi/design-system'; import PropTypes from 'prop-types'; import styled from 'styled-components'; -import { Box } from '@strapi/design-system'; const StyledBox = styled(Box)` position: absolute; diff --git a/packages/core/content-type-builder/admin/src/index.js b/packages/core/content-type-builder/admin/src/index.js index eb1e0374a1..b2bd0f173a 100644 --- a/packages/core/content-type-builder/admin/src/index.js +++ b/packages/core/content-type-builder/admin/src/index.js @@ -1,7 +1,9 @@ import { prefixPluginTranslations } from '@strapi/helper-plugin'; + import pluginPkg from '../../package.json'; -import pluginPermissions from './permissions'; + import PluginIcon from './components/PluginIcon'; +import pluginPermissions from './permissions'; import pluginId from './pluginId'; import reducers from './reducers'; import formsAPI from './utils/formAPI'; diff --git a/packages/core/content-type-builder/admin/src/pages/App/Wrapper.js b/packages/core/content-type-builder/admin/src/pages/App/Wrapper.js index 56930d7b48..df8d841c3f 100644 --- a/packages/core/content-type-builder/admin/src/pages/App/Wrapper.js +++ b/packages/core/content-type-builder/admin/src/pages/App/Wrapper.js @@ -1,6 +1,5 @@ -import styled from 'styled-components'; - import { sizes } from '@strapi/helper-plugin'; +import styled from 'styled-components'; const Wrapper = styled.div` min-height: calc(100vh - ${sizes.header.height}); diff --git a/packages/core/content-type-builder/admin/src/pages/App/index.js b/packages/core/content-type-builder/admin/src/pages/App/index.js index 425848da04..d8289e205e 100644 --- a/packages/core/content-type-builder/admin/src/pages/App/index.js +++ b/packages/core/content-type-builder/admin/src/pages/App/index.js @@ -4,18 +4,20 @@ * */ -import React, { Suspense, lazy, useEffect, useRef } from 'react'; -import { Switch, Route } from 'react-router-dom'; +import React, { lazy, Suspense, useEffect, useRef } from 'react'; + +import { Layout } from '@strapi/design-system'; +import { CheckPagePermissions, LoadingIndicatorPage, useGuidedTour } from '@strapi/helper-plugin'; import { Helmet } from 'react-helmet'; import { useIntl } from 'react-intl'; -import { LoadingIndicatorPage, CheckPagePermissions, useGuidedTour } from '@strapi/helper-plugin'; -import { Layout } from '@strapi/design-system'; -import pluginPermissions from '../../permissions'; -import pluginId from '../../pluginId'; +import { Route, Switch } from 'react-router-dom'; + +import ContentTypeBuilderNav from '../../components/ContentTypeBuilderNav'; import DataManagerProvider from '../../components/DataManagerProvider'; import FormModalNavigationProvider from '../../components/FormModalNavigationProvider'; +import pluginPermissions from '../../permissions'; +import pluginId from '../../pluginId'; import RecursivePath from '../RecursivePath'; -import ContentTypeBuilderNav from '../../components/ContentTypeBuilderNav'; const ListView = lazy(() => import(/* webpackChunkName: "content-type-builder-list-view" */ '../ListView') diff --git a/packages/core/content-type-builder/admin/src/pages/ListView/LinkToCMSettingsView/index.js b/packages/core/content-type-builder/admin/src/pages/ListView/LinkToCMSettingsView/index.js index 1e4354c0f4..0106fe956d 100644 --- a/packages/core/content-type-builder/admin/src/pages/ListView/LinkToCMSettingsView/index.js +++ b/packages/core/content-type-builder/admin/src/pages/ListView/LinkToCMSettingsView/index.js @@ -1,10 +1,11 @@ import React, { memo } from 'react'; -import PropTypes from 'prop-types'; -import { CheckPermissions } from '@strapi/helper-plugin'; + import { Button } from '@strapi/design-system'; +import { CheckPermissions } from '@strapi/helper-plugin'; import { Layer } from '@strapi/icons'; -import { useHistory } from 'react-router-dom'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; +import { useHistory } from 'react-router-dom'; const cmPermissions = { collectionTypesConfigurations: [ diff --git a/packages/core/content-type-builder/admin/src/pages/ListView/index.js b/packages/core/content-type-builder/admin/src/pages/ListView/index.js index 84337458b6..750fe7879e 100644 --- a/packages/core/content-type-builder/admin/src/pages/ListView/index.js +++ b/packages/core/content-type-builder/admin/src/pages/ListView/index.js @@ -1,19 +1,22 @@ import React from 'react'; -import { useTracking, Link } from '@strapi/helper-plugin'; -import { Plus, ArrowLeft, Check, Pencil } from '@strapi/icons'; -import { Button, Flex, Box, ContentLayout, HeaderLayout } from '@strapi/design-system'; + +import { Box, Button, ContentLayout, Flex, HeaderLayout } from '@strapi/design-system'; +import { Link, useTracking } from '@strapi/helper-plugin'; +import { ArrowLeft, Check, Pencil, Plus } from '@strapi/icons'; import get from 'lodash/get'; import has from 'lodash/has'; import isEqual from 'lodash/isEqual'; import upperFirst from 'lodash/upperFirst'; import { useIntl } from 'react-intl'; import { Prompt, useRouteMatch } from 'react-router-dom'; + import List from '../../components/List'; import ListRow from '../../components/ListRow'; import useDataManager from '../../hooks/useDataManager'; import useFormModalNavigation from '../../hooks/useFormModalNavigation'; import getAttributeDisplayedType from '../../utils/getAttributeDisplayedType'; import getTrad from '../../utils/getTrad'; + import LinkToCMSettingsView from './LinkToCMSettingsView'; /* eslint-disable indent */ diff --git a/packages/core/content-type-builder/admin/src/pages/ListView/tests/index.test.js b/packages/core/content-type-builder/admin/src/pages/ListView/tests/index.test.js index b9170e0ca1..9b64e239a9 100644 --- a/packages/core/content-type-builder/admin/src/pages/ListView/tests/index.test.js +++ b/packages/core/content-type-builder/admin/src/pages/ListView/tests/index.test.js @@ -4,17 +4,19 @@ * */ +import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render } from '@testing-library/react'; import { createMemoryHistory } from 'history'; -import React from 'react'; -import { Router } from 'react-router-dom'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; import { IntlProvider } from 'react-intl'; +import { Router } from 'react-router-dom'; + import FormModalNavigationProvider from '../../../components/FormModalNavigationProvider'; import pluginEn from '../../../translations/en.json'; import getTrad from '../../../utils/getTrad'; - import ListView from '../index'; + import mockData from './mockData'; jest.mock('../../../hooks/useDataManager', () => { diff --git a/packages/core/content-type-builder/admin/src/pages/RecursivePath/index.js b/packages/core/content-type-builder/admin/src/pages/RecursivePath/index.js index b382a3e393..7261c41ffe 100644 --- a/packages/core/content-type-builder/admin/src/pages/RecursivePath/index.js +++ b/packages/core/content-type-builder/admin/src/pages/RecursivePath/index.js @@ -1,6 +1,7 @@ -import React, { Suspense, lazy } from 'react'; -import { Switch, Route, useRouteMatch, useParams } from 'react-router-dom'; +import React, { lazy, Suspense } from 'react'; + import { LoadingIndicatorPage } from '@strapi/helper-plugin'; +import { Route, Switch, useParams, useRouteMatch } from 'react-router-dom'; const ListView = lazy(() => import(/* webpackChunkName: "content-type-builder-recursive-path" */ '../ListView') diff --git a/packages/core/content-type-builder/admin/src/reducers.js b/packages/core/content-type-builder/admin/src/reducers.js index 27c34fb13e..33cb043850 100644 --- a/packages/core/content-type-builder/admin/src/reducers.js +++ b/packages/core/content-type-builder/admin/src/reducers.js @@ -1,5 +1,5 @@ -import formModalReducer from './components/FormModal/reducer'; import dataManagerProvider from './components/DataManagerProvider/reducer'; +import formModalReducer from './components/FormModal/reducer'; import pluginId from './pluginId'; const reducers = { diff --git a/packages/core/content-type-builder/admin/src/utils/tests/formAPI.test.js b/packages/core/content-type-builder/admin/src/utils/tests/formAPI.test.js index 1018c4e77c..5fc9acdd31 100644 --- a/packages/core/content-type-builder/admin/src/utils/tests/formAPI.test.js +++ b/packages/core/content-type-builder/admin/src/utils/tests/formAPI.test.js @@ -1,4 +1,5 @@ import * as yup from 'yup'; + import formsAPI from '../formAPI'; describe('formsAPI', () => { diff --git a/packages/core/email/admin/src/index.js b/packages/core/email/admin/src/index.js index 656e713943..eac130f8a8 100644 --- a/packages/core/email/admin/src/index.js +++ b/packages/core/email/admin/src/index.js @@ -6,9 +6,11 @@ // IF THE DOC IS NOT UPDATED THE PULL REQUEST WILL NOT BE MERGED import { prefixPluginTranslations } from '@strapi/helper-plugin'; + import pluginPkg from '../../package.json'; -import pluginId from './pluginId'; + import pluginPermissions from './permissions'; +import pluginId from './pluginId'; import getTrad from './utils/getTrad'; const name = pluginPkg.strapi.name; diff --git a/packages/core/email/admin/src/pages/Settings/components/Configuration.js b/packages/core/email/admin/src/pages/Settings/components/Configuration.js index 4b80f73fbe..004b810070 100644 --- a/packages/core/email/admin/src/pages/Settings/components/Configuration.js +++ b/packages/core/email/admin/src/pages/Settings/components/Configuration.js @@ -1,10 +1,12 @@ /* eslint-disable no-useless-escape */ import React from 'react'; + +import { Flex, Grid, GridItem, Option, Select, TextInput, Typography } from '@strapi/design-system'; import PropTypes from 'prop-types'; -import styled from 'styled-components'; import { useIntl } from 'react-intl'; -import { Flex, Grid, GridItem, Typography, TextInput, Select, Option } from '@strapi/design-system'; +import styled from 'styled-components'; + import getTrad from '../../../utils/getTrad'; const DocumentationLink = styled.a` diff --git a/packages/core/email/admin/src/pages/Settings/components/EmailHeader.js b/packages/core/email/admin/src/pages/Settings/components/EmailHeader.js index ec736959f0..28debe9108 100644 --- a/packages/core/email/admin/src/pages/Settings/components/EmailHeader.js +++ b/packages/core/email/admin/src/pages/Settings/components/EmailHeader.js @@ -1,7 +1,9 @@ import React from 'react'; -import { useIntl } from 'react-intl'; -import { SettingsPageTitle } from '@strapi/helper-plugin'; + import { HeaderLayout } from '@strapi/design-system'; +import { SettingsPageTitle } from '@strapi/helper-plugin'; +import { useIntl } from 'react-intl'; + import getTrad from '../../../utils/getTrad'; const EmailHeader = () => { diff --git a/packages/core/email/admin/src/pages/Settings/index.js b/packages/core/email/admin/src/pages/Settings/index.js index e8dfdeedac..d31b3e5391 100644 --- a/packages/core/email/admin/src/pages/Settings/index.js +++ b/packages/core/email/admin/src/pages/Settings/index.js @@ -1,32 +1,35 @@ -import React, { useState, useEffect } from 'react'; -import { useIntl } from 'react-intl'; +import React, { useEffect, useState } from 'react'; + import { - getYupInnerErrors, - CheckPagePermissions, - useNotification, - LoadingIndicatorPage, - useOverlayBlocker, - useFocusWhenNavigate, -} from '@strapi/helper-plugin'; -import { - Main, - ContentLayout, Box, + Button, + ContentLayout, + Flex, Grid, GridItem, - Typography, + Main, TextInput, - Button, - Flex, + Typography, useNotifyAT, } from '@strapi/design-system'; +import { + CheckPagePermissions, + getYupInnerErrors, + LoadingIndicatorPage, + useFocusWhenNavigate, + useNotification, + useOverlayBlocker, +} from '@strapi/helper-plugin'; import { Envelop } from '@strapi/icons'; -import Configuration from './components/Configuration'; -import schema from '../../utils/schema'; +import { useIntl } from 'react-intl'; + import pluginPermissions from '../../permissions'; -import { fetchEmailSettings, postEmailTest } from './utils/api'; -import EmailHeader from './components/EmailHeader'; import getTrad from '../../utils/getTrad'; +import schema from '../../utils/schema'; + +import Configuration from './components/Configuration'; +import EmailHeader from './components/EmailHeader'; +import { fetchEmailSettings, postEmailTest } from './utils/api'; const ProtectedSettingsPage = () => ( diff --git a/packages/core/email/admin/src/pages/Settings/tests/index.test.js b/packages/core/email/admin/src/pages/Settings/tests/index.test.js index 6b91864f91..ad0aa549bb 100644 --- a/packages/core/email/admin/src/pages/Settings/tests/index.test.js +++ b/packages/core/email/admin/src/pages/Settings/tests/index.test.js @@ -1,10 +1,13 @@ import React from 'react'; -import { render, waitFor, screen } from '@testing-library/react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { render, screen, waitFor } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import server from './utils/server'; + import ProtectedSettingsPage from '../index'; +import server from './utils/server'; + jest.mock('@strapi/helper-plugin', () => ({ ...jest.requireActual('@strapi/helper-plugin'), useNotification: jest.fn(), diff --git a/packages/core/email/admin/src/pages/Settings/tests/utils/server.js b/packages/core/email/admin/src/pages/Settings/tests/utils/server.js index d0b707eb0d..bf59abaea6 100644 --- a/packages/core/email/admin/src/pages/Settings/tests/utils/server.js +++ b/packages/core/email/admin/src/pages/Settings/tests/utils/server.js @@ -1,5 +1,5 @@ -import { setupServer } from 'msw/node'; import { rest } from 'msw'; +import { setupServer } from 'msw/node'; const handlers = [ rest.get('*/email/settings', (req, res, ctx) => { diff --git a/packages/core/email/admin/src/utils/schema.js b/packages/core/email/admin/src/utils/schema.js index 13705a3f17..c2b870cd2f 100644 --- a/packages/core/email/admin/src/utils/schema.js +++ b/packages/core/email/admin/src/utils/schema.js @@ -1,5 +1,5 @@ -import * as yup from 'yup'; import { translatedErrors } from '@strapi/helper-plugin'; +import * as yup from 'yup'; const schema = yup.object().shape({ email: yup.string().email(translatedErrors.email).required(translatedErrors.required), diff --git a/packages/core/helper-plugin/src/components/AnErrorOccurred/index.js b/packages/core/helper-plugin/src/components/AnErrorOccurred/index.js index c268bb533d..ba70f79ec5 100644 --- a/packages/core/helper-plugin/src/components/AnErrorOccurred/index.js +++ b/packages/core/helper-plugin/src/components/AnErrorOccurred/index.js @@ -1,6 +1,7 @@ import React from 'react'; -import { ExclamationMarkCircle } from '@strapi/icons'; + import { EmptyStateLayout } from '@strapi/design-system'; +import { ExclamationMarkCircle } from '@strapi/icons'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; diff --git a/packages/core/helper-plugin/src/components/CheckPagePermissions/index.js b/packages/core/helper-plugin/src/components/CheckPagePermissions/index.js index c2b21ab266..4b77290b51 100644 --- a/packages/core/helper-plugin/src/components/CheckPagePermissions/index.js +++ b/packages/core/helper-plugin/src/components/CheckPagePermissions/index.js @@ -1,6 +1,8 @@ import React, { useEffect, useRef, useState } from 'react'; -import { Redirect } from 'react-router-dom'; + import PropTypes from 'prop-types'; +import { Redirect } from 'react-router-dom'; + import { useNotification } from '../../features/Notifications'; import { useRBACProvider } from '../../features/RBAC'; import hasPermissions from '../../utils/hasPermissions'; diff --git a/packages/core/helper-plugin/src/components/CheckPermissions/index.js b/packages/core/helper-plugin/src/components/CheckPermissions/index.js index e62ed28183..83e25e4c36 100644 --- a/packages/core/helper-plugin/src/components/CheckPermissions/index.js +++ b/packages/core/helper-plugin/src/components/CheckPermissions/index.js @@ -1,9 +1,10 @@ import { useEffect, useRef, useState } from 'react'; -import PropTypes from 'prop-types'; -import { useNotification } from '../../features/Notifications'; -import hasPermissions from '../../utils/hasPermissions'; +import PropTypes from 'prop-types'; + +import { useNotification } from '../../features/Notifications'; import { useRBACProvider } from '../../features/RBAC'; +import hasPermissions from '../../utils/hasPermissions'; // NOTE: this component is very similar to the CheckPagePermissions // except that it does not handle redirections nor loading state diff --git a/packages/core/helper-plugin/src/components/ConfirmDialog/index.js b/packages/core/helper-plugin/src/components/ConfirmDialog/index.js index 9b7a9a665c..44ecd4022b 100644 --- a/packages/core/helper-plugin/src/components/ConfirmDialog/index.js +++ b/packages/core/helper-plugin/src/components/ConfirmDialog/index.js @@ -1,8 +1,9 @@ import React from 'react'; + +import { Button, Dialog, DialogBody, DialogFooter, Flex, Typography } from '@strapi/design-system'; +import { ExclamationMarkCircle, Trash } from '@strapi/icons'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { Dialog, DialogBody, DialogFooter, Flex, Typography, Button } from '@strapi/design-system'; -import { ExclamationMarkCircle, Trash } from '@strapi/icons'; const ConfirmDialog = ({ bodyText, diff --git a/packages/core/helper-plugin/src/components/ConfirmDialog/tests/index.test.js b/packages/core/helper-plugin/src/components/ConfirmDialog/tests/index.test.js index 3b1f66c7f6..0661feea86 100644 --- a/packages/core/helper-plugin/src/components/ConfirmDialog/tests/index.test.js +++ b/packages/core/helper-plugin/src/components/ConfirmDialog/tests/index.test.js @@ -1,7 +1,9 @@ import React from 'react'; -import { render, waitFor, screen } from '@testing-library/react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { render, screen, waitFor } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; + import ConfirmDialog from '../index'; const App = ( diff --git a/packages/core/helper-plugin/src/components/ContentBox/index.js b/packages/core/helper-plugin/src/components/ContentBox/index.js index fde8c77070..36ba8688b5 100644 --- a/packages/core/helper-plugin/src/components/ContentBox/index.js +++ b/packages/core/helper-plugin/src/components/ContentBox/index.js @@ -1,7 +1,8 @@ import React from 'react'; + +import { Flex, Typography } from '@strapi/design-system'; import PropTypes from 'prop-types'; import styled from 'styled-components'; -import { Flex, Typography } from '@strapi/design-system'; const IconWrapper = styled(Flex)` margin-right: ${({ theme }) => theme.spaces[6]}; diff --git a/packages/core/helper-plugin/src/components/ContentBox/tests/index.test.js b/packages/core/helper-plugin/src/components/ContentBox/tests/index.test.js index 084911453a..83f195dc48 100644 --- a/packages/core/helper-plugin/src/components/ContentBox/tests/index.test.js +++ b/packages/core/helper-plugin/src/components/ContentBox/tests/index.test.js @@ -1,7 +1,9 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render, screen } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; + import ContentBox from '../index'; const App = ( diff --git a/packages/core/helper-plugin/src/components/DateTimePicker/index.js b/packages/core/helper-plugin/src/components/DateTimePicker/index.js index bc9c6476b1..ce5e3d3e63 100644 --- a/packages/core/helper-plugin/src/components/DateTimePicker/index.js +++ b/packages/core/helper-plugin/src/components/DateTimePicker/index.js @@ -1,4 +1,5 @@ import React, { useEffect } from 'react'; + import { DateTimePicker } from '@strapi/design-system'; // TODO: remove DateTimePicker component from the helper-plugin in V5 diff --git a/packages/core/helper-plugin/src/components/DateTimePicker/tests/index.test.js b/packages/core/helper-plugin/src/components/DateTimePicker/tests/index.test.js index be2bfd4ace..5974e2c386 100644 --- a/packages/core/helper-plugin/src/components/DateTimePicker/tests/index.test.js +++ b/packages/core/helper-plugin/src/components/DateTimePicker/tests/index.test.js @@ -1,6 +1,8 @@ import * as React from 'react'; -import { render as renderRTL } from '@testing-library/react'; + import { DesignSystemProvider } from '@strapi/design-system'; +import { render as renderRTL } from '@testing-library/react'; + import DateTimePicker from '../index'; const render = (props) => diff --git a/packages/core/helper-plugin/src/components/DynamicTable/TableHead/index.js b/packages/core/helper-plugin/src/components/DynamicTable/TableHead/index.js index 4f0b75401d..51fddef185 100644 --- a/packages/core/helper-plugin/src/components/DynamicTable/TableHead/index.js +++ b/packages/core/helper-plugin/src/components/DynamicTable/TableHead/index.js @@ -1,18 +1,20 @@ import React from 'react'; + import { BaseCheckbox, IconButton, - Tooltip, - Typography, Th, Thead, + Tooltip, Tr, + Typography, VisuallyHidden, } from '@strapi/design-system'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import SortIcon from '../../../icons/SortIcon'; + import useQueryParams from '../../../hooks/useQueryParams'; +import SortIcon from '../../../icons/SortIcon'; const TableHead = ({ areAllEntriesSelected, diff --git a/packages/core/helper-plugin/src/components/DynamicTable/index.js b/packages/core/helper-plugin/src/components/DynamicTable/index.js index eff3226ac1..786ce8380c 100644 --- a/packages/core/helper-plugin/src/components/DynamicTable/index.js +++ b/packages/core/helper-plugin/src/components/DynamicTable/index.js @@ -1,13 +1,15 @@ import React, { Children, cloneElement, useState } from 'react'; -import PropTypes from 'prop-types'; -import { Box, Flex, Button, Typography, Table as TableCompo } from '@strapi/design-system'; -import { useIntl } from 'react-intl'; -import { Trash } from '@strapi/icons'; -import useQueryParams from '../../hooks/useQueryParams'; +import { Box, Button, Flex, Table as TableCompo, Typography } from '@strapi/design-system'; +import { Trash } from '@strapi/icons'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; + import { useTracking } from '../../features/Tracking'; +import useQueryParams from '../../hooks/useQueryParams'; import ConfirmDialog from '../ConfirmDialog'; import EmptyBodyTable from '../EmptyBodyTable'; + import TableHead from './TableHead'; const Table = ({ diff --git a/packages/core/helper-plugin/src/components/EmptyBodyTable/index.js b/packages/core/helper-plugin/src/components/EmptyBodyTable/index.js index d44a16f47b..0f50de3a1b 100644 --- a/packages/core/helper-plugin/src/components/EmptyBodyTable/index.js +++ b/packages/core/helper-plugin/src/components/EmptyBodyTable/index.js @@ -1,6 +1,8 @@ import React from 'react'; -import { Tbody, Tr, Td, Box, Flex, Loader } from '@strapi/design-system'; + +import { Box, Flex, Loader, Tbody, Td, Tr } from '@strapi/design-system'; import PropTypes from 'prop-types'; + import EmptyStateLayout from '../EmptyStateLayout'; const EmptyBodyTable = ({ colSpan, isLoading, ...rest }) => { diff --git a/packages/core/helper-plugin/src/components/EmptyStateLayout/index.js b/packages/core/helper-plugin/src/components/EmptyStateLayout/index.js index 7df619b94c..109b0af737 100644 --- a/packages/core/helper-plugin/src/components/EmptyStateLayout/index.js +++ b/packages/core/helper-plugin/src/components/EmptyStateLayout/index.js @@ -1,8 +1,9 @@ import React from 'react'; + import { EmptyStateLayout as Layout } from '@strapi/design-system'; import { EmptyDocuments, EmptyPermissions, EmptyPictures } from '@strapi/icons'; -import { useIntl } from 'react-intl'; import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; const icons = { document: EmptyDocuments, diff --git a/packages/core/helper-plugin/src/components/FilterListURLQuery/AttributeTag.js b/packages/core/helper-plugin/src/components/FilterListURLQuery/AttributeTag.js index 2dc6dca9cc..81799da920 100644 --- a/packages/core/helper-plugin/src/components/FilterListURLQuery/AttributeTag.js +++ b/packages/core/helper-plugin/src/components/FilterListURLQuery/AttributeTag.js @@ -1,7 +1,8 @@ import React from 'react'; -import PropTypes from 'prop-types'; + import { Box, Tag } from '@strapi/design-system'; import { Cross } from '@strapi/icons'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; const AttributeTag = ({ attribute, filter, onClick, operator, value }) => { diff --git a/packages/core/helper-plugin/src/components/FilterListURLQuery/index.js b/packages/core/helper-plugin/src/components/FilterListURLQuery/index.js index e556a1c927..6d37008b20 100644 --- a/packages/core/helper-plugin/src/components/FilterListURLQuery/index.js +++ b/packages/core/helper-plugin/src/components/FilterListURLQuery/index.js @@ -5,8 +5,11 @@ */ import React from 'react'; + import PropTypes from 'prop-types'; + import useQueryParams from '../../hooks/useQueryParams'; + import AttributeTag from './AttributeTag'; const FilterListURLQuery = ({ filtersSchema }) => { diff --git a/packages/core/helper-plugin/src/components/FilterListURLQuery/tests/index.test.js b/packages/core/helper-plugin/src/components/FilterListURLQuery/tests/index.test.js index e111987764..9b48567e2e 100644 --- a/packages/core/helper-plugin/src/components/FilterListURLQuery/tests/index.test.js +++ b/packages/core/helper-plugin/src/components/FilterListURLQuery/tests/index.test.js @@ -5,12 +5,14 @@ */ import React from 'react'; -import { render, screen, act } from '@testing-library/react'; -import { IntlProvider } from 'react-intl'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import { Router } from 'react-router-dom'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { act, render, screen } from '@testing-library/react'; import { createMemoryHistory } from 'history'; import qs from 'qs'; +import { IntlProvider } from 'react-intl'; +import { Router } from 'react-router-dom'; + import FilterListURLQuery from '../index'; // TO BE REMOVED: we have added this mock to prevent errors in the snapshots caused by the Unicode space character diff --git a/packages/core/helper-plugin/src/components/FilterPopoverURLQuery/Inputs.js b/packages/core/helper-plugin/src/components/FilterPopoverURLQuery/Inputs.js index 503765818c..7f22a2e6dd 100644 --- a/packages/core/helper-plugin/src/components/FilterPopoverURLQuery/Inputs.js +++ b/packages/core/helper-plugin/src/components/FilterPopoverURLQuery/Inputs.js @@ -1,17 +1,18 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import parseISO from 'date-fns/parseISO'; -import formatISO from 'date-fns/formatISO'; + import { DatePicker, DateTimePicker, Field, - NumberInput, - TimePicker, - Select, FieldInput, + NumberInput, Option, + Select, + TimePicker, } from '@strapi/design-system'; +import formatISO from 'date-fns/formatISO'; +import parseISO from 'date-fns/parseISO'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; const Inputs = ({ label, onChange, options, type, value }) => { diff --git a/packages/core/helper-plugin/src/components/FilterPopoverURLQuery/index.js b/packages/core/helper-plugin/src/components/FilterPopoverURLQuery/index.js index 0243e78392..1962764fb5 100644 --- a/packages/core/helper-plugin/src/components/FilterPopoverURLQuery/index.js +++ b/packages/core/helper-plugin/src/components/FilterPopoverURLQuery/index.js @@ -5,13 +5,16 @@ */ import React, { useState } from 'react'; -import PropTypes from 'prop-types'; -import styled from 'styled-components'; -import { Button, Flex, Box, Popover, Select, Option } from '@strapi/design-system'; + +import { Box, Button, Flex, Option, Popover, Select } from '@strapi/design-system'; import { Plus } from '@strapi/icons'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import useQueryParams from '../../hooks/useQueryParams'; +import styled from 'styled-components'; + import { useTracking } from '../../features/Tracking'; +import useQueryParams from '../../hooks/useQueryParams'; + import DefaultInputs from './Inputs'; import getFilterList from './utils/getFilterList'; diff --git a/packages/core/helper-plugin/src/components/Form/index.js b/packages/core/helper-plugin/src/components/Form/index.js index c208e30a0f..2e66dea391 100644 --- a/packages/core/helper-plugin/src/components/Form/index.js +++ b/packages/core/helper-plugin/src/components/Form/index.js @@ -1,4 +1,5 @@ import React, { useEffect, useRef } from 'react'; + import { Form, useFormikContext } from 'formik'; const FormWithFocus = (props) => { diff --git a/packages/core/helper-plugin/src/components/GenericInput/NotSupported.js b/packages/core/helper-plugin/src/components/GenericInput/NotSupported.js index 4853915707..d77cdfb957 100644 --- a/packages/core/helper-plugin/src/components/GenericInput/NotSupported.js +++ b/packages/core/helper-plugin/src/components/GenericInput/NotSupported.js @@ -5,6 +5,7 @@ */ import React from 'react'; + import { TextInput } from '@strapi/design-system'; import PropTypes from 'prop-types'; diff --git a/packages/core/helper-plugin/src/components/GenericInput/index.js b/packages/core/helper-plugin/src/components/GenericInput/index.js index 1d8bbfe8cf..2494f365f4 100644 --- a/packages/core/helper-plugin/src/components/GenericInput/index.js +++ b/packages/core/helper-plugin/src/components/GenericInput/index.js @@ -5,31 +5,32 @@ */ import React, { useState } from 'react'; -import PropTypes from 'prop-types'; -import parseISO from 'date-fns/parseISO'; -import formatISO from 'date-fns/formatISO'; -import { useIntl } from 'react-intl'; import { Checkbox, DatePicker, DateTimePicker, Icon, + JSONInput, NumberInput, + Option, Select, Textarea, TextInput, TimePicker, ToggleInput, - JSONInput, - Option, } from '@strapi/design-system'; -import { EyeStriked, Eye } from '@strapi/icons'; +import { Eye, EyeStriked } from '@strapi/icons'; +import formatISO from 'date-fns/formatISO'; +import parseISO from 'date-fns/parseISO'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; -import NotSupported from './NotSupported'; import useFieldHint from '../../hooks/useFieldHint'; import pxToRem from '../../utils/pxToRem'; +import NotSupported from './NotSupported'; + const GenericInput = ({ autoComplete, customInputs, diff --git a/packages/core/helper-plugin/src/components/GenericInput/tests/index.test.js b/packages/core/helper-plugin/src/components/GenericInput/tests/index.test.js index db7ac76146..72532dfb11 100644 --- a/packages/core/helper-plugin/src/components/GenericInput/tests/index.test.js +++ b/packages/core/helper-plugin/src/components/GenericInput/tests/index.test.js @@ -1,8 +1,9 @@ import React from 'react'; + import { DesignSystemProvider } from '@strapi/design-system'; -import { IntlProvider } from 'react-intl'; -import { render, fireEvent } from '@testing-library/react'; +import { fireEvent, render } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; +import { IntlProvider } from 'react-intl'; import GenericInput from '../index'; diff --git a/packages/core/helper-plugin/src/components/InjectionZone/InjectionZone.js b/packages/core/helper-plugin/src/components/InjectionZone/InjectionZone.js index a1df272b4e..48452a4064 100644 --- a/packages/core/helper-plugin/src/components/InjectionZone/InjectionZone.js +++ b/packages/core/helper-plugin/src/components/InjectionZone/InjectionZone.js @@ -1,5 +1,7 @@ import React from 'react'; + import PropTypes from 'prop-types'; + import useInjectionZone from './useInjectionZone'; const InjectionZone = ({ area, ...props }) => { diff --git a/packages/core/helper-plugin/src/components/Link/index.js b/packages/core/helper-plugin/src/components/Link/index.js index 88c555a18c..b9386184fc 100644 --- a/packages/core/helper-plugin/src/components/Link/index.js +++ b/packages/core/helper-plugin/src/components/Link/index.js @@ -1,6 +1,7 @@ import React from 'react'; -import { NavLink } from 'react-router-dom'; + import { Link as DSLink } from '@strapi/design-system/v2'; +import { NavLink } from 'react-router-dom'; const Link = (props) => ; diff --git a/packages/core/helper-plugin/src/components/LinkButton/index.js b/packages/core/helper-plugin/src/components/LinkButton/index.js index 32e7b7a93c..0a8bdc35bb 100644 --- a/packages/core/helper-plugin/src/components/LinkButton/index.js +++ b/packages/core/helper-plugin/src/components/LinkButton/index.js @@ -1,6 +1,7 @@ import React from 'react'; -import { NavLink } from 'react-router-dom'; + import { LinkButton as DSLinkButton } from '@strapi/design-system/v2'; +import { NavLink } from 'react-router-dom'; const LinkButton = (props) => ; diff --git a/packages/core/helper-plugin/src/components/LoadingIndicatorPage/index.js b/packages/core/helper-plugin/src/components/LoadingIndicatorPage/index.js index eb94a1eb1e..1145c3c8b8 100644 --- a/packages/core/helper-plugin/src/components/LoadingIndicatorPage/index.js +++ b/packages/core/helper-plugin/src/components/LoadingIndicatorPage/index.js @@ -1,5 +1,6 @@ import React from 'react'; -import { Loader, Flex } from '@strapi/design-system'; + +import { Flex, Loader } from '@strapi/design-system'; import PropTypes from 'prop-types'; import styled from 'styled-components'; diff --git a/packages/core/helper-plugin/src/components/NoContent/index.js b/packages/core/helper-plugin/src/components/NoContent/index.js index 61eb04efc0..96c18270c3 100644 --- a/packages/core/helper-plugin/src/components/NoContent/index.js +++ b/packages/core/helper-plugin/src/components/NoContent/index.js @@ -1,6 +1,7 @@ import React from 'react'; -import { EmptyDocuments } from '@strapi/icons'; + import { EmptyStateLayout } from '@strapi/design-system'; +import { EmptyDocuments } from '@strapi/icons'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; diff --git a/packages/core/helper-plugin/src/components/NoMedia/index.js b/packages/core/helper-plugin/src/components/NoMedia/index.js index fbe638f19d..3ccb7d510c 100644 --- a/packages/core/helper-plugin/src/components/NoMedia/index.js +++ b/packages/core/helper-plugin/src/components/NoMedia/index.js @@ -1,6 +1,7 @@ import React from 'react'; -import { EmptyPictures } from '@strapi/icons'; + import { EmptyStateLayout } from '@strapi/design-system'; +import { EmptyPictures } from '@strapi/icons'; const NoMedia = (props) => { return } {...props} />; diff --git a/packages/core/helper-plugin/src/components/NoPermissions/index.js b/packages/core/helper-plugin/src/components/NoPermissions/index.js index f1442eef45..620a37b33d 100644 --- a/packages/core/helper-plugin/src/components/NoPermissions/index.js +++ b/packages/core/helper-plugin/src/components/NoPermissions/index.js @@ -1,8 +1,9 @@ import React from 'react'; + +import { EmptyStateLayout } from '@strapi/design-system'; +import { EmptyPermissions } from '@strapi/icons'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { EmptyPermissions } from '@strapi/icons'; -import { EmptyStateLayout } from '@strapi/design-system'; const NoPermissions = ({ action }) => { const { formatMessage } = useIntl(); diff --git a/packages/core/helper-plugin/src/components/NotAllowedInput/index.js b/packages/core/helper-plugin/src/components/NotAllowedInput/index.js index e60b07e3c6..f7fa55fb6c 100644 --- a/packages/core/helper-plugin/src/components/NotAllowedInput/index.js +++ b/packages/core/helper-plugin/src/components/NotAllowedInput/index.js @@ -5,11 +5,12 @@ */ import React from 'react'; -import { useIntl } from 'react-intl'; + import { TextInput } from '@strapi/design-system'; -import PropTypes from 'prop-types'; -import styled from 'styled-components'; import { EyeStriked } from '@strapi/icons'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import styled from 'styled-components'; const StyledIcon = styled(EyeStriked)` > path { diff --git a/packages/core/helper-plugin/src/components/NotAllowedInput/tests/index.test.js b/packages/core/helper-plugin/src/components/NotAllowedInput/tests/index.test.js index bd57392934..1d804ed978 100644 --- a/packages/core/helper-plugin/src/components/NotAllowedInput/tests/index.test.js +++ b/packages/core/helper-plugin/src/components/NotAllowedInput/tests/index.test.js @@ -5,9 +5,11 @@ */ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render } from '@testing-library/react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; import { IntlProvider } from 'react-intl'; + import NotAllowedInput from '../index'; const messages = { diff --git a/packages/core/helper-plugin/src/components/PageSizeURLQuery/index.js b/packages/core/helper-plugin/src/components/PageSizeURLQuery/index.js index 527ce4559f..9c2edb2481 100644 --- a/packages/core/helper-plugin/src/components/PageSizeURLQuery/index.js +++ b/packages/core/helper-plugin/src/components/PageSizeURLQuery/index.js @@ -5,11 +5,13 @@ */ import React from 'react'; -import { useIntl } from 'react-intl'; -import { Box, Flex, Select, Option, Typography } from '@strapi/design-system'; + +import { Box, Flex, Option, Select, Typography } from '@strapi/design-system'; import PropTypes from 'prop-types'; -import useQueryParams from '../../hooks/useQueryParams'; +import { useIntl } from 'react-intl'; + import { useTracking } from '../../features/Tracking'; +import useQueryParams from '../../hooks/useQueryParams'; const PageSizeURLQuery = ({ trackedEvent, options, defaultValue }) => { const { formatMessage } = useIntl(); diff --git a/packages/core/helper-plugin/src/components/PageSizeURLQuery/tests/index.test.js b/packages/core/helper-plugin/src/components/PageSizeURLQuery/tests/index.test.js index de7df47c10..12d96d733b 100644 --- a/packages/core/helper-plugin/src/components/PageSizeURLQuery/tests/index.test.js +++ b/packages/core/helper-plugin/src/components/PageSizeURLQuery/tests/index.test.js @@ -5,11 +5,13 @@ */ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render } from '@testing-library/react'; +import { createMemoryHistory } from 'history'; import { IntlProvider } from 'react-intl'; import { Router } from 'react-router-dom'; -import { createMemoryHistory } from 'history'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; + import PageSizeURLQuery from '../index'; jest.mock('../../../features/Tracking', () => ({ diff --git a/packages/core/helper-plugin/src/components/PaginationURLQuery/index.js b/packages/core/helper-plugin/src/components/PaginationURLQuery/index.js index 3e9e3c12df..216df4df31 100644 --- a/packages/core/helper-plugin/src/components/PaginationURLQuery/index.js +++ b/packages/core/helper-plugin/src/components/PaginationURLQuery/index.js @@ -15,11 +15,13 @@ */ import React from 'react'; -import { NextLink, Pagination, PreviousLink, Dots, PageLink } from '@strapi/design-system'; + +import { Dots, NextLink, PageLink, Pagination, PreviousLink } from '@strapi/design-system'; import PropTypes from 'prop-types'; -import { useLocation, NavLink } from 'react-router-dom'; -import { useIntl } from 'react-intl'; import { stringify } from 'qs'; +import { useIntl } from 'react-intl'; +import { NavLink, useLocation } from 'react-router-dom'; + import useQueryParams from '../../hooks/useQueryParams'; const PaginationURLQuery = ({ pagination: { pageCount } }) => { diff --git a/packages/core/helper-plugin/src/components/PaginationURLQuery/tests/index.test.js b/packages/core/helper-plugin/src/components/PaginationURLQuery/tests/index.test.js index aff19a9c5e..1c07e82324 100644 --- a/packages/core/helper-plugin/src/components/PaginationURLQuery/tests/index.test.js +++ b/packages/core/helper-plugin/src/components/PaginationURLQuery/tests/index.test.js @@ -5,11 +5,13 @@ */ import React from 'react'; -import { act, render, screen, fireEvent, waitFor } from '@testing-library/react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { act, fireEvent, render, screen, waitFor } from '@testing-library/react'; +import { createMemoryHistory } from 'history'; import { IntlProvider } from 'react-intl'; import { Router } from 'react-router-dom'; -import { createMemoryHistory } from 'history'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; + import PaginationURLQuery from '../index'; const messages = { diff --git a/packages/core/helper-plugin/src/components/ReactSelect/ReactSelect.js b/packages/core/helper-plugin/src/components/ReactSelect/ReactSelect.js index 6ae52785ff..bd8986915d 100644 --- a/packages/core/helper-plugin/src/components/ReactSelect/ReactSelect.js +++ b/packages/core/helper-plugin/src/components/ReactSelect/ReactSelect.js @@ -1,12 +1,12 @@ -import PropTypes from 'prop-types'; import React from 'react'; + +import PropTypes from 'prop-types'; import Select from 'react-select'; import { useTheme } from 'styled-components'; import ClearIndicator from './components/ClearIndicator'; import DropdownIndicator from './components/DropdownIndicator'; import IndicatorSeparator from './components/IndicatorSeparator'; - import getSelectStyles from './utils/getSelectStyles'; const ReactSelect = ({ components, styles, error, ariaErrorMessage, ...props }) => { diff --git a/packages/core/helper-plugin/src/components/ReactSelect/components/ClearIndicator.js b/packages/core/helper-plugin/src/components/ReactSelect/components/ClearIndicator.js index 25294fc160..1128f80235 100644 --- a/packages/core/helper-plugin/src/components/ReactSelect/components/ClearIndicator.js +++ b/packages/core/helper-plugin/src/components/ReactSelect/components/ClearIndicator.js @@ -1,6 +1,8 @@ import React from 'react'; -import { components } from 'react-select'; + import { Cross } from '@strapi/icons'; +import { components } from 'react-select'; + import IconBox from './IconBox'; const ClearIndicator = (props) => { diff --git a/packages/core/helper-plugin/src/components/ReactSelect/components/DropdownIndicator.js b/packages/core/helper-plugin/src/components/ReactSelect/components/DropdownIndicator.js index bc0911c49b..ef99588548 100644 --- a/packages/core/helper-plugin/src/components/ReactSelect/components/DropdownIndicator.js +++ b/packages/core/helper-plugin/src/components/ReactSelect/components/DropdownIndicator.js @@ -1,6 +1,8 @@ import React from 'react'; -import styled from 'styled-components'; + import { CarretDown } from '@strapi/icons'; +import styled from 'styled-components'; + import IconBox from './IconBox'; export const CarretBox = styled(IconBox)` diff --git a/packages/core/helper-plugin/src/components/ReactSelect/components/IconBox.js b/packages/core/helper-plugin/src/components/ReactSelect/components/IconBox.js index b5c41e9a55..517faab4f0 100644 --- a/packages/core/helper-plugin/src/components/ReactSelect/components/IconBox.js +++ b/packages/core/helper-plugin/src/components/ReactSelect/components/IconBox.js @@ -1,5 +1,5 @@ -import styled from 'styled-components'; import { Box } from '@strapi/design-system'; +import styled from 'styled-components'; export const IconBox = styled(Box)` background: transparent; diff --git a/packages/core/helper-plugin/src/components/RelativeTime/index.js b/packages/core/helper-plugin/src/components/RelativeTime/index.js index a3d71ab78e..899f5d15be 100644 --- a/packages/core/helper-plugin/src/components/RelativeTime/index.js +++ b/packages/core/helper-plugin/src/components/RelativeTime/index.js @@ -1,7 +1,8 @@ import React from 'react'; + import { intervalToDuration, isPast } from 'date-fns'; -import { useIntl } from 'react-intl'; import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; const RelativeTime = ({ timestamp }) => { const { formatRelativeTime, formatDate, formatTime } = useIntl(); diff --git a/packages/core/helper-plugin/src/components/RelativeTime/tests/index.test.js b/packages/core/helper-plugin/src/components/RelativeTime/tests/index.test.js index 90e4c84b52..326640fe47 100644 --- a/packages/core/helper-plugin/src/components/RelativeTime/tests/index.test.js +++ b/packages/core/helper-plugin/src/components/RelativeTime/tests/index.test.js @@ -1,7 +1,9 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render, screen } from '@testing-library/react'; import { IntlProvider, useIntl } from 'react-intl'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; + import RelativeTime from '../index'; const App = ( diff --git a/packages/core/helper-plugin/src/components/SearchURLQuery/index.js b/packages/core/helper-plugin/src/components/SearchURLQuery/index.js index 54f79c2b42..54f08d3ec1 100644 --- a/packages/core/helper-plugin/src/components/SearchURLQuery/index.js +++ b/packages/core/helper-plugin/src/components/SearchURLQuery/index.js @@ -1,10 +1,12 @@ -import React, { useLayoutEffect, useState, useRef } from 'react'; +import React, { useLayoutEffect, useRef, useState } from 'react'; + +import { Icon, IconButton, Searchbar, SearchForm } from '@strapi/design-system'; +import { Search as SearchIcon } from '@strapi/icons'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { Search as SearchIcon } from '@strapi/icons'; -import { Searchbar, SearchForm, IconButton, Icon } from '@strapi/design-system'; -import useQueryParams from '../../hooks/useQueryParams'; + import { useTracking } from '../../features/Tracking'; +import useQueryParams from '../../hooks/useQueryParams'; const SearchURLQuery = ({ label, placeholder, trackedEvent, trackedEventDetails }) => { const wrapperRef = useRef(null); diff --git a/packages/core/helper-plugin/src/components/SearchURLQuery/tests/index.test.js b/packages/core/helper-plugin/src/components/SearchURLQuery/tests/index.test.js index a834478c28..707c063257 100644 --- a/packages/core/helper-plugin/src/components/SearchURLQuery/tests/index.test.js +++ b/packages/core/helper-plugin/src/components/SearchURLQuery/tests/index.test.js @@ -5,11 +5,13 @@ */ import React from 'react'; -import { render, fireEvent } from '@testing-library/react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { fireEvent, render } from '@testing-library/react'; +import { createMemoryHistory } from 'history'; import { IntlProvider } from 'react-intl'; import { Router } from 'react-router-dom'; -import { createMemoryHistory } from 'history'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; + import SearchURLQuery from '../index'; const trackUsage = jest.fn(); diff --git a/packages/core/helper-plugin/src/components/SettingsPageTitle/index.js b/packages/core/helper-plugin/src/components/SettingsPageTitle/index.js index bb31cc4c8e..8a1792d1a7 100644 --- a/packages/core/helper-plugin/src/components/SettingsPageTitle/index.js +++ b/packages/core/helper-plugin/src/components/SettingsPageTitle/index.js @@ -1,7 +1,8 @@ import React from 'react'; -import { useIntl } from 'react-intl'; + import PropTypes from 'prop-types'; import { Helmet } from 'react-helmet'; +import { useIntl } from 'react-intl'; const SettingsPageTitle = ({ name }) => { const { formatMessage } = useIntl(); diff --git a/packages/core/helper-plugin/src/components/Status/index.js b/packages/core/helper-plugin/src/components/Status/index.js index e4e4e8f1cf..d12ad1ec66 100644 --- a/packages/core/helper-plugin/src/components/Status/index.js +++ b/packages/core/helper-plugin/src/components/Status/index.js @@ -1,4 +1,5 @@ import React from 'react'; + import PropTypes from 'prop-types'; import styled from 'styled-components'; diff --git a/packages/core/helper-plugin/src/content-manager/hooks/useCMEditViewDataManager/index.js b/packages/core/helper-plugin/src/content-manager/hooks/useCMEditViewDataManager/index.js index 01ac0ff8ef..a632208bdf 100644 --- a/packages/core/helper-plugin/src/content-manager/hooks/useCMEditViewDataManager/index.js +++ b/packages/core/helper-plugin/src/content-manager/hooks/useCMEditViewDataManager/index.js @@ -1,4 +1,5 @@ import { useContext } from 'react'; + import ContentManagerEditViewDataManagerContext from '../../contexts/ContentManagerEditViewDataManagerContext'; const useCMEditViewDataManager = () => { diff --git a/packages/core/helper-plugin/src/content-manager/utils/contentManagementUtilRemoveFieldsFromData.js b/packages/core/helper-plugin/src/content-manager/utils/contentManagementUtilRemoveFieldsFromData.js index 54cf1061f1..3718d7607d 100644 --- a/packages/core/helper-plugin/src/content-manager/utils/contentManagementUtilRemoveFieldsFromData.js +++ b/packages/core/helper-plugin/src/content-manager/utils/contentManagementUtilRemoveFieldsFromData.js @@ -1,6 +1,6 @@ import get from 'lodash/get'; -import { getType, getOtherInfos } from './getAttributeInfos'; +import { getOtherInfos, getType } from './getAttributeInfos'; const defaultFields = ['createdBy', 'updatedBy', 'publishedAt', 'id', '_id']; diff --git a/packages/core/helper-plugin/src/content-manager/utils/formatContentTypeData.js b/packages/core/helper-plugin/src/content-manager/utils/formatContentTypeData.js index 08a64513ad..c27da1f39c 100644 --- a/packages/core/helper-plugin/src/content-manager/utils/formatContentTypeData.js +++ b/packages/core/helper-plugin/src/content-manager/utils/formatContentTypeData.js @@ -2,7 +2,8 @@ // in order to have a unique identifier for the DnD import get from 'lodash/get'; -import { getType, getOtherInfos } from './getAttributeInfos'; + +import { getOtherInfos, getType } from './getAttributeInfos'; const formatContentTypeData = (data, ct, composSchema) => { const recursiveFormatData = (data, schema) => { diff --git a/packages/core/helper-plugin/src/content-manager/utils/getAttributeInfos.js b/packages/core/helper-plugin/src/content-manager/utils/getAttributeInfos.js index e6c9ed94ee..44b653fea0 100644 --- a/packages/core/helper-plugin/src/content-manager/utils/getAttributeInfos.js +++ b/packages/core/helper-plugin/src/content-manager/utils/getAttributeInfos.js @@ -3,4 +3,4 @@ import get from 'lodash/get'; const getType = (schema, attrName) => get(schema, ['attributes', attrName, 'type'], ''); const getOtherInfos = (schema, arr) => get(schema, ['attributes', ...arr], ''); -export { getType, getOtherInfos }; +export { getOtherInfos, getType }; diff --git a/packages/core/helper-plugin/src/content-manager/utils/tests/contentManagementUtilRemoveFieldsFromData.test.js b/packages/core/helper-plugin/src/content-manager/utils/tests/contentManagementUtilRemoveFieldsFromData.test.js index 9895cfea6b..1b19e78edb 100644 --- a/packages/core/helper-plugin/src/content-manager/utils/tests/contentManagementUtilRemoveFieldsFromData.test.js +++ b/packages/core/helper-plugin/src/content-manager/utils/tests/contentManagementUtilRemoveFieldsFromData.test.js @@ -1,6 +1,7 @@ -import testData from './testData'; import contentManagementUtilRemoveFieldsFromData from '../contentManagementUtilRemoveFieldsFromData'; +import testData from './testData'; + describe('STRAPI_HELPER_PLUGIN | utils', () => { describe('contentManagementUtilRemoveFieldsFromData', () => { it('should return an empty object', () => { diff --git a/packages/core/helper-plugin/src/content-manager/utils/tests/formatContentTypeData.test.js b/packages/core/helper-plugin/src/content-manager/utils/tests/formatContentTypeData.test.js index d78b048517..0a40652fe1 100644 --- a/packages/core/helper-plugin/src/content-manager/utils/tests/formatContentTypeData.test.js +++ b/packages/core/helper-plugin/src/content-manager/utils/tests/formatContentTypeData.test.js @@ -1,4 +1,5 @@ import formatContentTypeData from '../formatContentTypeData'; + import testData from './testData'; const { contentType, components, modifiedData } = testData; diff --git a/packages/core/helper-plugin/src/features/AppInfo.js b/packages/core/helper-plugin/src/features/AppInfo.js index ef010de231..540478067b 100644 --- a/packages/core/helper-plugin/src/features/AppInfo.js +++ b/packages/core/helper-plugin/src/features/AppInfo.js @@ -154,10 +154,10 @@ const AppInfosProvider = AppInfoProvider; const AppInfosContext = AppInfoContext; export { - AppInfoProvider, AppInfoContext, + AppInfoProvider, + AppInfosContext, + AppInfosProvider, useAppInfo, useAppInfos, - AppInfosProvider, - AppInfosContext, }; diff --git a/packages/core/helper-plugin/src/features/AutoReloadOverlayBlocker.js b/packages/core/helper-plugin/src/features/AutoReloadOverlayBlocker.js index 249744dcf8..c01f2236fe 100644 --- a/packages/core/helper-plugin/src/features/AutoReloadOverlayBlocker.js +++ b/packages/core/helper-plugin/src/features/AutoReloadOverlayBlocker.js @@ -1,12 +1,13 @@ import * as React from 'react'; -import PropTypes from 'prop-types'; -import styled, { keyframes } from 'styled-components'; -import { Flex, Box, Typography } from '@strapi/design-system'; -import { Refresh, Clock } from '@strapi/icons'; -import { useIntl } from 'react-intl'; -import { createPortal } from 'react-dom'; +import { Box, Flex, Typography } from '@strapi/design-system'; import { Link } from '@strapi/design-system/v2'; +import { Clock, Refresh } from '@strapi/icons'; +import PropTypes from 'prop-types'; +import { createPortal } from 'react-dom'; +import { useIntl } from 'react-intl'; +import styled, { keyframes } from 'styled-components'; + import pxToRem from '../utils/pxToRem'; /** diff --git a/packages/core/helper-plugin/src/features/CustomFields.js b/packages/core/helper-plugin/src/features/CustomFields.js index 842a5a2407..1f72f941bc 100644 --- a/packages/core/helper-plugin/src/features/CustomFields.js +++ b/packages/core/helper-plugin/src/features/CustomFields.js @@ -76,4 +76,4 @@ CustomFieldsProvider.propTypes = { */ const useCustomFields = () => React.useContext(CustomFieldsContext); -export { CustomFieldsProvider, useCustomFields, CustomFieldsContext }; +export { CustomFieldsContext, CustomFieldsProvider, useCustomFields }; diff --git a/packages/core/helper-plugin/src/features/GuidedTour.js b/packages/core/helper-plugin/src/features/GuidedTour.js index 3f90e367fa..562ce233b0 100644 --- a/packages/core/helper-plugin/src/features/GuidedTour.js +++ b/packages/core/helper-plugin/src/features/GuidedTour.js @@ -108,4 +108,4 @@ GuidedTourProvider.propTypes = { */ const useGuidedTour = () => React.useContext(GuidedTourContext); -export { GuidedTourProvider, useGuidedTour, GuidedTourContext }; +export { GuidedTourContext, GuidedTourProvider, useGuidedTour }; diff --git a/packages/core/helper-plugin/src/features/Library.js b/packages/core/helper-plugin/src/features/Library.js index dc49610010..d5fde40e85 100644 --- a/packages/core/helper-plugin/src/features/Library.js +++ b/packages/core/helper-plugin/src/features/Library.js @@ -45,4 +45,4 @@ LibraryProvider.propTypes = { */ const useLibrary = () => React.useContext(LibraryContext); -export { LibraryProvider, useLibrary, LibraryContext }; +export { LibraryContext, LibraryProvider, useLibrary }; diff --git a/packages/core/helper-plugin/src/features/Notifications.js b/packages/core/helper-plugin/src/features/Notifications.js index 73285922b1..e993202fdd 100644 --- a/packages/core/helper-plugin/src/features/Notifications.js +++ b/packages/core/helper-plugin/src/features/Notifications.js @@ -1,9 +1,10 @@ import * as React from 'react'; -import PropTypes from 'prop-types'; -import { useIntl } from 'react-intl'; import { Alert, Flex } from '@strapi/design-system'; import { Link } from '@strapi/design-system/v2'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; + import { useCallbackRef } from '../hooks/useCallbackRef'; /** @@ -302,4 +303,4 @@ Notification.propTypes = { */ const useNotification = () => React.useContext(NotificationsContext).toggleNotification; -export { NotificationsProvider, useNotification, NotificationsContext }; +export { NotificationsContext, NotificationsProvider, useNotification }; diff --git a/packages/core/helper-plugin/src/features/OverlayBlocker.js b/packages/core/helper-plugin/src/features/OverlayBlocker.js index 3032ff0ba3..236f063b6d 100644 --- a/packages/core/helper-plugin/src/features/OverlayBlocker.js +++ b/packages/core/helper-plugin/src/features/OverlayBlocker.js @@ -1,10 +1,10 @@ /* eslint-disable no-undef */ import * as React from 'react'; -import PropTypes from 'prop-types'; -import styled from 'styled-components'; import { Box } from '@strapi/design-system'; +import PropTypes from 'prop-types'; import { createPortal } from 'react-dom'; +import styled from 'styled-components'; /* ------------------------------------------------------------------------------------------------- * Context @@ -74,4 +74,4 @@ const Overlay = styled(Box)` */ const useOverlayBlocker = () => React.useContext(OverlayBlockerContext); -export { OverlayBlockerProvider, useOverlayBlocker, OverlayBlockerContext }; +export { OverlayBlockerContext, OverlayBlockerProvider, useOverlayBlocker }; diff --git a/packages/core/helper-plugin/src/features/StrapiApp.js b/packages/core/helper-plugin/src/features/StrapiApp.js index 413d6ad896..092f84d19e 100644 --- a/packages/core/helper-plugin/src/features/StrapiApp.js +++ b/packages/core/helper-plugin/src/features/StrapiApp.js @@ -103,4 +103,4 @@ StrapiAppProvider.propTypes = { */ const useStrapiApp = () => React.useContext(StrapiAppContext); -export { StrapiAppProvider, useStrapiApp, StrapiAppContext }; +export { StrapiAppContext, StrapiAppProvider, useStrapiApp }; diff --git a/packages/core/helper-plugin/src/features/Tracking.js b/packages/core/helper-plugin/src/features/Tracking.js index d74cc72783..479868c725 100644 --- a/packages/core/helper-plugin/src/features/Tracking.js +++ b/packages/core/helper-plugin/src/features/Tracking.js @@ -140,4 +140,4 @@ const useTracking = () => { return { trackUsage }; }; -export { TrackingProvider, useTracking, TrackingContext }; +export { TrackingContext, TrackingProvider, useTracking }; diff --git a/packages/core/helper-plugin/src/features/tests/Notifications.test.js b/packages/core/helper-plugin/src/features/tests/Notifications.test.js index e8f488f35e..cbfc03044d 100644 --- a/packages/core/helper-plugin/src/features/tests/Notifications.test.js +++ b/packages/core/helper-plugin/src/features/tests/Notifications.test.js @@ -1,8 +1,10 @@ import React from 'react'; -import { render as renderRTL, act } from '@testing-library/react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { act, render as renderRTL } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { IntlProvider } from 'react-intl'; -import { lightTheme, ThemeProvider } from '@strapi/design-system'; + import { NotificationsProvider, useNotification } from '../Notifications'; const defaultNotificationConfig = { diff --git a/packages/core/helper-plugin/src/features/tests/Tracking.test.js b/packages/core/helper-plugin/src/features/tests/Tracking.test.js index 49d200b5aa..60302c4b54 100644 --- a/packages/core/helper-plugin/src/features/tests/Tracking.test.js +++ b/packages/core/helper-plugin/src/features/tests/Tracking.test.js @@ -1,9 +1,10 @@ import React from 'react'; + import { renderHook } from '@testing-library/react'; import axios from 'axios'; import { useAppInfo } from '../AppInfo'; -import { useTracking, TrackingProvider } from '../Tracking'; +import { TrackingProvider, useTracking } from '../Tracking'; jest.mock('../AppInfo'); diff --git a/packages/core/helper-plugin/src/hooks/useAPIErrorHandler/tests/useAPIErrorHandler.test.js b/packages/core/helper-plugin/src/hooks/useAPIErrorHandler/tests/useAPIErrorHandler.test.js index 37e422248d..73a905cdea 100644 --- a/packages/core/helper-plugin/src/hooks/useAPIErrorHandler/tests/useAPIErrorHandler.test.js +++ b/packages/core/helper-plugin/src/hooks/useAPIErrorHandler/tests/useAPIErrorHandler.test.js @@ -1,6 +1,6 @@ -import { renderHook, act } from '@testing-library/react'; -import { useIntl } from 'react-intl'; +import { act, renderHook } from '@testing-library/react'; import { AxiosError } from 'axios'; +import { useIntl } from 'react-intl'; import { useAPIErrorHandler } from '../useAPIErrorHandler'; diff --git a/packages/core/helper-plugin/src/hooks/useAPIErrorHandler/useAPIErrorHandler.js b/packages/core/helper-plugin/src/hooks/useAPIErrorHandler/useAPIErrorHandler.js index cc7f4eedef..461242913b 100644 --- a/packages/core/helper-plugin/src/hooks/useAPIErrorHandler/useAPIErrorHandler.js +++ b/packages/core/helper-plugin/src/hooks/useAPIErrorHandler/useAPIErrorHandler.js @@ -1,5 +1,5 @@ -import { useIntl } from 'react-intl'; import { AxiosError } from 'axios'; +import { useIntl } from 'react-intl'; import { formatAPIError } from './utils/formatAPIError'; import { formatAxiosError } from './utils/formatAxiosError'; diff --git a/packages/core/helper-plugin/src/hooks/useFetchClient/index.js b/packages/core/helper-plugin/src/hooks/useFetchClient/index.js index ba01844942..ff81abffc6 100644 --- a/packages/core/helper-plugin/src/hooks/useFetchClient/index.js +++ b/packages/core/helper-plugin/src/hooks/useFetchClient/index.js @@ -3,7 +3,8 @@ * useFetchClient * */ -import { useEffect, useRef, useMemo } from 'react'; +import { useEffect, useMemo, useRef } from 'react'; + import getFetchClient from '../../utils/getFetchClient'; const useFetchClient = () => { diff --git a/packages/core/helper-plugin/src/hooks/useFetchClient/tests/useFetchClient.test.js b/packages/core/helper-plugin/src/hooks/useFetchClient/tests/useFetchClient.test.js index cafe56ef8c..794d3a4963 100644 --- a/packages/core/helper-plugin/src/hooks/useFetchClient/tests/useFetchClient.test.js +++ b/packages/core/helper-plugin/src/hooks/useFetchClient/tests/useFetchClient.test.js @@ -1,6 +1,7 @@ import React, { useEffect } from 'react'; -import { render } from '@testing-library/react'; + import { useFetchClient } from '@strapi/helper-plugin'; +import { render } from '@testing-library/react'; jest.mock('@strapi/helper-plugin', () => ({ ...jest.requireActual('@strapi/helper-plugin'), diff --git a/packages/core/helper-plugin/src/hooks/useFieldHint/index.js b/packages/core/helper-plugin/src/hooks/useFieldHint/index.js index a5db9e2b9d..8273b3bcc7 100644 --- a/packages/core/helper-plugin/src/hooks/useFieldHint/index.js +++ b/packages/core/helper-plugin/src/hooks/useFieldHint/index.js @@ -1,5 +1,7 @@ import React from 'react'; + import { useIntl } from 'react-intl'; + import { getFieldUnits, getMinMax } from './utils'; /** diff --git a/packages/core/helper-plugin/src/hooks/useFieldHint/tests/useFieldHint.test.js b/packages/core/helper-plugin/src/hooks/useFieldHint/tests/useFieldHint.test.js index 374974a01b..09d6ce5e6f 100644 --- a/packages/core/helper-plugin/src/hooks/useFieldHint/tests/useFieldHint.test.js +++ b/packages/core/helper-plugin/src/hooks/useFieldHint/tests/useFieldHint.test.js @@ -1,5 +1,6 @@ import React from 'react'; -import { renderHook, act } from '@testing-library/react'; + +import { act, renderHook } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; import useFieldHint from '../index'; diff --git a/packages/core/helper-plugin/src/hooks/useFormattedMessage/index.js b/packages/core/helper-plugin/src/hooks/useFormattedMessage/index.js index a41ec9a8e5..0ce13056df 100644 --- a/packages/core/helper-plugin/src/hooks/useFormattedMessage/index.js +++ b/packages/core/helper-plugin/src/hooks/useFormattedMessage/index.js @@ -1,5 +1,5 @@ -import { useIntl } from 'react-intl'; import isObject from 'lodash/isObject'; +import { useIntl } from 'react-intl'; const useFormattedMessage = (message) => { const { formatMessage } = useIntl(); diff --git a/packages/core/helper-plugin/src/hooks/usePersistentState/index.js b/packages/core/helper-plugin/src/hooks/usePersistentState/index.js index 8bab4e60b0..c4d588e02d 100644 --- a/packages/core/helper-plugin/src/hooks/usePersistentState/index.js +++ b/packages/core/helper-plugin/src/hooks/usePersistentState/index.js @@ -1,4 +1,4 @@ -import { useState, useEffect } from 'react'; +import { useEffect, useState } from 'react'; const usePersistentState = (key, defaultValue) => { const [value, setValue] = useState(() => { diff --git a/packages/core/helper-plugin/src/hooks/useQueryParams/index.js b/packages/core/helper-plugin/src/hooks/useQueryParams/index.js index 50dd606681..6a096bdc60 100644 --- a/packages/core/helper-plugin/src/hooks/useQueryParams/index.js +++ b/packages/core/helper-plugin/src/hooks/useQueryParams/index.js @@ -1,6 +1,7 @@ import { useCallback, useMemo } from 'react'; -import { useHistory, useLocation } from 'react-router-dom'; + import { parse, stringify } from 'qs'; +import { useHistory, useLocation } from 'react-router-dom'; const useQueryParams = (initialParams) => { const { search } = useLocation(); diff --git a/packages/core/helper-plugin/src/hooks/useRBAC/index.js b/packages/core/helper-plugin/src/hooks/useRBAC/index.js index 6dd26b2483..4b23855f8d 100644 --- a/packages/core/helper-plugin/src/hooks/useRBAC/index.js +++ b/packages/core/helper-plugin/src/hooks/useRBAC/index.js @@ -1,10 +1,11 @@ import { useCallback, useEffect, useMemo, useReducer, useRef } from 'react'; + +import { useRBACProvider } from '../../features/RBAC'; import hasPermissions from '../../utils/hasPermissions'; -import generateResultsObject from './utils/generateResultsObject'; -import reducer from './reducer'; import init from './init'; -import { useRBACProvider } from '../../features/RBAC'; +import reducer from './reducer'; +import generateResultsObject from './utils/generateResultsObject'; const useRBAC = (pluginPermissions, permissions) => { const abortController = new AbortController(); diff --git a/packages/core/helper-plugin/src/hooks/useRBAC/reducer.js b/packages/core/helper-plugin/src/hooks/useRBAC/reducer.js index d8099acaa1..11c5571149 100644 --- a/packages/core/helper-plugin/src/hooks/useRBAC/reducer.js +++ b/packages/core/helper-plugin/src/hooks/useRBAC/reducer.js @@ -1,4 +1,5 @@ import produce from 'immer'; + import generateAllowedActions from './utils/generateAllowedActions'; const initialState = { diff --git a/packages/core/helper-plugin/src/hooks/useSelectionState/tests/useSelectionState.test.js b/packages/core/helper-plugin/src/hooks/useSelectionState/tests/useSelectionState.test.js index d5830167fb..6430453bbb 100644 --- a/packages/core/helper-plugin/src/hooks/useSelectionState/tests/useSelectionState.test.js +++ b/packages/core/helper-plugin/src/hooks/useSelectionState/tests/useSelectionState.test.js @@ -1,4 +1,4 @@ -import { renderHook, act } from '@testing-library/react'; +import { act, renderHook } from '@testing-library/react'; import { useSelectionState } from '../index'; diff --git a/packages/core/helper-plugin/src/icons/RemoveRoundedButton/index.js b/packages/core/helper-plugin/src/icons/RemoveRoundedButton/index.js index 37b3551d16..0b25147e2d 100644 --- a/packages/core/helper-plugin/src/icons/RemoveRoundedButton/index.js +++ b/packages/core/helper-plugin/src/icons/RemoveRoundedButton/index.js @@ -1,7 +1,9 @@ import React from 'react'; + import { IconButton } from '@strapi/design-system'; import { Minus } from '@strapi/icons'; import styled from 'styled-components'; + import pxToRem from '../../utils/pxToRem'; const StyledIconButton = styled(IconButton)( diff --git a/packages/core/helper-plugin/src/icons/SortIcon/index.js b/packages/core/helper-plugin/src/icons/SortIcon/index.js index 908ab84244..93afd24c8f 100644 --- a/packages/core/helper-plugin/src/icons/SortIcon/index.js +++ b/packages/core/helper-plugin/src/icons/SortIcon/index.js @@ -1,6 +1,6 @@ -import styled from 'styled-components'; import { CarretDown } from '@strapi/icons'; import PropTypes from 'prop-types'; +import styled from 'styled-components'; const transientProps = { isUp: true, diff --git a/packages/core/helper-plugin/src/index.js b/packages/core/helper-plugin/src/index.js index d8042ac0c0..e175e5416f 100644 --- a/packages/core/helper-plugin/src/index.js +++ b/packages/core/helper-plugin/src/index.js @@ -1,37 +1,37 @@ -import { getType, getOtherInfos } from './content-manager/utils/getAttributeInfos'; +import { getOtherInfos, getType } from './content-manager/utils/getAttributeInfos'; /* ------------------------------------------------------------------------------------------------- * Components * -----------------------------------------------------------------------------------------------*/ +export { default as AnErrorOccurred } from './components/AnErrorOccurred'; export { default as CheckPagePermissions } from './components/CheckPagePermissions'; export { default as CheckPermissions } from './components/CheckPermissions'; export { default as ConfirmDialog } from './components/ConfirmDialog'; export { default as ContentBox } from './components/ContentBox'; +export { default as DateTimePicker } from './components/DateTimePicker'; export { default as DynamicTable } from './components/DynamicTable'; -export { default as EmptyStateLayout } from './components/EmptyStateLayout'; -export { default as NoContent } from './components/NoContent'; -export { default as NoMedia } from './components/NoMedia'; -export { default as NoPermissions } from './components/NoPermissions'; -export { default as AnErrorOccurred } from './components/AnErrorOccurred'; export { default as EmptyBodyTable } from './components/EmptyBodyTable'; -export { default as GenericInput } from './components/GenericInput'; -export * from './components/InjectionZone'; -export { default as LoadingIndicatorPage } from './components/LoadingIndicatorPage'; -export { default as NotAllowedInput } from './components/NotAllowedInput'; -export { default as SettingsPageTitle } from './components/SettingsPageTitle'; -export { default as SearchURLQuery } from './components/SearchURLQuery'; -export { default as Status } from './components/Status'; +export { default as EmptyStateLayout } from './components/EmptyStateLayout'; export { default as FilterListURLQuery } from './components/FilterListURLQuery'; export { default as FilterPopoverURLQuery } from './components/FilterPopoverURLQuery'; export { default as Form } from './components/Form'; -export { default as PaginationURLQuery } from './components/PaginationURLQuery'; -export { default as PageSizeURLQuery } from './components/PageSizeURLQuery'; -export { default as RelativeTime } from './components/RelativeTime'; -export { default as DateTimePicker } from './components/DateTimePicker'; -export { default as ReactSelect } from './components/ReactSelect'; +export { default as GenericInput } from './components/GenericInput'; +export * from './components/InjectionZone'; export { default as Link } from './components/Link'; export { default as LinkButton } from './components/LinkButton'; +export { default as LoadingIndicatorPage } from './components/LoadingIndicatorPage'; +export { default as NoContent } from './components/NoContent'; +export { default as NoMedia } from './components/NoMedia'; +export { default as NoPermissions } from './components/NoPermissions'; +export { default as NotAllowedInput } from './components/NotAllowedInput'; +export { default as PageSizeURLQuery } from './components/PageSizeURLQuery'; +export { default as PaginationURLQuery } from './components/PaginationURLQuery'; +export { default as ReactSelect } from './components/ReactSelect'; +export { default as RelativeTime } from './components/RelativeTime'; +export { default as SearchURLQuery } from './components/SearchURLQuery'; +export { default as SettingsPageTitle } from './components/SettingsPageTitle'; +export { default as Status } from './components/Status'; /* ------------------------------------------------------------------------------------------------- * Content Manager @@ -51,8 +51,8 @@ export * from './features/AutoReloadOverlayBlocker'; export * from './features/CustomFields'; export * from './features/GuidedTour'; export * from './features/Library'; -export * from './features/OverlayBlocker'; export * from './features/Notifications'; +export * from './features/OverlayBlocker'; export * from './features/RBAC'; export * from './features/StrapiApp'; export * from './features/Tracking'; @@ -61,50 +61,47 @@ export * from './features/Tracking'; * Hooks * -----------------------------------------------------------------------------------------------*/ -export { default as useQuery } from './hooks/useQuery'; -export { useSelectionState } from './hooks/useSelectionState'; export * from './hooks/useAPIErrorHandler'; -export { useFilter } from './hooks/useFilter'; -export { useCollator } from './hooks/useCollator'; export { useCallbackRef } from './hooks/useCallbackRef'; export { useClipboard } from './hooks/useClipboard'; - -export { default as useQueryParams } from './hooks/useQueryParams'; -export { default as useRBAC } from './hooks/useRBAC'; -export { default as usePersistentState } from './hooks/usePersistentState'; +export { useCollator } from './hooks/useCollator'; +export { default as useFetchClient } from './hooks/useFetchClient'; +export { useFilter } from './hooks/useFilter'; export { default as useFocusWhenNavigate } from './hooks/useFocusWhenNavigate'; export { default as useLockScroll } from './hooks/useLockScroll'; -export { default as useFetchClient } from './hooks/useFetchClient'; +export { default as usePersistentState } from './hooks/usePersistentState'; +export { default as useQuery } from './hooks/useQuery'; +export { default as useQueryParams } from './hooks/useQueryParams'; +export { default as useRBAC } from './hooks/useRBAC'; +export { useSelectionState } from './hooks/useSelectionState'; /* ------------------------------------------------------------------------------------------------- * Icons * -----------------------------------------------------------------------------------------------*/ -export { default as SortIcon } from './icons/SortIcon'; export { default as RemoveRoundedButton } from './icons/RemoveRoundedButton'; +export { default as SortIcon } from './icons/SortIcon'; /* ------------------------------------------------------------------------------------------------- * Utils * -----------------------------------------------------------------------------------------------*/ +export { default as contentManagementUtilRemoveFieldsFromData } from './content-manager/utils/contentManagementUtilRemoveFieldsFromData'; +export { default as formatContentTypeData } from './content-manager/utils/formatContentTypeData'; export { default as auth } from './utils/auth'; +export { default as to } from './utils/await-to-js'; +export { default as difference } from './utils/difference'; +export { default as getAPIInnerErrors } from './utils/getAPIInnerErrors'; +export { default as getFetchClient } from './utils/getFetchClient'; +export { default as getFileExtension } from './utils/getFileExtension/getFileExtension'; +export { default as getYupInnerErrors } from './utils/getYupInnerErrors'; export { default as hasPermissions } from './utils/hasPermissions'; +export { findMatchingPermissions } from './utils/hasPermissions'; export { default as prefixFileUrlWithBackendUrl } from './utils/prefixFileUrlWithBackendUrl/prefixFileUrlWithBackendUrl'; export { default as prefixPluginTranslations } from './utils/prefixPluginTranslations'; export { default as pxToRem } from './utils/pxToRem'; -export { default as to } from './utils/await-to-js'; -export { default as setHexOpacity } from './utils/setHexOpacity'; -export { default as translatedErrors } from './utils/translatedErrors'; -export { default as formatContentTypeData } from './content-manager/utils/formatContentTypeData'; -export { findMatchingPermissions } from './utils/hasPermissions'; -export { default as contentManagementUtilRemoveFieldsFromData } from './content-manager/utils/contentManagementUtilRemoveFieldsFromData'; -export { default as getFileExtension } from './utils/getFileExtension/getFileExtension'; -export * from './utils/stopPropagation'; -export { default as difference } from './utils/difference'; -export { default as wrapAxiosInstance } from './utils/wrapAxiosInstance'; - export { default as request } from './utils/request'; -export { default as getAPIInnerErrors } from './utils/getAPIInnerErrors'; -export { default as getYupInnerErrors } from './utils/getYupInnerErrors'; - -export { default as getFetchClient } from './utils/getFetchClient'; +export { default as setHexOpacity } from './utils/setHexOpacity'; +export * from './utils/stopPropagation'; +export { default as translatedErrors } from './utils/translatedErrors'; +export { default as wrapAxiosInstance } from './utils/wrapAxiosInstance'; diff --git a/packages/core/helper-plugin/webpack.config.js b/packages/core/helper-plugin/webpack.config.js index a0420f37cb..680d54bb85 100644 --- a/packages/core/helper-plugin/webpack.config.js +++ b/packages/core/helper-plugin/webpack.config.js @@ -1,6 +1,6 @@ -const webpack = require('webpack'); -const { ESBuildMinifyPlugin } = require('esbuild-loader'); const browserslistToEsbuild = require('browserslist-to-esbuild'); +const { ESBuildMinifyPlugin } = require('esbuild-loader'); +const webpack = require('webpack'); const packageJson = require('./package.json'); diff --git a/packages/core/upload/admin/src/components/AssetCard/AssetCard.js b/packages/core/upload/admin/src/components/AssetCard/AssetCard.js index 77fb534497..b2f61c9429 100644 --- a/packages/core/upload/admin/src/components/AssetCard/AssetCard.js +++ b/packages/core/upload/admin/src/components/AssetCard/AssetCard.js @@ -1,12 +1,15 @@ import React from 'react'; + +import { getFileExtension, prefixFileUrlWithBackendUrl } from '@strapi/helper-plugin'; import PropTypes from 'prop-types'; -import { prefixFileUrlWithBackendUrl, getFileExtension } from '@strapi/helper-plugin'; + +import { AssetDefinition, AssetType } from '../../constants'; +import { createAssetUrl } from '../../utils'; + +import { AudioAssetCard } from './AudioAssetCard'; +import { DocAssetCard } from './DocAssetCard'; import { ImageAssetCard } from './ImageAssetCard'; import { VideoAssetCard } from './VideoAssetCard'; -import { DocAssetCard } from './DocAssetCard'; -import { AudioAssetCard } from './AudioAssetCard'; -import { AssetType, AssetDefinition } from '../../constants'; -import { createAssetUrl } from '../../utils'; export const AssetCard = ({ asset, isSelected, onSelect, onEdit, onRemove, size, local }) => { const handleSelect = onSelect ? () => onSelect(asset) : undefined; diff --git a/packages/core/upload/admin/src/components/AssetCard/AssetCardBase.js b/packages/core/upload/admin/src/components/AssetCard/AssetCardBase.js index 2a8f5a6961..1d22e9a92f 100644 --- a/packages/core/upload/admin/src/components/AssetCard/AssetCardBase.js +++ b/packages/core/upload/admin/src/components/AssetCard/AssetCardBase.js @@ -1,6 +1,5 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import styled from 'styled-components'; + import { Box, Card, @@ -10,13 +9,15 @@ import { CardCheckbox, CardContent, CardHeader, - CardTitle, CardSubtitle, + CardTitle, Flex, IconButton, } from '@strapi/design-system'; import { Pencil, Trash } from '@strapi/icons'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; +import styled from 'styled-components'; import { getTrad } from '../../utils'; diff --git a/packages/core/upload/admin/src/components/AssetCard/AudioAssetCard.js b/packages/core/upload/admin/src/components/AssetCard/AudioAssetCard.js index 2282c60a68..df6333c0be 100644 --- a/packages/core/upload/admin/src/components/AssetCard/AudioAssetCard.js +++ b/packages/core/upload/admin/src/components/AssetCard/AudioAssetCard.js @@ -1,10 +1,11 @@ import React from 'react'; + +import { Box, CardAsset } from '@strapi/design-system'; import PropTypes from 'prop-types'; import styled from 'styled-components'; -import { CardAsset, Box } from '@strapi/design-system'; -import { AudioPreview } from './AudioPreview'; import { AssetCardBase } from './AssetCardBase'; +import { AudioPreview } from './AudioPreview'; const AudioPreviewWrapper = styled(Box)` canvas, diff --git a/packages/core/upload/admin/src/components/AssetCard/AudioPreview.js b/packages/core/upload/admin/src/components/AssetCard/AudioPreview.js index 1feee76a32..4a89e0be14 100644 --- a/packages/core/upload/admin/src/components/AssetCard/AudioPreview.js +++ b/packages/core/upload/admin/src/components/AssetCard/AudioPreview.js @@ -1,7 +1,8 @@ /* eslint-disable jsx-a11y/media-has-caption */ import React from 'react'; -import PropTypes from 'prop-types'; + import { Box } from '@strapi/design-system'; +import PropTypes from 'prop-types'; export const AudioPreview = ({ url, alt }) => { return ( diff --git a/packages/core/upload/admin/src/components/AssetCard/DocAssetCard.js b/packages/core/upload/admin/src/components/AssetCard/DocAssetCard.js index c72efec16f..5e8a52d8bb 100644 --- a/packages/core/upload/admin/src/components/AssetCard/DocAssetCard.js +++ b/packages/core/upload/admin/src/components/AssetCard/DocAssetCard.js @@ -1,9 +1,10 @@ import React from 'react'; + +import { Flex } from '@strapi/design-system'; +import { pxToRem } from '@strapi/helper-plugin'; +import { File, FilePdf } from '@strapi/icons'; import PropTypes from 'prop-types'; import styled from 'styled-components'; -import { Flex } from '@strapi/design-system'; -import { File, FilePdf } from '@strapi/icons'; -import { pxToRem } from '@strapi/helper-plugin'; import { AssetCardBase } from './AssetCardBase'; diff --git a/packages/core/upload/admin/src/components/AssetCard/ImageAssetCard.js b/packages/core/upload/admin/src/components/AssetCard/ImageAssetCard.js index 63aa8a754d..98d86672fb 100644 --- a/packages/core/upload/admin/src/components/AssetCard/ImageAssetCard.js +++ b/packages/core/upload/admin/src/components/AssetCard/ImageAssetCard.js @@ -1,6 +1,7 @@ import React from 'react'; -import PropTypes from 'prop-types'; + import { CardAsset } from '@strapi/design-system'; +import PropTypes from 'prop-types'; import { AssetCardBase } from './AssetCardBase'; diff --git a/packages/core/upload/admin/src/components/AssetCard/UploadingAssetCard.js b/packages/core/upload/admin/src/components/AssetCard/UploadingAssetCard.js index 4ee9737c2c..4f033cf874 100644 --- a/packages/core/upload/admin/src/components/AssetCard/UploadingAssetCard.js +++ b/packages/core/upload/admin/src/components/AssetCard/UploadingAssetCard.js @@ -1,24 +1,24 @@ import React, { useEffect } from 'react'; -import PropTypes from 'prop-types'; -import styled from 'styled-components'; -import { useIntl } from 'react-intl'; import { + Box, Card, + CardBadge, CardBody, CardContent, CardHeader, - CardTitle, CardSubtitle, - CardBadge, - Typography, - Box, + CardTitle, Flex, + Typography, } from '@strapi/design-system'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import styled from 'styled-components'; -import { getTrad } from '../../utils'; import { AssetType } from '../../constants'; import { useUpload } from '../../hooks/useUpload'; +import { getTrad } from '../../utils'; import { UploadProgress } from '../UploadProgress'; const UploadProgressWrapper = styled.div` diff --git a/packages/core/upload/admin/src/components/AssetCard/VideoAssetCard.js b/packages/core/upload/admin/src/components/AssetCard/VideoAssetCard.js index fc52b9195b..ec66ff9540 100644 --- a/packages/core/upload/admin/src/components/AssetCard/VideoAssetCard.js +++ b/packages/core/upload/admin/src/components/AssetCard/VideoAssetCard.js @@ -1,13 +1,14 @@ import React, { useState } from 'react'; + +import { Box, CardAsset, CardTimer } from '@strapi/design-system'; import PropTypes from 'prop-types'; import styled from 'styled-components'; -import { CardAsset, CardTimer, Box } from '@strapi/design-system'; - -import { VideoPreview } from './VideoPreview'; -import { AssetCardBase } from './AssetCardBase'; import { formatDuration } from '../../utils'; +import { AssetCardBase } from './AssetCardBase'; +import { VideoPreview } from './VideoPreview'; + const VideoPreviewWrapper = styled(Box)` canvas, video { diff --git a/packages/core/upload/admin/src/components/AssetCard/VideoPreview.js b/packages/core/upload/admin/src/components/AssetCard/VideoPreview.js index 9e6840038d..420197bcf5 100644 --- a/packages/core/upload/admin/src/components/AssetCard/VideoPreview.js +++ b/packages/core/upload/admin/src/components/AssetCard/VideoPreview.js @@ -1,7 +1,8 @@ /* eslint-disable jsx-a11y/media-has-caption */ import React from 'react'; -import PropTypes from 'prop-types'; + import { Box, VisuallyHidden } from '@strapi/design-system'; +import PropTypes from 'prop-types'; // According to MDN // https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/readyState#value diff --git a/packages/core/upload/admin/src/components/AssetCard/tests/AssetCardBase.test.js b/packages/core/upload/admin/src/components/AssetCard/tests/AssetCardBase.test.js index 70e6ce95a1..d514b67009 100644 --- a/packages/core/upload/admin/src/components/AssetCard/tests/AssetCardBase.test.js +++ b/packages/core/upload/admin/src/components/AssetCard/tests/AssetCardBase.test.js @@ -1,5 +1,6 @@ import React from 'react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render as renderRTL, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { IntlProvider } from 'react-intl'; diff --git a/packages/core/upload/admin/src/components/AssetCard/tests/DocAssetCard.test.js b/packages/core/upload/admin/src/components/AssetCard/tests/DocAssetCard.test.js index 1a6d1d8476..a9b9d9add8 100644 --- a/packages/core/upload/admin/src/components/AssetCard/tests/DocAssetCard.test.js +++ b/packages/core/upload/admin/src/components/AssetCard/tests/DocAssetCard.test.js @@ -1,8 +1,10 @@ import React from 'react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render as renderTL } from '@testing-library/react'; -import { DocAssetCard } from '../DocAssetCard'; + import en from '../../../translations/en.json'; +import { DocAssetCard } from '../DocAssetCard'; jest.mock('../../../utils', () => ({ ...jest.requireActual('../../../utils'), diff --git a/packages/core/upload/admin/src/components/AssetCard/tests/ImageAssetCard.test.js b/packages/core/upload/admin/src/components/AssetCard/tests/ImageAssetCard.test.js index bcbb423828..d779498382 100644 --- a/packages/core/upload/admin/src/components/AssetCard/tests/ImageAssetCard.test.js +++ b/packages/core/upload/admin/src/components/AssetCard/tests/ImageAssetCard.test.js @@ -1,8 +1,10 @@ import React from 'react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render as renderTL } from '@testing-library/react'; -import { ImageAssetCard } from '../ImageAssetCard'; + import en from '../../../translations/en.json'; +import { ImageAssetCard } from '../ImageAssetCard'; jest.mock('../../../utils', () => ({ ...jest.requireActual('../../../utils'), diff --git a/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/Filters.js b/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/Filters.js index aa664dd6bb..83a93b476c 100644 --- a/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/Filters.js +++ b/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/Filters.js @@ -1,11 +1,13 @@ -import React, { useState, useRef } from 'react'; -import PropTypes from 'prop-types'; +import React, { useRef, useState } from 'react'; + import { Button } from '@strapi/design-system'; import { Filter } from '@strapi/icons'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; + +import displayedFilters from '../../../utils/displayedFilters'; import FilterList from '../../FilterList'; import FilterPopover from '../../FilterPopover'; -import displayedFilters from '../../../utils/displayedFilters'; export const Filters = ({ appliedFilters, onChangeFilters }) => { const buttonRef = useRef(null); diff --git a/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/PageSize.js b/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/PageSize.js index 79799d6f5e..ebf922334f 100644 --- a/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/PageSize.js +++ b/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/PageSize.js @@ -5,9 +5,10 @@ */ import React from 'react'; -import { useIntl } from 'react-intl'; -import { Box, Flex, Select, Option, Typography } from '@strapi/design-system'; + +import { Box, Flex, Option, Select, Typography } from '@strapi/design-system'; import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; const PageSize = ({ onChangePageSize, pageSize }) => { const { formatMessage } = useIntl(); diff --git a/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/PaginationFooter/Pagination.js b/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/PaginationFooter/Pagination.js index 352020d403..1adfbbbac4 100644 --- a/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/PaginationFooter/Pagination.js +++ b/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/PaginationFooter/Pagination.js @@ -1,6 +1,8 @@ import React, { useMemo } from 'react'; -import PropTypes from 'prop-types'; + import { Box, Flex } from '@strapi/design-system'; +import PropTypes from 'prop-types'; + import { PaginationContext } from './PaginationContext'; export const Pagination = ({ children, label, activePage, pageCount }) => { diff --git a/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/PaginationFooter/components.js b/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/PaginationFooter/components.js index 22e3b766e6..1e24c6846b 100644 --- a/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/PaginationFooter/components.js +++ b/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/PaginationFooter/components.js @@ -1,8 +1,10 @@ import React from 'react'; -import styled from 'styled-components'; -import PropTypes from 'prop-types'; + +import { buttonFocusStyle, Typography, VisuallyHidden } from '@strapi/design-system'; import { ChevronLeft, ChevronRight } from '@strapi/icons'; -import { Typography, buttonFocusStyle, VisuallyHidden } from '@strapi/design-system'; +import PropTypes from 'prop-types'; +import styled from 'styled-components'; + import { usePagination } from './PaginationContext'; const PaginationText = styled(Typography)` diff --git a/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/PaginationFooter/index.js b/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/PaginationFooter/index.js index f9026ada56..340dc9fb50 100644 --- a/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/PaginationFooter/index.js +++ b/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/PaginationFooter/index.js @@ -12,10 +12,12 @@ * 1, ... 6, `7`, 8, 9, 10 */ import React from 'react'; + import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; + +import { Dots, NextLink, PageLink, PreviousLink } from './components'; import { Pagination } from './Pagination'; -import { PreviousLink, NextLink, PageLink, Dots } from './components'; const PaginationFooter = ({ activePage, onChangePage, pagination: { pageCount } }) => { const { formatMessage } = useIntl(); diff --git a/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/SearchAsset/index.js b/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/SearchAsset/index.js index 217103f805..1355b5672b 100644 --- a/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/SearchAsset/index.js +++ b/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/SearchAsset/index.js @@ -1,9 +1,11 @@ -import React, { useState, useLayoutEffect, useRef } from 'react'; +import React, { useLayoutEffect, useRef, useState } from 'react'; + +import { IconButton, Searchbar, SearchForm } from '@strapi/design-system'; +import { useTracking } from '@strapi/helper-plugin'; +import { Search } from '@strapi/icons'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { useTracking } from '@strapi/helper-plugin'; -import { Searchbar, SearchForm, IconButton } from '@strapi/design-system'; -import { Search } from '@strapi/icons'; + import getTrad from '../../../../utils/getTrad'; const SearchAsset = ({ onChangeSearch, queryValue }) => { diff --git a/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/SearchAsset/tests/index.test.js b/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/SearchAsset/tests/index.test.js index 2bffb4aceb..b86ada803c 100644 --- a/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/SearchAsset/tests/index.test.js +++ b/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/SearchAsset/tests/index.test.js @@ -5,9 +5,11 @@ */ import React from 'react'; -import { render, fireEvent } from '@testing-library/react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { fireEvent, render } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; + import SearchAsset from '../index'; const handleChange = jest.fn(); diff --git a/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/index.js b/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/index.js index 8d0d8f0dbd..9759b5e2a7 100644 --- a/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/index.js +++ b/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/index.js @@ -1,42 +1,43 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import styled from 'styled-components'; -import { useIntl } from 'react-intl'; -import { usePersistentState } from '@strapi/helper-plugin'; import { - Button, - Flex, - Box, - Divider, BaseCheckbox, + Box, + Button, + Divider, + Flex, GridItem, - Typography, IconButton, + Typography, VisuallyHidden, } from '@strapi/design-system'; -import { Pencil, Plus, Grid, List } from '@strapi/icons'; +import { usePersistentState } from '@strapi/helper-plugin'; +import { Grid, List, Pencil, Plus } from '@strapi/icons'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import styled from 'styled-components'; import { - FolderDefinition, AssetDefinition, - viewOptions, + FolderDefinition, localStorageKeys, + viewOptions, } from '../../../constants'; -import getTrad from '../../../utils/getTrad'; +import { useFolder } from '../../../hooks/useFolder'; import { getBreadcrumbDataCM, toSingularTypes } from '../../../utils'; import getAllowedFiles from '../../../utils/getAllowedFiles'; +import getTrad from '../../../utils/getTrad'; import { AssetGridList } from '../../AssetGridList'; -import { TableList } from '../../TableList'; -import { FolderGridList } from '../../FolderGridList'; -import { EmptyAssets } from '../../EmptyAssets'; import { Breadcrumbs } from '../../Breadcrumbs'; -import SortPicker from '../../SortPicker'; -import { useFolder } from '../../../hooks/useFolder'; +import { EmptyAssets } from '../../EmptyAssets'; import { FolderCard, FolderCardBody, FolderCardBodyAction } from '../../FolderCard'; +import { FolderGridList } from '../../FolderGridList'; +import SortPicker from '../../SortPicker'; +import { TableList } from '../../TableList'; + import { Filters } from './Filters'; -import PaginationFooter from './PaginationFooter'; import PageSize from './PageSize'; +import PaginationFooter from './PaginationFooter'; import SearchAsset from './SearchAsset'; import { isSelectable } from './utils/isSelectable'; diff --git a/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/tests/index.test.js b/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/tests/index.test.js index bd77f62ce9..19af0b1978 100644 --- a/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/tests/index.test.js +++ b/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/tests/index.test.js @@ -1,14 +1,15 @@ import React from 'react'; -import { IntlProvider } from 'react-intl'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import { render, fireEvent, screen } from '@testing-library/react'; -import { NotificationsProvider, usePersistentState } from '@strapi/helper-plugin'; -import { MemoryRouter } from 'react-router-dom'; -import { QueryClientProvider, QueryClient } from 'react-query'; -import { useFolder } from '../../../../hooks/useFolder'; +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { NotificationsProvider, usePersistentState } from '@strapi/helper-plugin'; +import { fireEvent, render, screen } from '@testing-library/react'; +import { IntlProvider } from 'react-intl'; +import { QueryClient, QueryClientProvider } from 'react-query'; +import { MemoryRouter } from 'react-router-dom'; + import { BrowseStep } from '..'; import { viewOptions } from '../../../../constants'; +import { useFolder } from '../../../../hooks/useFolder'; jest.mock('../../../../hooks/useFolder'); diff --git a/packages/core/upload/admin/src/components/AssetDialog/DialogFooter.js b/packages/core/upload/admin/src/components/AssetDialog/DialogFooter.js index 4c3cd73be9..fb93c75560 100644 --- a/packages/core/upload/admin/src/components/AssetDialog/DialogFooter.js +++ b/packages/core/upload/admin/src/components/AssetDialog/DialogFooter.js @@ -1,6 +1,7 @@ import React from 'react'; -import PropTypes from 'prop-types'; + import { Button, ModalFooter } from '@strapi/design-system'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; export const DialogFooter = ({ onClose, onValidate }) => { diff --git a/packages/core/upload/admin/src/components/AssetDialog/SelectedStep/index.js b/packages/core/upload/admin/src/components/AssetDialog/SelectedStep/index.js index 45a82f2ecb..3aa36c9b6a 100644 --- a/packages/core/upload/admin/src/components/AssetDialog/SelectedStep/index.js +++ b/packages/core/upload/admin/src/components/AssetDialog/SelectedStep/index.js @@ -1,9 +1,11 @@ import React from 'react'; -import { useIntl } from 'react-intl'; -import PropTypes from 'prop-types'; + import { Flex, Typography } from '@strapi/design-system'; -import { AssetGridList } from '../../AssetGridList'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; + import getTrad from '../../../utils/getTrad'; +import { AssetGridList } from '../../AssetGridList'; export const SelectedStep = ({ selectedAssets, onSelectAsset, onReorderAsset }) => { const { formatMessage } = useIntl(); diff --git a/packages/core/upload/admin/src/components/AssetDialog/index.js b/packages/core/upload/admin/src/components/AssetDialog/index.js index e7548d7a5f..b9b0b7a3c4 100644 --- a/packages/core/upload/admin/src/components/AssetDialog/index.js +++ b/packages/core/upload/admin/src/components/AssetDialog/index.js @@ -1,38 +1,41 @@ import React, { useState } from 'react'; -import PropTypes from 'prop-types'; -import styled from 'styled-components'; -import { useIntl } from 'react-intl'; + import { - ModalLayout, - ModalBody, - ModalHeader, - Flex, + Badge, Button, Divider, - Typography, - Tabs, + Flex, + Loader, + ModalBody, + ModalHeader, + ModalLayout, Tab, TabGroup, - TabPanels, TabPanel, - Badge, - Loader, + TabPanels, + Tabs, + Typography, } from '@strapi/design-system'; -import { NoPermissions, AnErrorOccurred, useSelectionState, pxToRem } from '@strapi/helper-plugin'; -import { getTrad, containsAssetFilter } from '../../utils'; -import { SelectedStep } from './SelectedStep'; -import { BrowseStep } from './BrowseStep'; -import { useMediaLibraryPermissions } from '../../hooks/useMediaLibraryPermissions'; +import { AnErrorOccurred, NoPermissions, pxToRem, useSelectionState } from '@strapi/helper-plugin'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import styled from 'styled-components'; + +import { AssetDefinition } from '../../constants'; import { useAssets } from '../../hooks/useAssets'; import { useFolders } from '../../hooks/useFolders'; +import { useMediaLibraryPermissions } from '../../hooks/useMediaLibraryPermissions'; import useModalQueryParams from '../../hooks/useModalQueryParams'; -import { AssetDefinition } from '../../constants'; +import { containsAssetFilter, getTrad } from '../../utils'; import getAllowedFiles from '../../utils/getAllowedFiles'; -import { DialogFooter } from './DialogFooter'; -import { EditAssetDialog } from '../EditAssetDialog'; import { moveElement } from '../../utils/moveElement'; +import { EditAssetDialog } from '../EditAssetDialog'; import { EditFolderDialog } from '../EditFolderDialog'; +import { BrowseStep } from './BrowseStep'; +import { DialogFooter } from './DialogFooter'; +import { SelectedStep } from './SelectedStep'; + const LoadingBody = styled(Flex)` /* 80px are coming from the Tabs component that is not included in the ModalBody */ min-height: ${() => `calc(60vh + ${pxToRem(80)})`}; diff --git a/packages/core/upload/admin/src/components/AssetDialog/tests/AssetDialog.test.js b/packages/core/upload/admin/src/components/AssetDialog/tests/AssetDialog.test.js index 82d27d6a75..7fe231caa8 100644 --- a/packages/core/upload/admin/src/components/AssetDialog/tests/AssetDialog.test.js +++ b/packages/core/upload/admin/src/components/AssetDialog/tests/AssetDialog.test.js @@ -1,13 +1,14 @@ import React from 'react'; -import { IntlProvider } from 'react-intl'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import { QueryClientProvider, QueryClient } from 'react-query'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render as renderTL, screen } from '@testing-library/react'; +import { IntlProvider } from 'react-intl'; +import { QueryClient, QueryClientProvider } from 'react-query'; import { MemoryRouter } from 'react-router-dom'; import { AssetDialog } from '..'; -import { useFolders } from '../../../hooks/useFolders'; import { useAssets } from '../../../hooks/useAssets'; +import { useFolders } from '../../../hooks/useFolders'; import { useMediaLibraryPermissions } from '../../../hooks/useMediaLibraryPermissions'; import useModalQueryParams from '../../../hooks/useModalQueryParams'; diff --git a/packages/core/upload/admin/src/components/AssetGridList/Draggable.js b/packages/core/upload/admin/src/components/AssetGridList/Draggable.js index 824a2845fe..b741e858b9 100644 --- a/packages/core/upload/admin/src/components/AssetGridList/Draggable.js +++ b/packages/core/upload/admin/src/components/AssetGridList/Draggable.js @@ -1,4 +1,5 @@ import React, { useRef } from 'react'; + import PropTypes from 'prop-types'; import { useDrag, useDrop } from 'react-dnd'; diff --git a/packages/core/upload/admin/src/components/AssetGridList/index.js b/packages/core/upload/admin/src/components/AssetGridList/index.js index 634299b2df..1c8d0c5829 100644 --- a/packages/core/upload/admin/src/components/AssetGridList/index.js +++ b/packages/core/upload/admin/src/components/AssetGridList/index.js @@ -1,8 +1,10 @@ import React from 'react'; -import PropTypes from 'prop-types'; + import { Box, Grid, GridItem, KeyboardNavigable, Typography } from '@strapi/design-system'; +import PropTypes from 'prop-types'; import { AssetCard } from '../AssetCard/AssetCard'; + import { Draggable } from './Draggable'; export const AssetGridList = ({ diff --git a/packages/core/upload/admin/src/components/AssetGridList/tests/AssetGridList.test.js b/packages/core/upload/admin/src/components/AssetGridList/tests/AssetGridList.test.js index b68c599bdb..f5e0ca0775 100644 --- a/packages/core/upload/admin/src/components/AssetGridList/tests/AssetGridList.test.js +++ b/packages/core/upload/admin/src/components/AssetGridList/tests/AssetGridList.test.js @@ -1,7 +1,9 @@ import React from 'react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render as renderTL } from '@testing-library/react'; import { MemoryRouter } from 'react-router-dom'; + import { AssetGridList } from '..'; import en from '../../../translations/en.json'; diff --git a/packages/core/upload/admin/src/components/Breadcrumbs/Breadcrumbs.js b/packages/core/upload/admin/src/components/Breadcrumbs/Breadcrumbs.js index eb65f1f493..1c72a6bf78 100644 --- a/packages/core/upload/admin/src/components/Breadcrumbs/Breadcrumbs.js +++ b/packages/core/upload/admin/src/components/Breadcrumbs/Breadcrumbs.js @@ -1,12 +1,14 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import { NavLink } from 'react-router-dom'; -import { useIntl } from 'react-intl'; -import { Crumb, CrumbLink, Breadcrumbs as BaseBreadcrumbs } from '@strapi/design-system/v2'; -import { CrumbSimpleMenuAsync } from './CrumbSimpleMenuAsync'; +import { Breadcrumbs as BaseBreadcrumbs, Crumb, CrumbLink } from '@strapi/design-system/v2'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import { NavLink } from 'react-router-dom'; + import { BreadcrumbsDefinition } from '../../constants'; +import { CrumbSimpleMenuAsync } from './CrumbSimpleMenuAsync'; + export const Breadcrumbs = ({ breadcrumbs, onChangeFolder, currentFolderId, ...props }) => { const { formatMessage } = useIntl(); diff --git a/packages/core/upload/admin/src/components/Breadcrumbs/CrumbSimpleMenuAsync.js b/packages/core/upload/admin/src/components/Breadcrumbs/CrumbSimpleMenuAsync.js index e88f5d5e37..5b93d1b9ff 100644 --- a/packages/core/upload/admin/src/components/Breadcrumbs/CrumbSimpleMenuAsync.js +++ b/packages/core/upload/admin/src/components/Breadcrumbs/CrumbSimpleMenuAsync.js @@ -1,10 +1,12 @@ import React, { useState } from 'react'; -import PropTypes from 'prop-types'; -import { NavLink, useLocation } from 'react-router-dom'; -import { useIntl } from 'react-intl'; -import { useQueryParams } from '@strapi/helper-plugin'; -import { MenuItem, CrumbSimpleMenu } from '@strapi/design-system/v2'; + import { Loader } from '@strapi/design-system'; +import { CrumbSimpleMenu, MenuItem } from '@strapi/design-system/v2'; +import { useQueryParams } from '@strapi/helper-plugin'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import { NavLink, useLocation } from 'react-router-dom'; + import { useFolderStructure } from '../../hooks/useFolderStructure'; import { getFolderParents, getFolderURL, getTrad } from '../../utils'; diff --git a/packages/core/upload/admin/src/components/Breadcrumbs/tests/index.test.js b/packages/core/upload/admin/src/components/Breadcrumbs/tests/index.test.js index ec82e308f0..7dbbde7c31 100644 --- a/packages/core/upload/admin/src/components/Breadcrumbs/tests/index.test.js +++ b/packages/core/upload/admin/src/components/Breadcrumbs/tests/index.test.js @@ -1,11 +1,12 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render as renderRTL } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { QueryClientProvider, QueryClient } from 'react-query'; -import { MemoryRouter } from 'react-router-dom'; import { IntlProvider } from 'react-intl'; +import { QueryClient, QueryClientProvider } from 'react-query'; +import { MemoryRouter } from 'react-router-dom'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; import { Breadcrumbs } from '../index'; jest.mock('../../../hooks/useFolderStructure'); diff --git a/packages/core/upload/admin/src/components/BulkMoveDialog/BulkMoveDialog.js b/packages/core/upload/admin/src/components/BulkMoveDialog/BulkMoveDialog.js index 5270f6c09a..8168054e10 100644 --- a/packages/core/upload/admin/src/components/BulkMoveDialog/BulkMoveDialog.js +++ b/packages/core/upload/admin/src/components/BulkMoveDialog/BulkMoveDialog.js @@ -1,28 +1,29 @@ -import { Formik } from 'formik'; import React from 'react'; -import PropTypes from 'prop-types'; -import isEmpty from 'lodash/isEmpty'; -import { useIntl } from 'react-intl'; + import { Button, + FieldLabel, + Flex, Grid, GridItem, - Flex, Loader, - ModalLayout, - ModalHeader, ModalBody, ModalFooter, - FieldLabel, + ModalHeader, + ModalLayout, Typography, } from '@strapi/design-system'; import { Form, normalizeAPIError } from '@strapi/helper-plugin'; +import { Formik } from 'formik'; +import isEmpty from 'lodash/isEmpty'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import { AssetDefinition, FolderDefinition } from '../../constants'; import { useBulkMove } from '../../hooks/useBulkMove'; +import { useFolderStructure } from '../../hooks/useFolderStructure'; import { getTrad } from '../../utils'; import SelectTree from '../SelectTree'; -import { useFolderStructure } from '../../hooks/useFolderStructure'; -import { FolderDefinition, AssetDefinition } from '../../constants'; export const BulkMoveDialog = ({ onClose, selected, currentFolder }) => { const { formatMessage } = useIntl(); diff --git a/packages/core/upload/admin/src/components/BulkMoveDialog/tests/BulkMoveDialog.test.js b/packages/core/upload/admin/src/components/BulkMoveDialog/tests/BulkMoveDialog.test.js index ad01a655f9..e6837081ae 100644 --- a/packages/core/upload/admin/src/components/BulkMoveDialog/tests/BulkMoveDialog.test.js +++ b/packages/core/upload/admin/src/components/BulkMoveDialog/tests/BulkMoveDialog.test.js @@ -1,9 +1,10 @@ import React from 'react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import { IntlProvider } from 'react-intl'; -import { render } from '@testing-library/react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { NotificationsProvider } from '@strapi/helper-plugin'; -import { QueryClientProvider, QueryClient } from 'react-query'; +import { render } from '@testing-library/react'; +import { IntlProvider } from 'react-intl'; +import { QueryClient, QueryClientProvider } from 'react-query'; import { BulkMoveDialog } from '..'; diff --git a/packages/core/upload/admin/src/components/ContextInfo/ContextInfo.js b/packages/core/upload/admin/src/components/ContextInfo/ContextInfo.js index 51181a40e2..ee33ce0603 100644 --- a/packages/core/upload/admin/src/components/ContextInfo/ContextInfo.js +++ b/packages/core/upload/admin/src/components/ContextInfo/ContextInfo.js @@ -1,6 +1,7 @@ import React from 'react'; -import PropTypes from 'prop-types'; + import { Box, Flex, Grid, GridItem, Typography } from '@strapi/design-system'; +import PropTypes from 'prop-types'; export const ContextInfo = ({ blocks }) => { return ( diff --git a/packages/core/upload/admin/src/components/ContextInfo/tests/ContextInfo.test.js b/packages/core/upload/admin/src/components/ContextInfo/tests/ContextInfo.test.js index 2c9dcbe0cc..df1522333b 100644 --- a/packages/core/upload/admin/src/components/ContextInfo/tests/ContextInfo.test.js +++ b/packages/core/upload/admin/src/components/ContextInfo/tests/ContextInfo.test.js @@ -1,5 +1,6 @@ import React from 'react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render } from '@testing-library/react'; import { ContextInfo } from '../index'; diff --git a/packages/core/upload/admin/src/components/CopyLinkButton/index.js b/packages/core/upload/admin/src/components/CopyLinkButton/index.js index 49f5758297..b5d60dac60 100644 --- a/packages/core/upload/admin/src/components/CopyLinkButton/index.js +++ b/packages/core/upload/admin/src/components/CopyLinkButton/index.js @@ -1,9 +1,11 @@ import React from 'react'; + +import { IconButton } from '@strapi/design-system'; +import { useClipboard, useNotification } from '@strapi/helper-plugin'; +import { Link as LinkIcon } from '@strapi/icons'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { IconButton } from '@strapi/design-system'; -import { useNotification, useClipboard } from '@strapi/helper-plugin'; -import { Link as LinkIcon } from '@strapi/icons'; + import getTrad from '../../utils/getTrad'; export const CopyLinkButton = ({ url }) => { diff --git a/packages/core/upload/admin/src/components/EditAssetDialog/DialogHeader.js b/packages/core/upload/admin/src/components/EditAssetDialog/DialogHeader.js index fee47c3ebe..1e7a2f5fd9 100644 --- a/packages/core/upload/admin/src/components/EditAssetDialog/DialogHeader.js +++ b/packages/core/upload/admin/src/components/EditAssetDialog/DialogHeader.js @@ -1,6 +1,7 @@ import React from 'react'; + +import { ModalHeader, Typography } from '@strapi/design-system'; import { useIntl } from 'react-intl'; -import { Typography, ModalHeader } from '@strapi/design-system'; export const DialogHeader = () => { const { formatMessage } = useIntl(); diff --git a/packages/core/upload/admin/src/components/EditAssetDialog/PreviewBox/AssetPreview.js b/packages/core/upload/admin/src/components/EditAssetDialog/PreviewBox/AssetPreview.js index ef3c735f73..69d31f6671 100644 --- a/packages/core/upload/admin/src/components/EditAssetDialog/PreviewBox/AssetPreview.js +++ b/packages/core/upload/admin/src/components/EditAssetDialog/PreviewBox/AssetPreview.js @@ -1,10 +1,12 @@ /* eslint-disable jsx-a11y/media-has-caption */ import React, { forwardRef } from 'react'; -import PropTypes from 'prop-types'; -import { File, FilePdf } from '@strapi/icons'; + import { Flex } from '@strapi/design-system'; -import styled from 'styled-components'; import { usePersistentState } from '@strapi/helper-plugin'; +import { File, FilePdf } from '@strapi/icons'; +import PropTypes from 'prop-types'; +import styled from 'styled-components'; + import { AssetType } from '../../../constants'; const CardAsset = styled(Flex)` diff --git a/packages/core/upload/admin/src/components/EditAssetDialog/PreviewBox/CroppingActions.js b/packages/core/upload/admin/src/components/EditAssetDialog/PreviewBox/CroppingActions.js index 66428c62cc..3feca3edfd 100644 --- a/packages/core/upload/admin/src/components/EditAssetDialog/PreviewBox/CroppingActions.js +++ b/packages/core/upload/admin/src/components/EditAssetDialog/PreviewBox/CroppingActions.js @@ -1,9 +1,12 @@ import React from 'react'; + +import { Flex, FocusTrap, IconButton, MenuItem, SimpleMenu } from '@strapi/design-system'; +import { Check, Cross } from '@strapi/icons'; import PropTypes from 'prop-types'; -import { IconButton, FocusTrap, SimpleMenu, MenuItem, Flex } from '@strapi/design-system'; -import { Cross, Check } from '@strapi/icons'; import { useIntl } from 'react-intl'; + import getTrad from '../../../utils/getTrad'; + import { CroppingActionRow } from './components'; export const CroppingActions = ({ onCancel, onValidate, onDuplicate }) => { diff --git a/packages/core/upload/admin/src/components/EditAssetDialog/PreviewBox/components.js b/packages/core/upload/admin/src/components/EditAssetDialog/PreviewBox/components.js index 6b33bdb1a1..562d0af7e3 100644 --- a/packages/core/upload/admin/src/components/EditAssetDialog/PreviewBox/components.js +++ b/packages/core/upload/admin/src/components/EditAssetDialog/PreviewBox/components.js @@ -1,5 +1,5 @@ +import { Badge, Box, Flex } from '@strapi/design-system'; import styled from 'styled-components'; -import { Box, Flex, Badge } from '@strapi/design-system'; export const RelativeBox = styled(Box)` position: relative; diff --git a/packages/core/upload/admin/src/components/EditAssetDialog/PreviewBox/index.js b/packages/core/upload/admin/src/components/EditAssetDialog/PreviewBox/index.js index 35f103c122..5a554018eb 100644 --- a/packages/core/upload/admin/src/components/EditAssetDialog/PreviewBox/index.js +++ b/packages/core/upload/admin/src/components/EditAssetDialog/PreviewBox/index.js @@ -1,28 +1,31 @@ -import React, { useState, useRef, useEffect } from 'react'; +import React, { useEffect, useRef, useState } from 'react'; + +import { Flex, IconButton } from '@strapi/design-system'; +import { useTracking } from '@strapi/helper-plugin'; +import { Crop as Resize, Download as DownloadIcon, Trash } from '@strapi/icons'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { Flex, IconButton } from '@strapi/design-system'; -import { Trash, Download as DownloadIcon, Crop as Resize } from '@strapi/icons'; -import { useTracking } from '@strapi/helper-plugin'; -import getTrad from '../../../utils/getTrad'; -import { downloadFile } from '../../../utils/downloadFile'; -import { RemoveAssetDialog } from '../RemoveAssetDialog'; + +import { AssetDefinition, AssetType } from '../../../constants'; import { useCropImg } from '../../../hooks/useCropImg'; import { useEditAsset } from '../../../hooks/useEditAsset'; import { useUpload } from '../../../hooks/useUpload'; -import { - RelativeBox, - ActionRow, - Wrapper, - BadgeOverride, - UploadProgressWrapper, -} from './components'; -import { CroppingActions } from './CroppingActions'; +import { createAssetUrl } from '../../../utils'; +import { downloadFile } from '../../../utils/downloadFile'; +import getTrad from '../../../utils/getTrad'; import { CopyLinkButton } from '../../CopyLinkButton'; import { UploadProgress } from '../../UploadProgress'; -import { AssetType, AssetDefinition } from '../../../constants'; +import { RemoveAssetDialog } from '../RemoveAssetDialog'; + import { AssetPreview } from './AssetPreview'; -import { createAssetUrl } from '../../../utils'; +import { + ActionRow, + BadgeOverride, + RelativeBox, + UploadProgressWrapper, + Wrapper, +} from './components'; +import { CroppingActions } from './CroppingActions'; import 'cropperjs/dist/cropper.css'; diff --git a/packages/core/upload/admin/src/components/EditAssetDialog/RemoveAssetDialog.js b/packages/core/upload/admin/src/components/EditAssetDialog/RemoveAssetDialog.js index 7d8bb9eab6..d262cc36ad 100644 --- a/packages/core/upload/admin/src/components/EditAssetDialog/RemoveAssetDialog.js +++ b/packages/core/upload/admin/src/components/EditAssetDialog/RemoveAssetDialog.js @@ -1,6 +1,8 @@ import React from 'react'; -import PropTypes from 'prop-types'; + import { ConfirmDialog } from '@strapi/helper-plugin'; +import PropTypes from 'prop-types'; + import { useRemoveAsset } from '../../hooks/useRemoveAsset'; export const RemoveAssetDialog = ({ onClose, asset }) => { diff --git a/packages/core/upload/admin/src/components/EditAssetDialog/ReplaceMediaButton.js b/packages/core/upload/admin/src/components/EditAssetDialog/ReplaceMediaButton.js index 0ea79a7bc9..b425dfd7a5 100644 --- a/packages/core/upload/admin/src/components/EditAssetDialog/ReplaceMediaButton.js +++ b/packages/core/upload/admin/src/components/EditAssetDialog/ReplaceMediaButton.js @@ -1,8 +1,10 @@ -import PropTypes from 'prop-types'; import React, { useRef } from 'react'; -import { useIntl } from 'react-intl'; -import { useTracking } from '@strapi/helper-plugin'; + import { Button, VisuallyHidden } from '@strapi/design-system'; +import { useTracking } from '@strapi/helper-plugin'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; + import { getTrad } from '../../utils'; export const ReplaceMediaButton = ({ onSelectMedia, acceptedMime, trackedLocation, ...props }) => { diff --git a/packages/core/upload/admin/src/components/EditAssetDialog/index.js b/packages/core/upload/admin/src/components/EditAssetDialog/index.js index 79f2d1fe35..e134b42e8a 100644 --- a/packages/core/upload/admin/src/components/EditAssetDialog/index.js +++ b/packages/core/upload/admin/src/components/EditAssetDialog/index.js @@ -4,38 +4,40 @@ * */ -import PropTypes from 'prop-types'; import React, { useRef, useState } from 'react'; -import { useIntl } from 'react-intl'; -import isEqual from 'lodash/isEqual'; -import styled from 'styled-components'; + import { - ModalLayout, - ModalBody, - ModalFooter, - Flex, - Loader, - Grid, - GridItem, Button, FieldLabel, + Flex, + Grid, + GridItem, + Loader, + ModalBody, + ModalFooter, + ModalLayout, TextInput, VisuallyHidden, } from '@strapi/design-system'; -import { getFileExtension, Form, pxToRem, useTracking } from '@strapi/helper-plugin'; +import { Form, getFileExtension, pxToRem, useTracking } from '@strapi/helper-plugin'; import { Formik } from 'formik'; +import isEqual from 'lodash/isEqual'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import styled from 'styled-components'; import * as yup from 'yup'; +import { AssetDefinition } from '../../constants'; +import { useEditAsset } from '../../hooks/useEditAsset'; +import { useFolderStructure } from '../../hooks/useFolderStructure'; +import { findRecursiveFolderByValue, getTrad } from '../../utils'; +import formatBytes from '../../utils/formatBytes'; +import { ContextInfo } from '../ContextInfo'; +import SelectTree from '../SelectTree'; + import { DialogHeader } from './DialogHeader'; import { PreviewBox } from './PreviewBox'; -import { ContextInfo } from '../ContextInfo'; -import { AssetDefinition } from '../../constants'; -import { getTrad, findRecursiveFolderByValue } from '../../utils'; -import formatBytes from '../../utils/formatBytes'; -import { useEditAsset } from '../../hooks/useEditAsset'; -import { useFolderStructure } from '../../hooks/useFolderStructure'; import { ReplaceMediaButton } from './ReplaceMediaButton'; -import SelectTree from '../SelectTree'; const LoadingBody = styled(Flex)` /* 80px are coming from the Tabs component that is not included in the ModalBody */ diff --git a/packages/core/upload/admin/src/components/EditAssetDialog/tests/EditAssetDialog.test.js b/packages/core/upload/admin/src/components/EditAssetDialog/tests/EditAssetDialog.test.js index a34025ddd0..5ca8d78147 100644 --- a/packages/core/upload/admin/src/components/EditAssetDialog/tests/EditAssetDialog.test.js +++ b/packages/core/upload/admin/src/components/EditAssetDialog/tests/EditAssetDialog.test.js @@ -1,12 +1,14 @@ import React from 'react'; -import { render, screen, fireEvent, waitFor } from '@testing-library/react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { NotificationsProvider } from '@strapi/helper-plugin'; +import { fireEvent, render, screen, waitFor } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; import { QueryClient, QueryClientProvider } from 'react-query'; -import { NotificationsProvider } from '@strapi/helper-plugin'; -import { EditAssetDialog } from '../index'; + import en from '../../../translations/en.json'; import { downloadFile } from '../../../utils/downloadFile'; +import { EditAssetDialog } from '../index'; jest.mock('../../../hooks/useFolderStructure'); jest.mock('../../../utils/downloadFile'); diff --git a/packages/core/upload/admin/src/components/EditAssetDialog/tests/RemoveAssetDialog.test.js b/packages/core/upload/admin/src/components/EditAssetDialog/tests/RemoveAssetDialog.test.js index 9d10c84bc3..55e7b8298d 100644 --- a/packages/core/upload/admin/src/components/EditAssetDialog/tests/RemoveAssetDialog.test.js +++ b/packages/core/upload/admin/src/components/EditAssetDialog/tests/RemoveAssetDialog.test.js @@ -1,11 +1,14 @@ import React from 'react'; -import { render, screen, fireEvent, waitFor } from '@testing-library/react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { NotificationsProvider } from '@strapi/helper-plugin'; +import { fireEvent, render, screen, waitFor } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; import { QueryClient, QueryClientProvider } from 'react-query'; -import { NotificationsProvider } from '@strapi/helper-plugin'; -import { RemoveAssetDialog } from '../RemoveAssetDialog'; + import en from '../../../translations/en.json'; +import { RemoveAssetDialog } from '../RemoveAssetDialog'; + import server from './server'; jest.mock('../../../utils/deleteRequest', () => ({ diff --git a/packages/core/upload/admin/src/components/EditAssetDialog/tests/index.test.js b/packages/core/upload/admin/src/components/EditAssetDialog/tests/index.test.js index 1b80e2edce..9b1556fd34 100644 --- a/packages/core/upload/admin/src/components/EditAssetDialog/tests/index.test.js +++ b/packages/core/upload/admin/src/components/EditAssetDialog/tests/index.test.js @@ -5,14 +5,16 @@ */ import React from 'react'; -import { render, screen, fireEvent, waitFor } from '@testing-library/react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { NotificationsProvider, TrackingProvider } from '@strapi/helper-plugin'; +import { fireEvent, render, screen, waitFor } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; import { QueryClient, QueryClientProvider } from 'react-query'; -import { NotificationsProvider, TrackingProvider } from '@strapi/helper-plugin'; -import { EditAssetDialog } from '../index'; + import en from '../../../translations/en.json'; import { downloadFile } from '../../../utils/downloadFile'; +import { EditAssetDialog } from '../index'; jest.mock('../../../utils/downloadFile'); jest.mock('../../../hooks/useFolderStructure'); diff --git a/packages/core/upload/admin/src/components/EditAssetDialog/tests/server.js b/packages/core/upload/admin/src/components/EditAssetDialog/tests/server.js index 60ba45dfc9..a91057f1cf 100644 --- a/packages/core/upload/admin/src/components/EditAssetDialog/tests/server.js +++ b/packages/core/upload/admin/src/components/EditAssetDialog/tests/server.js @@ -1,5 +1,5 @@ -import { setupServer } from 'msw/node'; import { rest } from 'msw'; +import { setupServer } from 'msw/node'; const handlers = [ rest.delete('*/upload/files/8', (req, res, ctx) => { diff --git a/packages/core/upload/admin/src/components/EditFolderDialog/EditFolderDialog.js b/packages/core/upload/admin/src/components/EditFolderDialog/EditFolderDialog.js index 64d2f60b8c..bfe9624c7a 100644 --- a/packages/core/upload/admin/src/components/EditFolderDialog/EditFolderDialog.js +++ b/packages/core/upload/admin/src/components/EditFolderDialog/EditFolderDialog.js @@ -1,32 +1,34 @@ -import * as yup from 'yup'; -import { Formik } from 'formik'; import React, { useState } from 'react'; -import PropTypes from 'prop-types'; -import isEmpty from 'lodash/isEmpty'; -import { useIntl } from 'react-intl'; + import { Button, - Grid, - GridItem, - ModalLayout, - ModalBody, - ModalFooter, FieldLabel, Flex, + Grid, + GridItem, Loader, + ModalBody, + ModalFooter, + ModalLayout, TextInput, Typography, } from '@strapi/design-system'; -import { Form, useNotification, getAPIInnerErrors, useTracking } from '@strapi/helper-plugin'; +import { Form, getAPIInnerErrors, useNotification, useTracking } from '@strapi/helper-plugin'; +import { Formik } from 'formik'; +import isEmpty from 'lodash/isEmpty'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import * as yup from 'yup'; -import { getTrad, findRecursiveFolderByValue } from '../../utils'; import { FolderDefinition } from '../../constants'; -import { useEditFolder } from '../../hooks/useEditFolder'; import { useBulkRemove } from '../../hooks/useBulkRemove'; +import { useEditFolder } from '../../hooks/useEditFolder'; import { useFolderStructure } from '../../hooks/useFolderStructure'; import { useMediaLibraryPermissions } from '../../hooks/useMediaLibraryPermissions'; +import { findRecursiveFolderByValue, getTrad } from '../../utils'; import { ContextInfo } from '../ContextInfo'; import SelectTree from '../SelectTree'; + import { EditFolderModalHeader } from './ModalHeader'; import RemoveFolderDialog from './RemoveFolderDialog'; diff --git a/packages/core/upload/admin/src/components/EditFolderDialog/ModalHeader/ModalHeader.js b/packages/core/upload/admin/src/components/EditFolderDialog/ModalHeader/ModalHeader.js index 92f757e254..9fb445cba1 100644 --- a/packages/core/upload/admin/src/components/EditFolderDialog/ModalHeader/ModalHeader.js +++ b/packages/core/upload/admin/src/components/EditFolderDialog/ModalHeader/ModalHeader.js @@ -1,7 +1,8 @@ -import { useIntl } from 'react-intl'; -import PropTypes from 'prop-types'; import React from 'react'; + import { ModalHeader, Typography } from '@strapi/design-system'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; import { getTrad } from '../../../utils'; diff --git a/packages/core/upload/admin/src/components/EditFolderDialog/RemoveFolderDialog.js b/packages/core/upload/admin/src/components/EditFolderDialog/RemoveFolderDialog.js index 2bd1108311..70d243836a 100644 --- a/packages/core/upload/admin/src/components/EditFolderDialog/RemoveFolderDialog.js +++ b/packages/core/upload/admin/src/components/EditFolderDialog/RemoveFolderDialog.js @@ -1,6 +1,7 @@ import React from 'react'; -import PropTypes from 'prop-types'; + import { ConfirmDialog } from '@strapi/helper-plugin'; +import PropTypes from 'prop-types'; export const RemoveFolderDialog = ({ onClose, onConfirm }) => { return ( diff --git a/packages/core/upload/admin/src/components/EditFolderDialog/tests/EditFolderDialog.test.js b/packages/core/upload/admin/src/components/EditFolderDialog/tests/EditFolderDialog.test.js index e45e60f38d..8f52ff0761 100644 --- a/packages/core/upload/admin/src/components/EditFolderDialog/tests/EditFolderDialog.test.js +++ b/packages/core/upload/admin/src/components/EditFolderDialog/tests/EditFolderDialog.test.js @@ -1,14 +1,15 @@ import React from 'react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import { IntlProvider } from 'react-intl'; -import { render, fireEvent, act, waitFor, screen } from '@testing-library/react'; -import { within } from '@testing-library/dom'; -import { NotificationsProvider } from '@strapi/helper-plugin'; -import { QueryClientProvider, QueryClient } from 'react-query'; -import { EditFolderDialog } from '../EditFolderDialog'; +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { NotificationsProvider } from '@strapi/helper-plugin'; +import { within } from '@testing-library/dom'; +import { act, fireEvent, render, screen, waitFor } from '@testing-library/react'; +import { IntlProvider } from 'react-intl'; +import { QueryClient, QueryClientProvider } from 'react-query'; + import { useEditFolder } from '../../../hooks/useEditFolder'; import { useMediaLibraryPermissions } from '../../../hooks/useMediaLibraryPermissions'; +import { EditFolderDialog } from '../EditFolderDialog'; jest.mock('@strapi/helper-plugin', () => ({ ...jest.requireActual('@strapi/helper-plugin'), diff --git a/packages/core/upload/admin/src/components/EmptyAssets/EmptyAssetGrid.js b/packages/core/upload/admin/src/components/EmptyAssets/EmptyAssetGrid.js index 0fb59101c9..89ebd61003 100644 --- a/packages/core/upload/admin/src/components/EmptyAssets/EmptyAssetGrid.js +++ b/packages/core/upload/admin/src/components/EmptyAssets/EmptyAssetGrid.js @@ -1,7 +1,8 @@ import React from 'react'; + +import { Box } from '@strapi/design-system'; import PropTypes from 'prop-types'; import styled from 'styled-components'; -import { Box } from '@strapi/design-system'; const EmptyAssetCard = styled(Box)` background: linear-gradient( diff --git a/packages/core/upload/admin/src/components/EmptyAssets/index.js b/packages/core/upload/admin/src/components/EmptyAssets/index.js index 9747f8c636..00ebcd1cd4 100644 --- a/packages/core/upload/admin/src/components/EmptyAssets/index.js +++ b/packages/core/upload/admin/src/components/EmptyAssets/index.js @@ -1,7 +1,9 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import { Typography, Flex, Box, Icon } from '@strapi/design-system'; + +import { Box, Flex, Icon, Typography } from '@strapi/design-system'; import { EmptyDocuments } from '@strapi/icons'; +import PropTypes from 'prop-types'; + import { EmptyAssetGrid } from './EmptyAssetGrid'; export const EmptyAssets = ({ icon, content, action, size, count }) => { diff --git a/packages/core/upload/admin/src/components/FilterList/FilterTag.js b/packages/core/upload/admin/src/components/FilterList/FilterTag.js index 8189833000..8b4e24c2fd 100644 --- a/packages/core/upload/admin/src/components/FilterList/FilterTag.js +++ b/packages/core/upload/admin/src/components/FilterList/FilterTag.js @@ -1,7 +1,8 @@ import React from 'react'; -import PropTypes from 'prop-types'; + import { Box, Tag } from '@strapi/design-system'; import { Cross } from '@strapi/icons'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; const FilterTag = ({ attribute, filter, onClick, operator, value }) => { diff --git a/packages/core/upload/admin/src/components/FilterList/index.js b/packages/core/upload/admin/src/components/FilterList/index.js index f342144d63..1cc48b1f42 100644 --- a/packages/core/upload/admin/src/components/FilterList/index.js +++ b/packages/core/upload/admin/src/components/FilterList/index.js @@ -5,7 +5,9 @@ */ import React from 'react'; + import PropTypes from 'prop-types'; + import FilterTag from './FilterTag'; const FilterList = ({ appliedFilters, filtersSchema, onRemoveFilter }) => { diff --git a/packages/core/upload/admin/src/components/FilterList/tests/index.test.js b/packages/core/upload/admin/src/components/FilterList/tests/index.test.js index 3590bb73fd..bd297da73b 100644 --- a/packages/core/upload/admin/src/components/FilterList/tests/index.test.js +++ b/packages/core/upload/admin/src/components/FilterList/tests/index.test.js @@ -5,9 +5,11 @@ */ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render } from '@testing-library/react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; import { IntlProvider } from 'react-intl'; + import FilterList from '../index'; const messages = { diff --git a/packages/core/upload/admin/src/components/FilterPopover/FilterValueInput.js b/packages/core/upload/admin/src/components/FilterPopover/FilterValueInput.js index e1549c56c3..25b78e01e5 100644 --- a/packages/core/upload/admin/src/components/FilterPopover/FilterValueInput.js +++ b/packages/core/upload/admin/src/components/FilterPopover/FilterValueInput.js @@ -1,6 +1,7 @@ import React from 'react'; + +import { DateTimePicker, Option, Select } from '@strapi/design-system'; import PropTypes from 'prop-types'; -import { DateTimePicker, Select, Option } from '@strapi/design-system'; import { useIntl } from 'react-intl'; const FilterValueInput = ({ label, onChange, options, type, value }) => { diff --git a/packages/core/upload/admin/src/components/FilterPopover/index.js b/packages/core/upload/admin/src/components/FilterPopover/index.js index 81cf2a1f70..017c562f01 100644 --- a/packages/core/upload/admin/src/components/FilterPopover/index.js +++ b/packages/core/upload/admin/src/components/FilterPopover/index.js @@ -5,10 +5,12 @@ */ import React, { useState } from 'react'; -import { useIntl } from 'react-intl'; -import PropTypes from 'prop-types'; -import { Button, Box, Popover, Flex, Select, Option } from '@strapi/design-system'; + +import { Box, Button, Flex, Option, Popover, Select } from '@strapi/design-system'; import { Plus } from '@strapi/icons'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; + import FilterValueInput from './FilterValueInput'; import getFilterList from './utils/getFilterList'; diff --git a/packages/core/upload/admin/src/components/FolderCard/FolderCard/FolderCard.js b/packages/core/upload/admin/src/components/FolderCard/FolderCard/FolderCard.js index 4d3e12f02d..846f0f3b9a 100644 --- a/packages/core/upload/admin/src/components/FolderCard/FolderCard/FolderCard.js +++ b/packages/core/upload/admin/src/components/FolderCard/FolderCard/FolderCard.js @@ -1,11 +1,11 @@ import React, { forwardRef, useMemo } from 'react'; -import PropTypes from 'prop-types'; -import styled from 'styled-components'; -import { NavLink } from 'react-router-dom'; -import { pxToRem } from '@strapi/helper-plugin'; import { Box, CardAction, Flex } from '@strapi/design-system'; +import { pxToRem } from '@strapi/helper-plugin'; import { Folder } from '@strapi/icons'; +import PropTypes from 'prop-types'; +import { NavLink } from 'react-router-dom'; +import styled from 'styled-components'; import { FolderCardContext } from '../contexts/FolderCard'; import useId from '../hooks/useId'; diff --git a/packages/core/upload/admin/src/components/FolderCard/FolderCardBody/FolderCardBody.js b/packages/core/upload/admin/src/components/FolderCard/FolderCardBody/FolderCardBody.js index 73cf40e291..c63289872d 100644 --- a/packages/core/upload/admin/src/components/FolderCard/FolderCardBody/FolderCardBody.js +++ b/packages/core/upload/admin/src/components/FolderCard/FolderCardBody/FolderCardBody.js @@ -1,7 +1,7 @@ import React from 'react'; -import styled from 'styled-components'; import { Flex } from '@strapi/design-system'; +import styled from 'styled-components'; import { useFolderCard } from '../contexts/FolderCard'; diff --git a/packages/core/upload/admin/src/components/FolderCard/FolderCardBodyAction/index.js b/packages/core/upload/admin/src/components/FolderCard/FolderCardBodyAction/index.js index 5c1c7dd5df..e72fd1f910 100644 --- a/packages/core/upload/admin/src/components/FolderCard/FolderCardBodyAction/index.js +++ b/packages/core/upload/admin/src/components/FolderCard/FolderCardBodyAction/index.js @@ -1,8 +1,9 @@ import React from 'react'; + +import { Box } from '@strapi/design-system'; import PropTypes from 'prop-types'; import { NavLink } from 'react-router-dom'; import styled from 'styled-components'; -import { Box } from '@strapi/design-system'; const BoxOutline = styled(Box)` &:focus { diff --git a/packages/core/upload/admin/src/components/FolderCard/FolderCardCheckbox/FolderCardCheckbox.js b/packages/core/upload/admin/src/components/FolderCard/FolderCardCheckbox/FolderCardCheckbox.js index cde2e30f9a..2265c7ade2 100644 --- a/packages/core/upload/admin/src/components/FolderCard/FolderCardCheckbox/FolderCardCheckbox.js +++ b/packages/core/upload/admin/src/components/FolderCard/FolderCardCheckbox/FolderCardCheckbox.js @@ -1,5 +1,7 @@ import React from 'react'; -import { Box, BaseCheckbox } from '@strapi/design-system'; + +import { BaseCheckbox, Box } from '@strapi/design-system'; + import { useFolderCard } from '../contexts/FolderCard'; export const FolderCardCheckbox = (props) => { diff --git a/packages/core/upload/admin/src/components/FolderCard/index.js b/packages/core/upload/admin/src/components/FolderCard/index.js index 0037bbcfc1..e445605e33 100644 --- a/packages/core/upload/admin/src/components/FolderCard/index.js +++ b/packages/core/upload/admin/src/components/FolderCard/index.js @@ -1,4 +1,4 @@ export { FolderCard } from './FolderCard'; export { FolderCardBody } from './FolderCardBody'; -export { FolderCardCheckbox } from './FolderCardCheckbox'; export { FolderCardBodyAction } from './FolderCardBodyAction'; +export { FolderCardCheckbox } from './FolderCardCheckbox'; diff --git a/packages/core/upload/admin/src/components/FolderCard/tests/FolderCard.test.js b/packages/core/upload/admin/src/components/FolderCard/tests/FolderCard.test.js index d069b2f2be..6044d48392 100644 --- a/packages/core/upload/admin/src/components/FolderCard/tests/FolderCard.test.js +++ b/packages/core/upload/admin/src/components/FolderCard/tests/FolderCard.test.js @@ -1,12 +1,13 @@ import React from 'react'; + +import { Flex, lightTheme, ThemeProvider, Typography } from '@strapi/design-system'; +import { act, fireEvent, render } from '@testing-library/react'; import { MemoryRouter } from 'react-router-dom'; -import { Flex, ThemeProvider, lightTheme, Typography } from '@strapi/design-system'; -import { render, fireEvent, act } from '@testing-library/react'; import { FolderCard } from '../FolderCard'; import { FolderCardBody } from '../FolderCardBody'; -import { FolderCardCheckbox } from '../FolderCardCheckbox'; import { FolderCardBodyAction } from '../FolderCardBodyAction'; +import { FolderCardCheckbox } from '../FolderCardCheckbox'; const ID_FIXTURE = 'folder'; diff --git a/packages/core/upload/admin/src/components/FolderGridList/FolderGridList.js b/packages/core/upload/admin/src/components/FolderGridList/FolderGridList.js index 8c3eb689ae..f2bfbb4ba9 100644 --- a/packages/core/upload/admin/src/components/FolderGridList/FolderGridList.js +++ b/packages/core/upload/admin/src/components/FolderGridList/FolderGridList.js @@ -1,6 +1,7 @@ import React from 'react'; + +import { Box, Grid, KeyboardNavigable, Typography } from '@strapi/design-system'; import PropTypes from 'prop-types'; -import { Box, KeyboardNavigable, Grid, Typography } from '@strapi/design-system'; export const FolderGridList = ({ title, children }) => { return ( diff --git a/packages/core/upload/admin/src/components/FolderGridList/tests/FolderGridList.test.js b/packages/core/upload/admin/src/components/FolderGridList/tests/FolderGridList.test.js index 00ad258f23..8b24c6513e 100644 --- a/packages/core/upload/admin/src/components/FolderGridList/tests/FolderGridList.test.js +++ b/packages/core/upload/admin/src/components/FolderGridList/tests/FolderGridList.test.js @@ -1,7 +1,8 @@ import React from 'react'; -import { IntlProvider } from 'react-intl'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render } from '@testing-library/react'; +import { IntlProvider } from 'react-intl'; import { MemoryRouter } from 'react-router-dom'; import { FolderGridList } from '../FolderGridList'; diff --git a/packages/core/upload/admin/src/components/MediaLibraryDialog/index.js b/packages/core/upload/admin/src/components/MediaLibraryDialog/index.js index 736634cd0b..2cb8ede954 100644 --- a/packages/core/upload/admin/src/components/MediaLibraryDialog/index.js +++ b/packages/core/upload/admin/src/components/MediaLibraryDialog/index.js @@ -1,4 +1,5 @@ import React, { useState } from 'react'; + import PropTypes from 'prop-types'; import { AssetDialog } from '../AssetDialog'; diff --git a/packages/core/upload/admin/src/components/MediaLibraryInput/Carousel/CarouselAsset.js b/packages/core/upload/admin/src/components/MediaLibraryInput/Carousel/CarouselAsset.js index c3705953aa..21436ca02e 100644 --- a/packages/core/upload/admin/src/components/MediaLibraryInput/Carousel/CarouselAsset.js +++ b/packages/core/upload/admin/src/components/MediaLibraryInput/Carousel/CarouselAsset.js @@ -1,11 +1,13 @@ import React from 'react'; -import styled from 'styled-components'; -import { File, FilePdf } from '@strapi/icons'; + import { Box, Flex } from '@strapi/design-system'; -import { AssetType, AssetDefinition } from '../../../constants'; -import { VideoPreview } from '../../AssetCard/VideoPreview'; -import { AudioPreview } from '../../AssetCard/AudioPreview'; +import { File, FilePdf } from '@strapi/icons'; +import styled from 'styled-components'; + +import { AssetDefinition, AssetType } from '../../../constants'; import { createAssetUrl } from '../../../utils'; +import { AudioPreview } from '../../AssetCard/AudioPreview'; +import { VideoPreview } from '../../AssetCard/VideoPreview'; const DocAsset = styled(Flex)` background: linear-gradient(180deg, #ffffff 0%, #f6f6f9 121.48%); diff --git a/packages/core/upload/admin/src/components/MediaLibraryInput/Carousel/CarouselAssetActions.js b/packages/core/upload/admin/src/components/MediaLibraryInput/Carousel/CarouselAssetActions.js index caa9f860fd..134c633981 100644 --- a/packages/core/upload/admin/src/components/MediaLibraryInput/Carousel/CarouselAssetActions.js +++ b/packages/core/upload/admin/src/components/MediaLibraryInput/Carousel/CarouselAssetActions.js @@ -1,12 +1,14 @@ import React from 'react'; -import PropTypes from 'prop-types'; + import { CarouselActions, IconButton } from '@strapi/design-system'; import { prefixFileUrlWithBackendUrl } from '@strapi/helper-plugin'; +import { Pencil, Plus, Trash } from '@strapi/icons'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { Plus, Trash, Pencil } from '@strapi/icons'; + +import { AssetDefinition } from '../../../constants'; import getTrad from '../../../utils/getTrad'; import { CopyLinkButton } from '../../CopyLinkButton'; -import { AssetDefinition } from '../../../constants'; export const CarouselAssetActions = ({ asset, onDeleteAsset, onAddAsset, onEditAsset }) => { const { formatMessage } = useIntl(); diff --git a/packages/core/upload/admin/src/components/MediaLibraryInput/Carousel/CarouselAssets.js b/packages/core/upload/admin/src/components/MediaLibraryInput/Carousel/CarouselAssets.js index 9218097fd3..c5777c3ee0 100644 --- a/packages/core/upload/admin/src/components/MediaLibraryInput/Carousel/CarouselAssets.js +++ b/packages/core/upload/admin/src/components/MediaLibraryInput/Carousel/CarouselAssets.js @@ -1,14 +1,17 @@ import React, { useState } from 'react'; + +import { CarouselInput, CarouselSlide } from '@strapi/design-system'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { CarouselInput, CarouselSlide } from '@strapi/design-system'; -import getTrad from '../../../utils/getTrad'; + import { AssetDefinition } from '../../../constants'; -import { CarouselAssetActions } from './CarouselAssetActions'; -import { CarouselAsset } from './CarouselAsset'; -import { EmptyStateAsset } from './EmptyStateAsset'; +import getTrad from '../../../utils/getTrad'; import { EditAssetDialog } from '../../EditAssetDialog'; +import { CarouselAsset } from './CarouselAsset'; +import { CarouselAssetActions } from './CarouselAssetActions'; +import { EmptyStateAsset } from './EmptyStateAsset'; + export const CarouselAssets = ({ assets, disabled, diff --git a/packages/core/upload/admin/src/components/MediaLibraryInput/Carousel/EmptyStateAsset.js b/packages/core/upload/admin/src/components/MediaLibraryInput/Carousel/EmptyStateAsset.js index 3a7e3b1281..f897b0a03b 100644 --- a/packages/core/upload/admin/src/components/MediaLibraryInput/Carousel/EmptyStateAsset.js +++ b/packages/core/upload/admin/src/components/MediaLibraryInput/Carousel/EmptyStateAsset.js @@ -1,12 +1,14 @@ import React, { useState } from 'react'; -import PropTypes from 'prop-types'; -import styled from 'styled-components'; -import { useIntl } from 'react-intl'; -import { Icon, Flex, Typography } from '@strapi/design-system'; + +import { Flex, Icon, Typography } from '@strapi/design-system'; import { PicturePlus } from '@strapi/icons'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import styled from 'styled-components'; + +import { AssetSource } from '../../../constants'; import getTrad from '../../../utils/getTrad'; import { rawFileToAsset } from '../../../utils/rawFileToAsset'; -import { AssetSource } from '../../../constants'; const TextAlignTypography = styled(Typography)` align-items: center; diff --git a/packages/core/upload/admin/src/components/MediaLibraryInput/Carousel/tests/CarouselAssets.test.js b/packages/core/upload/admin/src/components/MediaLibraryInput/Carousel/tests/CarouselAssets.test.js index 7aa8ed4fa2..2d5cda7fcd 100644 --- a/packages/core/upload/admin/src/components/MediaLibraryInput/Carousel/tests/CarouselAssets.test.js +++ b/packages/core/upload/admin/src/components/MediaLibraryInput/Carousel/tests/CarouselAssets.test.js @@ -1,8 +1,9 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { fireEvent, render } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; -import { QueryClientProvider, QueryClient } from 'react-query'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; +import { QueryClient, QueryClientProvider } from 'react-query'; import { CarouselAssets } from '../CarouselAssets'; diff --git a/packages/core/upload/admin/src/components/MediaLibraryInput/index.js b/packages/core/upload/admin/src/components/MediaLibraryInput/index.js index 280c59554c..7e91e6c85e 100644 --- a/packages/core/upload/admin/src/components/MediaLibraryInput/index.js +++ b/packages/core/upload/admin/src/components/MediaLibraryInput/index.js @@ -1,15 +1,17 @@ import React, { useEffect, useState } from 'react'; + +import { useNotification } from '@strapi/helper-plugin'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { useNotification } from '@strapi/helper-plugin'; -import { AssetDialog } from '../AssetDialog'; import { AssetDefinition } from '../../constants'; -import { CarouselAssets } from './Carousel/CarouselAssets'; -import { EditFolderDialog } from '../EditFolderDialog'; -import { UploadAssetDialog } from '../UploadAssetDialog/UploadAssetDialog'; import getAllowedFiles from '../../utils/getAllowedFiles'; import getTrad from '../../utils/getTrad'; +import { AssetDialog } from '../AssetDialog'; +import { EditFolderDialog } from '../EditFolderDialog'; +import { UploadAssetDialog } from '../UploadAssetDialog/UploadAssetDialog'; + +import { CarouselAssets } from './Carousel/CarouselAssets'; const STEPS = { AssetSelect: 'SelectAsset', diff --git a/packages/core/upload/admin/src/components/MediaLibraryInput/tests/MediaLibraryInput.test.js b/packages/core/upload/admin/src/components/MediaLibraryInput/tests/MediaLibraryInput.test.js index f3277c6d81..7029a71a21 100644 --- a/packages/core/upload/admin/src/components/MediaLibraryInput/tests/MediaLibraryInput.test.js +++ b/packages/core/upload/admin/src/components/MediaLibraryInput/tests/MediaLibraryInput.test.js @@ -1,8 +1,10 @@ import React from 'react'; -import { render } from '@testing-library/react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import { QueryClient, QueryClientProvider } from 'react-query'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { NotificationsProvider } from '@strapi/helper-plugin'; +import { render } from '@testing-library/react'; +import { QueryClient, QueryClientProvider } from 'react-query'; + import { MediaLibraryInput } from '..'; import en from '../../../translations/en.json'; diff --git a/packages/core/upload/admin/src/components/PaginationFooter/index.js b/packages/core/upload/admin/src/components/PaginationFooter/index.js index 57d4a5f1a6..f99a5bf2c8 100644 --- a/packages/core/upload/admin/src/components/PaginationFooter/index.js +++ b/packages/core/upload/admin/src/components/PaginationFooter/index.js @@ -1,7 +1,8 @@ import React from 'react'; -import PropTypes from 'prop-types'; + import { Box, Flex } from '@strapi/design-system'; -import { PaginationURLQuery, PageSizeURLQuery } from '@strapi/helper-plugin'; +import { PageSizeURLQuery, PaginationURLQuery } from '@strapi/helper-plugin'; +import PropTypes from 'prop-types'; export const PaginationFooter = ({ pagination }) => { return ( diff --git a/packages/core/upload/admin/src/components/PluginIcon/index.js b/packages/core/upload/admin/src/components/PluginIcon/index.js index 6291fda052..e0606fd781 100644 --- a/packages/core/upload/admin/src/components/PluginIcon/index.js +++ b/packages/core/upload/admin/src/components/PluginIcon/index.js @@ -5,6 +5,7 @@ */ import React from 'react'; + import { Landscape } from '@strapi/icons'; const PluginIcon = () => ; diff --git a/packages/core/upload/admin/src/components/SelectTree/Option.js b/packages/core/upload/admin/src/components/SelectTree/Option.js index 52a65e7d39..d1b7734663 100644 --- a/packages/core/upload/admin/src/components/SelectTree/Option.js +++ b/packages/core/upload/admin/src/components/SelectTree/Option.js @@ -1,12 +1,12 @@ -import PropTypes from 'prop-types'; import React from 'react'; -import { useIntl } from 'react-intl'; -import { components } from 'react-select'; -import styled from 'styled-components'; import { Flex, Icon, Typography } from '@strapi/design-system'; import { pxToRem } from '@strapi/helper-plugin'; -import { ChevronUp, ChevronDown } from '@strapi/icons'; +import { ChevronDown, ChevronUp } from '@strapi/icons'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import { components } from 'react-select'; +import styled from 'styled-components'; const ToggleButton = styled(Flex)` align-self: flex-end; diff --git a/packages/core/upload/admin/src/components/SelectTree/SelectTree.js b/packages/core/upload/admin/src/components/SelectTree/SelectTree.js index d19fac309e..f8d8a31bd0 100644 --- a/packages/core/upload/admin/src/components/SelectTree/SelectTree.js +++ b/packages/core/upload/admin/src/components/SelectTree/SelectTree.js @@ -1,13 +1,13 @@ -import React, { useEffect, useState, useMemo } from 'react'; -import PropTypes from 'prop-types'; +import React, { useEffect, useMemo, useState } from 'react'; + /** * @note – This component is way too complex to convert to the DS version. */ // eslint-disable-next-line no-restricted-imports import { ReactSelect as Select } from '@strapi/helper-plugin'; +import PropTypes from 'prop-types'; import Option from './Option'; - import flattenTree from './utils/flattenTree'; import getOpenValues from './utils/getOpenValues'; import getValuesToClose from './utils/getValuesToClose'; diff --git a/packages/core/upload/admin/src/components/SelectTree/tests/SelectTree.test.js b/packages/core/upload/admin/src/components/SelectTree/tests/SelectTree.test.js index 9adf6ac1c9..324b3d5d2f 100644 --- a/packages/core/upload/admin/src/components/SelectTree/tests/SelectTree.test.js +++ b/packages/core/upload/admin/src/components/SelectTree/tests/SelectTree.test.js @@ -1,8 +1,8 @@ import React from 'react'; -import { render, act } from '@testing-library/react'; -import { IntlProvider } from 'react-intl'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { act, render } from '@testing-library/react'; +import { IntlProvider } from 'react-intl'; import SelectTree from '../index'; diff --git a/packages/core/upload/admin/src/components/SortPicker/index.js b/packages/core/upload/admin/src/components/SortPicker/index.js index 46b7c77ec0..94fe930441 100644 --- a/packages/core/upload/admin/src/components/SortPicker/index.js +++ b/packages/core/upload/admin/src/components/SortPicker/index.js @@ -1,9 +1,11 @@ import React from 'react'; -import { useIntl } from 'react-intl'; + +import { MenuItem, SimpleMenu } from '@strapi/design-system'; import PropTypes from 'prop-types'; -import { SimpleMenu, MenuItem } from '@strapi/design-system'; -import { getTrad } from '../../utils'; +import { useIntl } from 'react-intl'; + import { sortOptions } from '../../constants'; +import { getTrad } from '../../utils'; const SortPicker = ({ onChangeSort }) => { const { formatMessage } = useIntl(); diff --git a/packages/core/upload/admin/src/components/TableList/CellContent.js b/packages/core/upload/admin/src/components/TableList/CellContent.js index 7c85b29b5f..89e6b96f0d 100644 --- a/packages/core/upload/admin/src/components/TableList/CellContent.js +++ b/packages/core/upload/admin/src/components/TableList/CellContent.js @@ -1,12 +1,14 @@ import React from 'react'; + +import { Typography } from '@strapi/design-system'; +import { getFileExtension } from '@strapi/helper-plugin'; +import parseISO from 'date-fns/parseISO'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import parseISO from 'date-fns/parseISO'; -import { getFileExtension } from '@strapi/helper-plugin'; -import { Typography } from '@strapi/design-system'; + +import { formatBytes } from '../../utils'; import { PreviewCell } from './PreviewCell'; -import { formatBytes } from '../../utils'; export const CellContent = ({ cellType, contentType, content, name }) => { const { formatDate, formatMessage } = useIntl(); diff --git a/packages/core/upload/admin/src/components/TableList/PreviewCell.js b/packages/core/upload/admin/src/components/TableList/PreviewCell.js index 88563cfb8e..73fd50e335 100644 --- a/packages/core/upload/admin/src/components/TableList/PreviewCell.js +++ b/packages/core/upload/admin/src/components/TableList/PreviewCell.js @@ -1,9 +1,10 @@ import React from 'react'; + +import { Avatar, Box, Icon, Initials } from '@strapi/design-system'; +import { getFileExtension, prefixFileUrlWithBackendUrl, pxToRem } from '@strapi/helper-plugin'; +import { Folder } from '@strapi/icons'; import PropTypes from 'prop-types'; import styled from 'styled-components'; -import { getFileExtension, prefixFileUrlWithBackendUrl, pxToRem } from '@strapi/helper-plugin'; -import { Avatar, Initials, Box, Icon } from '@strapi/design-system'; -import { Folder } from '@strapi/icons'; import { AssetType } from '../../constants'; import { createAssetUrl } from '../../utils'; diff --git a/packages/core/upload/admin/src/components/TableList/TableRows.js b/packages/core/upload/admin/src/components/TableList/TableRows.js index 15d1862810..6918be2adf 100644 --- a/packages/core/upload/admin/src/components/TableList/TableRows.js +++ b/packages/core/upload/admin/src/components/TableList/TableRows.js @@ -1,15 +1,17 @@ import React from 'react'; + +import { BaseCheckbox, Flex, IconButton, Tbody, Td, Tr } from '@strapi/design-system'; +import { onRowClick, stopPropagation } from '@strapi/helper-plugin'; +import { Eye, Pencil } from '@strapi/icons'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; import { Link } from 'react-router-dom'; -import { onRowClick, stopPropagation } from '@strapi/helper-plugin'; -import { BaseCheckbox, Flex, IconButton, Tbody, Td, Tr } from '@strapi/design-system'; -import { Pencil, Eye } from '@strapi/icons'; -import { CellContent } from './CellContent'; import { AssetDefinition, FolderDefinition, tableHeaders as cells } from '../../constants'; import { getTrad } from '../../utils'; +import { CellContent } from './CellContent'; + export const TableRows = ({ onChangeFolder, onEditAsset, diff --git a/packages/core/upload/admin/src/components/TableList/index.js b/packages/core/upload/admin/src/components/TableList/index.js index fefe7c93ac..b4c311da77 100644 --- a/packages/core/upload/admin/src/components/TableList/index.js +++ b/packages/core/upload/admin/src/components/TableList/index.js @@ -1,21 +1,23 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import { useIntl } from 'react-intl'; + import { BaseCheckbox, IconButton, Table, Th, Thead, - Tr, Tooltip, + Tr, Typography, VisuallyHidden, } from '@strapi/design-system'; import { CarretDown, CarretUp } from '@strapi/icons'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import { AssetDefinition, FolderDefinition, tableHeaders } from '../../constants'; import { getTrad } from '../../utils'; -import { AssetDefinition, tableHeaders, FolderDefinition } from '../../constants'; + import { TableRows } from './TableRows'; export const TableList = ({ diff --git a/packages/core/upload/admin/src/components/TableList/tests/CellContent.test.js b/packages/core/upload/admin/src/components/TableList/tests/CellContent.test.js index 1f97a27860..2f11cb9bf7 100644 --- a/packages/core/upload/admin/src/components/TableList/tests/CellContent.test.js +++ b/packages/core/upload/admin/src/components/TableList/tests/CellContent.test.js @@ -1,7 +1,8 @@ import React from 'react'; -import { IntlProvider } from 'react-intl'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render } from '@testing-library/react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; +import { IntlProvider } from 'react-intl'; import { CellContent } from '../CellContent'; diff --git a/packages/core/upload/admin/src/components/TableList/tests/PreviewCell.test.js b/packages/core/upload/admin/src/components/TableList/tests/PreviewCell.test.js index b2b3186a04..96b3f662cd 100644 --- a/packages/core/upload/admin/src/components/TableList/tests/PreviewCell.test.js +++ b/packages/core/upload/admin/src/components/TableList/tests/PreviewCell.test.js @@ -1,6 +1,7 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render } from '@testing-library/react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; import { PreviewCell } from '../PreviewCell'; diff --git a/packages/core/upload/admin/src/components/TableList/tests/TableList.test.js b/packages/core/upload/admin/src/components/TableList/tests/TableList.test.js index 17a3ee5631..0b9f6a4810 100644 --- a/packages/core/upload/admin/src/components/TableList/tests/TableList.test.js +++ b/packages/core/upload/admin/src/components/TableList/tests/TableList.test.js @@ -1,8 +1,9 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { fireEvent, render } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; import { MemoryRouter } from 'react-router-dom'; -import { render, fireEvent } from '@testing-library/react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; import { TableList } from '..'; diff --git a/packages/core/upload/admin/src/components/TableList/tests/TableRows.test.js b/packages/core/upload/admin/src/components/TableList/tests/TableRows.test.js index 05d7dc3f78..489bfabd9a 100644 --- a/packages/core/upload/admin/src/components/TableList/tests/TableRows.test.js +++ b/packages/core/upload/admin/src/components/TableList/tests/TableRows.test.js @@ -1,8 +1,9 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { fireEvent, render } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; import { MemoryRouter } from 'react-router-dom'; -import { render, fireEvent } from '@testing-library/react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; import { TableRows } from '../TableRows'; diff --git a/packages/core/upload/admin/src/components/UploadAssetDialog/AddAssetStep/AddAssetStep.js b/packages/core/upload/admin/src/components/UploadAssetDialog/AddAssetStep/AddAssetStep.js index c417485701..07de8e114a 100644 --- a/packages/core/upload/admin/src/components/UploadAssetDialog/AddAssetStep/AddAssetStep.js +++ b/packages/core/upload/admin/src/components/UploadAssetDialog/AddAssetStep/AddAssetStep.js @@ -1,21 +1,24 @@ import React from 'react'; -import PropTypes from 'prop-types'; + import { - ModalHeader, - Typography, - Divider, Box, - Tabs, + Divider, + ModalHeader, Tab, TabGroup, - TabPanels, TabPanel, + TabPanels, + Tabs, + Typography, } from '@strapi/design-system'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { FromUrlForm } from './FromUrlForm'; -import { FromComputerForm } from './FromComputerForm'; + import getTrad from '../../../utils/getTrad'; +import { FromComputerForm } from './FromComputerForm'; +import { FromUrlForm } from './FromUrlForm'; + export const AddAssetStep = ({ onClose, onAddAsset, trackedLocation }) => { const { formatMessage } = useIntl(); diff --git a/packages/core/upload/admin/src/components/UploadAssetDialog/AddAssetStep/FromComputerForm.js b/packages/core/upload/admin/src/components/UploadAssetDialog/AddAssetStep/FromComputerForm.js index 8b876c7d7a..9f5d93201e 100644 --- a/packages/core/upload/admin/src/components/UploadAssetDialog/AddAssetStep/FromComputerForm.js +++ b/packages/core/upload/admin/src/components/UploadAssetDialog/AddAssetStep/FromComputerForm.js @@ -1,14 +1,16 @@ /* eslint-disable jsx-a11y/label-has-associated-control */ import React, { useRef, useState } from 'react'; -import PropTypes from 'prop-types'; -import styled from 'styled-components'; -import { Box, Flex, Typography, ModalFooter, Button } from '@strapi/design-system'; + +import { Box, Button, Flex, ModalFooter, Typography } from '@strapi/design-system'; import { useTracking } from '@strapi/helper-plugin'; import { PicturePlus } from '@strapi/icons'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; +import styled from 'styled-components'; + +import { AssetSource } from '../../../constants'; import getTrad from '../../../utils/getTrad'; import { rawFileToAsset } from '../../../utils/rawFileToAsset'; -import { AssetSource } from '../../../constants'; const Wrapper = styled(Flex)` flex-direction: column; diff --git a/packages/core/upload/admin/src/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js b/packages/core/upload/admin/src/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js index c46e0150e9..7d5d9df1ec 100644 --- a/packages/core/upload/admin/src/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js +++ b/packages/core/upload/admin/src/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js @@ -1,12 +1,14 @@ import React, { useState } from 'react'; -import PropTypes from 'prop-types'; -import { Box, ModalFooter, Textarea, Button } from '@strapi/design-system'; -import { useIntl } from 'react-intl'; + +import { Box, Button, ModalFooter, Textarea } from '@strapi/design-system'; import { Form, useTracking } from '@strapi/helper-plugin'; import { Formik } from 'formik'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; + import getTrad from '../../../utils/getTrad'; -import { urlSchema } from '../../../utils/urlYupSchema'; import { urlsToAssets } from '../../../utils/urlsToAssets'; +import { urlSchema } from '../../../utils/urlYupSchema'; export const FromUrlForm = ({ onClose, onAddAsset, trackedLocation }) => { const [loading, setLoading] = useState(false); diff --git a/packages/core/upload/admin/src/components/UploadAssetDialog/AddAssetStep/tests/FromComputerForm.test.js b/packages/core/upload/admin/src/components/UploadAssetDialog/AddAssetStep/tests/FromComputerForm.test.js index e4dd77ad14..35f8ce0f8b 100644 --- a/packages/core/upload/admin/src/components/UploadAssetDialog/AddAssetStep/tests/FromComputerForm.test.js +++ b/packages/core/upload/admin/src/components/UploadAssetDialog/AddAssetStep/tests/FromComputerForm.test.js @@ -1,8 +1,10 @@ import React from 'react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import { render as renderTL } from '@testing-library/react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { TrackingProvider } from '@strapi/helper-plugin'; +import { render as renderTL } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; + import { FromComputerForm } from '../FromComputerForm'; jest.mock('@strapi/helper-plugin', () => ({ diff --git a/packages/core/upload/admin/src/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.js b/packages/core/upload/admin/src/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.js index 429e1411d4..2c385fb819 100644 --- a/packages/core/upload/admin/src/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.js +++ b/packages/core/upload/admin/src/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.js @@ -1,23 +1,24 @@ -import React, { useState, useRef } from 'react'; -import PropTypes from 'prop-types'; -import { useTracking } from '@strapi/helper-plugin'; +import React, { useRef, useState } from 'react'; + import { - ModalHeader, - ModalBody, - ModalFooter, - Typography, Button, Flex, Grid, GridItem, KeyboardNavigable, + ModalBody, + ModalFooter, + ModalHeader, + Typography, } from '@strapi/design-system'; +import { useTracking } from '@strapi/helper-plugin'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; +import { AssetDefinition } from '../../../constants'; +import getTrad from '../../../utils/getTrad'; import { AssetCard } from '../../AssetCard/AssetCard'; import { UploadingAssetCard } from '../../AssetCard/UploadingAssetCard'; -import getTrad from '../../../utils/getTrad'; -import { AssetDefinition } from '../../../constants'; const Status = { Idle: 'IDLE', diff --git a/packages/core/upload/admin/src/components/UploadAssetDialog/PendingAssetStep/tests/PendingAssetStep.test.js b/packages/core/upload/admin/src/components/UploadAssetDialog/PendingAssetStep/tests/PendingAssetStep.test.js index b8432873e3..a67fdde22a 100644 --- a/packages/core/upload/admin/src/components/UploadAssetDialog/PendingAssetStep/tests/PendingAssetStep.test.js +++ b/packages/core/upload/admin/src/components/UploadAssetDialog/PendingAssetStep/tests/PendingAssetStep.test.js @@ -1,8 +1,10 @@ import React from 'react'; -import { IntlProvider } from 'react-intl'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render as renderTL } from '@testing-library/react'; -import { QueryClientProvider, QueryClient } from 'react-query'; +import { IntlProvider } from 'react-intl'; +import { QueryClient, QueryClientProvider } from 'react-query'; + import { PendingAssetStep } from '../PendingAssetStep'; jest.mock('../../../../utils/getTrad', () => (x) => x); diff --git a/packages/core/upload/admin/src/components/UploadAssetDialog/UploadAssetDialog.js b/packages/core/upload/admin/src/components/UploadAssetDialog/UploadAssetDialog.js index d316078dfe..030369e122 100644 --- a/packages/core/upload/admin/src/components/UploadAssetDialog/UploadAssetDialog.js +++ b/packages/core/upload/admin/src/components/UploadAssetDialog/UploadAssetDialog.js @@ -1,12 +1,14 @@ import React, { useState } from 'react'; -import PropTypes from 'prop-types'; + import { ModalLayout } from '@strapi/design-system'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; +import { AssetDefinition } from '../../constants'; +import { EditAssetDialog } from '../EditAssetDialog'; + import { AddAssetStep } from './AddAssetStep/AddAssetStep'; import { PendingAssetStep } from './PendingAssetStep/PendingAssetStep'; -import { EditAssetDialog } from '../EditAssetDialog'; -import { AssetDefinition } from '../../constants'; const Steps = { AddAsset: 'AddAsset', diff --git a/packages/core/upload/admin/src/components/UploadAssetDialog/tests/UploadAssetDialog.test.js b/packages/core/upload/admin/src/components/UploadAssetDialog/tests/UploadAssetDialog.test.js index d572f30318..5a743587af 100644 --- a/packages/core/upload/admin/src/components/UploadAssetDialog/tests/UploadAssetDialog.test.js +++ b/packages/core/upload/admin/src/components/UploadAssetDialog/tests/UploadAssetDialog.test.js @@ -1,10 +1,13 @@ import React from 'react'; -import { render as renderTL, fireEvent, screen, waitFor, within } from '@testing-library/react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import { QueryClientProvider, QueryClient } from 'react-query'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { TrackingProvider } from '@strapi/helper-plugin'; +import { fireEvent, render as renderTL, screen, waitFor, within } from '@testing-library/react'; +import { QueryClient, QueryClientProvider } from 'react-query'; + import en from '../../../translations/en.json'; import { UploadAssetDialog } from '../UploadAssetDialog'; + import { server } from './server'; jest.mock('../../../utils/getTrad', () => (x) => x); diff --git a/packages/core/upload/admin/src/components/UploadProgress/index.js b/packages/core/upload/admin/src/components/UploadProgress/index.js index 8dbd24ba4f..8817e7487a 100644 --- a/packages/core/upload/admin/src/components/UploadProgress/index.js +++ b/packages/core/upload/admin/src/components/UploadProgress/index.js @@ -1,9 +1,10 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import styled from 'styled-components'; + +import { Flex, ProgressBar, Typography } from '@strapi/design-system'; import { Cross } from '@strapi/icons'; -import { Typography, Flex, ProgressBar } from '@strapi/design-system'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; +import styled from 'styled-components'; const BoxWrapper = styled(Flex)` border-radius: ${({ theme }) => `${theme.borderRadius} ${theme.borderRadius} 0 0`}; diff --git a/packages/core/upload/admin/src/components/UploadProgress/tests/index.test.js b/packages/core/upload/admin/src/components/UploadProgress/tests/index.test.js index 88706cc9c0..c7b402a482 100644 --- a/packages/core/upload/admin/src/components/UploadProgress/tests/index.test.js +++ b/packages/core/upload/admin/src/components/UploadProgress/tests/index.test.js @@ -5,10 +5,12 @@ */ import React from 'react'; -import { render, screen, fireEvent } from '@testing-library/react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { fireEvent, render, screen } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; import { QueryClient, QueryClientProvider } from 'react-query'; + import { UploadProgress } from '..'; import en from '../../../translations/en.json'; diff --git a/packages/core/upload/admin/src/constants.js b/packages/core/upload/admin/src/constants.js index d751aedbb1..d281ac9a74 100644 --- a/packages/core/upload/admin/src/constants.js +++ b/packages/core/upload/admin/src/constants.js @@ -1,4 +1,5 @@ import PropTypes from 'prop-types'; + import { getTrad } from './utils'; export const AssetType = { diff --git a/packages/core/upload/admin/src/hooks/tests/useAssets.test.js b/packages/core/upload/admin/src/hooks/tests/useAssets.test.js index c592a9017b..0096235e2f 100644 --- a/packages/core/upload/admin/src/hooks/tests/useAssets.test.js +++ b/packages/core/upload/admin/src/hooks/tests/useAssets.test.js @@ -1,13 +1,13 @@ import React from 'react'; + +import { lightTheme, ThemeProvider, useNotifyAT } from '@strapi/design-system'; +import { NotificationsProvider, useFetchClient, useNotification } from '@strapi/helper-plugin'; +import { act, renderHook, waitFor } from '@testing-library/react'; import { stringify } from 'qs'; import { IntlProvider } from 'react-intl'; -import { QueryClientProvider, QueryClient } from 'react-query'; -import { renderHook, act, waitFor } from '@testing-library/react'; +import { QueryClient, QueryClientProvider } from 'react-query'; import { BrowserRouter as Router, Route } from 'react-router-dom'; -import { NotificationsProvider, useNotification, useFetchClient } from '@strapi/helper-plugin'; -import { ThemeProvider, lightTheme, useNotifyAT } from '@strapi/design-system'; - import { useAssets } from '../useAssets'; const notifyStatusMock = jest.fn(); diff --git a/packages/core/upload/admin/src/hooks/tests/useBulkMove.test.js b/packages/core/upload/admin/src/hooks/tests/useBulkMove.test.js index aaf3d1e1b5..9d5bbda8b0 100644 --- a/packages/core/upload/admin/src/hooks/tests/useBulkMove.test.js +++ b/packages/core/upload/admin/src/hooks/tests/useBulkMove.test.js @@ -1,12 +1,12 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { NotificationsProvider, useFetchClient, useNotification } from '@strapi/helper-plugin'; +import { act, renderHook, waitFor } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; -import { QueryClientProvider, QueryClient, useQueryClient } from 'react-query'; -import { renderHook, act, waitFor } from '@testing-library/react'; +import { QueryClient, QueryClientProvider, useQueryClient } from 'react-query'; import { BrowserRouter as Router, Route } from 'react-router-dom'; -import { NotificationsProvider, useNotification, useFetchClient } from '@strapi/helper-plugin'; - -import { ThemeProvider, lightTheme } from '@strapi/design-system'; import { useBulkMove } from '../useBulkMove'; const FIXTURE_ASSETS = [ diff --git a/packages/core/upload/admin/src/hooks/tests/useBulkRemove.test.js b/packages/core/upload/admin/src/hooks/tests/useBulkRemove.test.js index 25011a6a64..cba73abe9f 100644 --- a/packages/core/upload/admin/src/hooks/tests/useBulkRemove.test.js +++ b/packages/core/upload/admin/src/hooks/tests/useBulkRemove.test.js @@ -1,12 +1,12 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { NotificationsProvider, useFetchClient, useNotification } from '@strapi/helper-plugin'; +import { act, renderHook, waitFor } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; -import { QueryClientProvider, QueryClient, useQueryClient } from 'react-query'; -import { renderHook, act, waitFor } from '@testing-library/react'; +import { QueryClient, QueryClientProvider, useQueryClient } from 'react-query'; import { BrowserRouter as Router, Route } from 'react-router-dom'; -import { NotificationsProvider, useNotification, useFetchClient } from '@strapi/helper-plugin'; - -import { ThemeProvider, lightTheme } from '@strapi/design-system'; import { useBulkRemove } from '../useBulkRemove'; const FIXTURE_ASSETS = [ diff --git a/packages/core/upload/admin/src/hooks/tests/useConfig.test.js b/packages/core/upload/admin/src/hooks/tests/useConfig.test.js index 13fbef430e..feda81ee0c 100644 --- a/packages/core/upload/admin/src/hooks/tests/useConfig.test.js +++ b/packages/core/upload/admin/src/hooks/tests/useConfig.test.js @@ -1,15 +1,15 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { NotificationsProvider, useFetchClient, useNotification } from '@strapi/helper-plugin'; +import { act, renderHook, waitFor } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; -import { QueryClientProvider, QueryClient, useQueryClient } from 'react-query'; -import { renderHook, act, waitFor } from '@testing-library/react'; +import { QueryClient, QueryClientProvider, useQueryClient } from 'react-query'; import { BrowserRouter as Router, Route } from 'react-router-dom'; -import { NotificationsProvider, useNotification, useFetchClient } from '@strapi/helper-plugin'; - -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import { sortOptions, pageSizes } from '../../constants'; -import { useConfig } from '../useConfig'; +import { pageSizes, sortOptions } from '../../constants'; import pluginId from '../../pluginId'; +import { useConfig } from '../useConfig'; const mockGetResponse = { data: { diff --git a/packages/core/upload/admin/src/hooks/tests/useEditFolder.test.js b/packages/core/upload/admin/src/hooks/tests/useEditFolder.test.js index 694dc7191e..d08514be85 100644 --- a/packages/core/upload/admin/src/hooks/tests/useEditFolder.test.js +++ b/packages/core/upload/admin/src/hooks/tests/useEditFolder.test.js @@ -1,12 +1,12 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { NotificationsProvider, useFetchClient, useNotification } from '@strapi/helper-plugin'; +import { act, renderHook, waitFor } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; -import { QueryClientProvider, QueryClient, useQueryClient } from 'react-query'; -import { renderHook, act, waitFor } from '@testing-library/react'; +import { QueryClient, QueryClientProvider, useQueryClient } from 'react-query'; import { BrowserRouter as Router, Route } from 'react-router-dom'; -import { NotificationsProvider, useNotification, useFetchClient } from '@strapi/helper-plugin'; - -import { ThemeProvider, lightTheme } from '@strapi/design-system'; import { useEditFolder } from '../useEditFolder'; const FOLDER_CREATE_FIXTURE = { diff --git a/packages/core/upload/admin/src/hooks/tests/useFolder.test.js b/packages/core/upload/admin/src/hooks/tests/useFolder.test.js index f31f0c305d..449a927656 100644 --- a/packages/core/upload/admin/src/hooks/tests/useFolder.test.js +++ b/packages/core/upload/admin/src/hooks/tests/useFolder.test.js @@ -1,11 +1,11 @@ import React from 'react'; -import { IntlProvider } from 'react-intl'; -import { QueryClientProvider, QueryClient } from 'react-query'; -import { renderHook, act, waitFor } from '@testing-library/react'; -import { BrowserRouter as Router, Route } from 'react-router-dom'; -import { NotificationsProvider, useNotification, useFetchClient } from '@strapi/helper-plugin'; -import { useNotifyAT, ThemeProvider, lightTheme } from '@strapi/design-system'; +import { lightTheme, ThemeProvider, useNotifyAT } from '@strapi/design-system'; +import { NotificationsProvider, useFetchClient, useNotification } from '@strapi/helper-plugin'; +import { act, renderHook, waitFor } from '@testing-library/react'; +import { IntlProvider } from 'react-intl'; +import { QueryClient, QueryClientProvider } from 'react-query'; +import { BrowserRouter as Router, Route } from 'react-router-dom'; import { useFolder } from '../useFolder'; diff --git a/packages/core/upload/admin/src/hooks/tests/useFolderStructure.test.js b/packages/core/upload/admin/src/hooks/tests/useFolderStructure.test.js index a79882b632..2f540076b1 100644 --- a/packages/core/upload/admin/src/hooks/tests/useFolderStructure.test.js +++ b/packages/core/upload/admin/src/hooks/tests/useFolderStructure.test.js @@ -1,9 +1,9 @@ import React from 'react'; -import { QueryClientProvider, QueryClient } from 'react-query'; -import { renderHook, act, waitFor } from '@testing-library/react'; -import { IntlProvider } from 'react-intl'; import { useFetchClient } from '@strapi/helper-plugin'; +import { act, renderHook, waitFor } from '@testing-library/react'; +import { IntlProvider } from 'react-intl'; +import { QueryClient, QueryClientProvider } from 'react-query'; import { useFolderStructure } from '../useFolderStructure'; diff --git a/packages/core/upload/admin/src/hooks/tests/useFolders.test.js b/packages/core/upload/admin/src/hooks/tests/useFolders.test.js index c592e6dcc8..3cb4b1e8d1 100644 --- a/packages/core/upload/admin/src/hooks/tests/useFolders.test.js +++ b/packages/core/upload/admin/src/hooks/tests/useFolders.test.js @@ -1,13 +1,13 @@ import React from 'react'; + +import { lightTheme, ThemeProvider, useNotifyAT } from '@strapi/design-system'; +import { NotificationsProvider, useFetchClient, useNotification } from '@strapi/helper-plugin'; +import { act, renderHook, waitFor } from '@testing-library/react'; import { stringify } from 'qs'; import { IntlProvider } from 'react-intl'; -import { QueryClientProvider, QueryClient } from 'react-query'; -import { renderHook, act, waitFor } from '@testing-library/react'; +import { QueryClient, QueryClientProvider } from 'react-query'; import { BrowserRouter as Router, Route } from 'react-router-dom'; -import { NotificationsProvider, useNotification, useFetchClient } from '@strapi/helper-plugin'; -import { useNotifyAT, ThemeProvider, lightTheme } from '@strapi/design-system'; - import { useFolders } from '../useFolders'; const notifyStatusMock = jest.fn(); diff --git a/packages/core/upload/admin/src/hooks/tests/useModalQueryParams.test.js b/packages/core/upload/admin/src/hooks/tests/useModalQueryParams.test.js index 79db1d308b..03dcc22b9b 100644 --- a/packages/core/upload/admin/src/hooks/tests/useModalQueryParams.test.js +++ b/packages/core/upload/admin/src/hooks/tests/useModalQueryParams.test.js @@ -1,10 +1,11 @@ import React from 'react'; -import { IntlProvider } from 'react-intl'; -import { QueryClientProvider, QueryClient } from 'react-query'; -import { renderHook, act } from '@testing-library/react'; -import { BrowserRouter as Router, Route } from 'react-router-dom'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { NotificationsProvider } from '@strapi/helper-plugin'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; +import { act, renderHook } from '@testing-library/react'; +import { IntlProvider } from 'react-intl'; +import { QueryClient, QueryClientProvider } from 'react-query'; +import { BrowserRouter as Router, Route } from 'react-router-dom'; import useModalQueryParams from '../useModalQueryParams'; diff --git a/packages/core/upload/admin/src/hooks/tests/useRemoveAsset.test.js b/packages/core/upload/admin/src/hooks/tests/useRemoveAsset.test.js index d0072540cb..f6661da686 100644 --- a/packages/core/upload/admin/src/hooks/tests/useRemoveAsset.test.js +++ b/packages/core/upload/admin/src/hooks/tests/useRemoveAsset.test.js @@ -1,12 +1,12 @@ import React from 'react'; -import { IntlProvider } from 'react-intl'; -import { QueryClientProvider, QueryClient, useQueryClient } from 'react-query'; -import { renderHook, act, waitFor } from '@testing-library/react'; +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { NotificationsProvider, useNotification } from '@strapi/helper-plugin'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import { deleteRequest } from '../../utils/deleteRequest'; +import { act, renderHook, waitFor } from '@testing-library/react'; +import { IntlProvider } from 'react-intl'; +import { QueryClient, QueryClientProvider, useQueryClient } from 'react-query'; +import { deleteRequest } from '../../utils/deleteRequest'; import { useRemoveAsset } from '../useRemoveAsset'; const ASSET_FIXTURE = { diff --git a/packages/core/upload/admin/src/hooks/useAssets.js b/packages/core/upload/admin/src/hooks/useAssets.js index a41feeeaa2..dd42149b54 100644 --- a/packages/core/upload/admin/src/hooks/useAssets.js +++ b/packages/core/upload/admin/src/hooks/useAssets.js @@ -1,8 +1,8 @@ -import { stringify } from 'qs'; -import { useQuery } from 'react-query'; import { useNotifyAT } from '@strapi/design-system'; -import { useNotification, useFetchClient } from '@strapi/helper-plugin'; +import { useFetchClient, useNotification } from '@strapi/helper-plugin'; +import { stringify } from 'qs'; import { useIntl } from 'react-intl'; +import { useQuery } from 'react-query'; import pluginId from '../pluginId'; import { getRequestUrl } from '../utils'; diff --git a/packages/core/upload/admin/src/hooks/useBulkMove.js b/packages/core/upload/admin/src/hooks/useBulkMove.js index 6958bd27ff..228ec13c41 100644 --- a/packages/core/upload/admin/src/hooks/useBulkMove.js +++ b/packages/core/upload/admin/src/hooks/useBulkMove.js @@ -1,5 +1,5 @@ +import { useFetchClient, useNotification } from '@strapi/helper-plugin'; import { useMutation, useQueryClient } from 'react-query'; -import { useNotification, useFetchClient } from '@strapi/helper-plugin'; import pluginId from '../pluginId'; import { getRequestUrl, getTrad } from '../utils'; diff --git a/packages/core/upload/admin/src/hooks/useBulkRemove.js b/packages/core/upload/admin/src/hooks/useBulkRemove.js index 3f099223eb..ae2038dcf4 100644 --- a/packages/core/upload/admin/src/hooks/useBulkRemove.js +++ b/packages/core/upload/admin/src/hooks/useBulkRemove.js @@ -1,5 +1,5 @@ +import { useFetchClient, useNotification } from '@strapi/helper-plugin'; import { useMutation, useQueryClient } from 'react-query'; -import { useNotification, useFetchClient } from '@strapi/helper-plugin'; import pluginId from '../pluginId'; import { getRequestUrl, getTrad } from '../utils'; diff --git a/packages/core/upload/admin/src/hooks/useConfig.js b/packages/core/upload/admin/src/hooks/useConfig.js index b470917028..858e762b83 100644 --- a/packages/core/upload/admin/src/hooks/useConfig.js +++ b/packages/core/upload/admin/src/hooks/useConfig.js @@ -1,5 +1,5 @@ +import { useFetchClient, useNotification, useTracking } from '@strapi/helper-plugin'; import { useMutation, useQuery, useQueryClient } from 'react-query'; -import { useNotification, useTracking, useFetchClient } from '@strapi/helper-plugin'; import pluginId from '../pluginId'; diff --git a/packages/core/upload/admin/src/hooks/useCropImg.js b/packages/core/upload/admin/src/hooks/useCropImg.js index 1531830317..53613908de 100644 --- a/packages/core/upload/admin/src/hooks/useCropImg.js +++ b/packages/core/upload/admin/src/hooks/useCropImg.js @@ -1,5 +1,6 @@ +import { useEffect, useRef, useState } from 'react'; + import Cropper from 'cropperjs'; -import { useRef, useEffect, useState } from 'react'; const QUALITY = 1; diff --git a/packages/core/upload/admin/src/hooks/useEditAsset.js b/packages/core/upload/admin/src/hooks/useEditAsset.js index e1f3efc13e..ef36694975 100644 --- a/packages/core/upload/admin/src/hooks/useEditAsset.js +++ b/packages/core/upload/admin/src/hooks/useEditAsset.js @@ -1,11 +1,12 @@ -import axios from 'axios'; import { useRef, useState } from 'react'; -import { useMutation, useQueryClient } from 'react-query'; -import { useIntl } from 'react-intl'; -import { useNotification, useFetchClient } from '@strapi/helper-plugin'; -import { getTrad } from '../utils'; +import { useFetchClient, useNotification } from '@strapi/helper-plugin'; +import axios from 'axios'; +import { useIntl } from 'react-intl'; +import { useMutation, useQueryClient } from 'react-query'; + import pluginId from '../pluginId'; +import { getTrad } from '../utils'; const editAssetRequest = (asset, file, cancelToken, onProgress, post) => { const endpoint = `/${pluginId}?id=${asset.id}`; diff --git a/packages/core/upload/admin/src/hooks/useEditFolder.js b/packages/core/upload/admin/src/hooks/useEditFolder.js index 661496df9b..25c4ad40e7 100644 --- a/packages/core/upload/admin/src/hooks/useEditFolder.js +++ b/packages/core/upload/admin/src/hooks/useEditFolder.js @@ -1,5 +1,5 @@ -import { useMutation, useQueryClient } from 'react-query'; import { useFetchClient } from '@strapi/helper-plugin'; +import { useMutation, useQueryClient } from 'react-query'; import pluginId from '../pluginId'; import { getRequestUrl } from '../utils'; diff --git a/packages/core/upload/admin/src/hooks/useFolder.js b/packages/core/upload/admin/src/hooks/useFolder.js index 916a3dc774..d522b4a4f3 100644 --- a/packages/core/upload/admin/src/hooks/useFolder.js +++ b/packages/core/upload/admin/src/hooks/useFolder.js @@ -1,5 +1,5 @@ +import { useFetchClient, useNotification } from '@strapi/helper-plugin'; import { useQuery } from 'react-query'; -import { useNotification, useFetchClient } from '@strapi/helper-plugin'; import pluginId from '../pluginId'; import { getRequestUrl, getTrad } from '../utils'; diff --git a/packages/core/upload/admin/src/hooks/useFolderStructure.js b/packages/core/upload/admin/src/hooks/useFolderStructure.js index 197fc7c101..2237a97a23 100644 --- a/packages/core/upload/admin/src/hooks/useFolderStructure.js +++ b/packages/core/upload/admin/src/hooks/useFolderStructure.js @@ -1,8 +1,10 @@ -import { useQuery } from 'react-query'; -import { useIntl } from 'react-intl'; import { useFetchClient } from '@strapi/helper-plugin'; +import { useIntl } from 'react-intl'; +import { useQuery } from 'react-query'; + import pluginId from '../pluginId'; import { getRequestUrl, getTrad } from '../utils'; + import { recursiveRenameKeys } from './utils/rename-keys'; const FIELD_MAPPING = { diff --git a/packages/core/upload/admin/src/hooks/useFolders.js b/packages/core/upload/admin/src/hooks/useFolders.js index db73a2021f..f3bc994b84 100644 --- a/packages/core/upload/admin/src/hooks/useFolders.js +++ b/packages/core/upload/admin/src/hooks/useFolders.js @@ -1,8 +1,8 @@ -import { stringify } from 'qs'; -import { useQuery } from 'react-query'; import { useNotifyAT } from '@strapi/design-system'; -import { useNotification, useFetchClient } from '@strapi/helper-plugin'; +import { useFetchClient, useNotification } from '@strapi/helper-plugin'; +import { stringify } from 'qs'; import { useIntl } from 'react-intl'; +import { useQuery } from 'react-query'; import pluginId from '../pluginId'; import { getRequestUrl } from '../utils'; diff --git a/packages/core/upload/admin/src/hooks/useMediaLibraryPermissions.js b/packages/core/upload/admin/src/hooks/useMediaLibraryPermissions.js index 6797416293..8a3acb2e24 100644 --- a/packages/core/upload/admin/src/hooks/useMediaLibraryPermissions.js +++ b/packages/core/upload/admin/src/hooks/useMediaLibraryPermissions.js @@ -1,6 +1,8 @@ import { useMemo } from 'react'; + import { useRBAC } from '@strapi/helper-plugin'; import omit from 'lodash/omit'; + import pluginPermissions from '../permissions'; export const useMediaLibraryPermissions = () => { diff --git a/packages/core/upload/admin/src/hooks/useModalQueryParams.js b/packages/core/upload/admin/src/hooks/useModalQueryParams.js index fab8f84947..d7b7f03ab5 100644 --- a/packages/core/upload/admin/src/hooks/useModalQueryParams.js +++ b/packages/core/upload/admin/src/hooks/useModalQueryParams.js @@ -1,7 +1,8 @@ -import { useState, useEffect } from 'react'; -import { useTracking } from '@strapi/helper-plugin'; +import { useEffect, useState } from 'react'; +import { useTracking } from '@strapi/helper-plugin'; import { stringify } from 'qs'; + import { useConfig } from './useConfig'; const useModalQueryParams = (initialState) => { diff --git a/packages/core/upload/admin/src/hooks/useRemoveAsset.js b/packages/core/upload/admin/src/hooks/useRemoveAsset.js index cb8395784a..8b2041a2cf 100644 --- a/packages/core/upload/admin/src/hooks/useRemoveAsset.js +++ b/packages/core/upload/admin/src/hooks/useRemoveAsset.js @@ -1,8 +1,8 @@ -import { useMutation, useQueryClient } from 'react-query'; import { useNotification } from '@strapi/helper-plugin'; +import { useMutation, useQueryClient } from 'react-query'; -import { deleteRequest } from '../utils/deleteRequest'; import pluginId from '../pluginId'; +import { deleteRequest } from '../utils/deleteRequest'; export const useRemoveAsset = (onSuccess) => { const toggleNotification = useNotification(); diff --git a/packages/core/upload/admin/src/hooks/useUpload.js b/packages/core/upload/admin/src/hooks/useUpload.js index 8efd04ff17..65017251bc 100644 --- a/packages/core/upload/admin/src/hooks/useUpload.js +++ b/packages/core/upload/admin/src/hooks/useUpload.js @@ -1,11 +1,12 @@ -import axios from 'axios'; import { useRef, useState } from 'react'; -import { useMutation, useQueryClient } from 'react-query'; -import { useIntl } from 'react-intl'; -import { useFetchClient } from '@strapi/helper-plugin'; -import { getTrad } from '../utils'; +import { useFetchClient } from '@strapi/helper-plugin'; +import axios from 'axios'; +import { useIntl } from 'react-intl'; +import { useMutation, useQueryClient } from 'react-query'; + import pluginId from '../pluginId'; +import { getTrad } from '../utils'; const endpoint = `/${pluginId}`; diff --git a/packages/core/upload/admin/src/index.js b/packages/core/upload/admin/src/index.js index 768c3c49a9..38de6efbb3 100644 --- a/packages/core/upload/admin/src/index.js +++ b/packages/core/upload/admin/src/index.js @@ -5,11 +5,13 @@ // Also the strapi-generate-plugins/files/admin/src/index.js needs to be updated // IF THE DOC IS NOT UPDATED THE PULL REQUEST WILL NOT BE MERGED import { prefixPluginTranslations } from '@strapi/helper-plugin'; + import pluginPkg from '../../package.json'; + +import { MediaLibraryDialog } from './components/MediaLibraryDialog'; +import { MediaLibraryInput } from './components/MediaLibraryInput'; import PluginIcon from './components/PluginIcon'; import pluginPermissions from './permissions'; -import { MediaLibraryInput } from './components/MediaLibraryInput'; -import { MediaLibraryDialog } from './components/MediaLibraryDialog'; import pluginId from './pluginId'; import getTrad from './utils/getTrad'; diff --git a/packages/core/upload/admin/src/pages/App/ConfigureTheView/components/Settings.js b/packages/core/upload/admin/src/pages/App/ConfigureTheView/components/Settings.js index edee743356..12cefe16c0 100644 --- a/packages/core/upload/admin/src/pages/App/ConfigureTheView/components/Settings.js +++ b/packages/core/upload/admin/src/pages/App/ConfigureTheView/components/Settings.js @@ -1,9 +1,11 @@ import React from 'react'; + +import { Box, Grid, GridItem, Option, Select } from '@strapi/design-system'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { Grid, GridItem, Box, Select, Option } from '@strapi/design-system'; -import getTrad from '../../../../utils/getTrad'; + import { pageSizes, sortOptions } from '../../../../constants'; +import getTrad from '../../../../utils/getTrad'; const Settings = ({ sort = '', pageSize = 10, onChange }) => { const { formatMessage } = useIntl(); diff --git a/packages/core/upload/admin/src/pages/App/ConfigureTheView/components/tests/Settings.test.js b/packages/core/upload/admin/src/pages/App/ConfigureTheView/components/tests/Settings.test.js index 4a7b989284..84a5d48ee4 100644 --- a/packages/core/upload/admin/src/pages/App/ConfigureTheView/components/tests/Settings.test.js +++ b/packages/core/upload/admin/src/pages/App/ConfigureTheView/components/tests/Settings.test.js @@ -1,13 +1,14 @@ import React from 'react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { TrackingProvider } from '@strapi/helper-plugin'; import { render as renderRTL } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { TrackingProvider } from '@strapi/helper-plugin'; -import { MemoryRouter } from 'react-router-dom'; import { IntlProvider } from 'react-intl'; +import { MemoryRouter } from 'react-router-dom'; -import { Settings } from '../Settings'; import { pageSizes, sortOptions } from '../../../../../constants'; +import { Settings } from '../Settings'; const testPageSize = pageSizes[0]; const testSort = sortOptions[0].value; diff --git a/packages/core/upload/admin/src/pages/App/ConfigureTheView/index.js b/packages/core/upload/admin/src/pages/App/ConfigureTheView/index.js index 071640c1b8..b204b44d07 100644 --- a/packages/core/upload/admin/src/pages/App/ConfigureTheView/index.js +++ b/packages/core/upload/admin/src/pages/App/ConfigureTheView/index.js @@ -1,26 +1,26 @@ -import React, { useState, useReducer } from 'react'; -import { useIntl } from 'react-intl'; -import isEqual from 'lodash/isEqual'; -import PropTypes from 'prop-types'; +import React, { useReducer, useState } from 'react'; -import { Layout, HeaderLayout, ContentLayout, Button, Main } from '@strapi/design-system'; +import { Button, ContentLayout, HeaderLayout, Layout, Main } from '@strapi/design-system'; import { - useNotification, ConfirmDialog, Link, - useTracking, useFocusWhenNavigate, + useNotification, + useTracking, } from '@strapi/helper-plugin'; -import { Check, ArrowLeft } from '@strapi/icons'; -import { Settings } from './components/Settings'; - -import reducer from './state/reducer'; -import { init, initialState } from './state/init'; -import { onChange, setLoaded } from './state/actions'; +import { ArrowLeft, Check } from '@strapi/icons'; +import isEqual from 'lodash/isEqual'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import { useConfig } from '../../../hooks/useConfig'; import pluginID from '../../../pluginId'; import getTrad from '../../../utils/getTrad'; -import { useConfig } from '../../../hooks/useConfig'; + +import { Settings } from './components/Settings'; +import { onChange, setLoaded } from './state/actions'; +import { init, initialState } from './state/init'; +import reducer from './state/reducer'; const ConfigureTheView = ({ config }) => { const { trackUsage } = useTracking(); diff --git a/packages/core/upload/admin/src/pages/App/ConfigureTheView/state/actions.js b/packages/core/upload/admin/src/pages/App/ConfigureTheView/state/actions.js index a3f008a649..bb85d9f24b 100644 --- a/packages/core/upload/admin/src/pages/App/ConfigureTheView/state/actions.js +++ b/packages/core/upload/admin/src/pages/App/ConfigureTheView/state/actions.js @@ -1,4 +1,4 @@ -import { SET_LOADED, ON_CHANGE } from './actionTypes'; +import { ON_CHANGE, SET_LOADED } from './actionTypes'; export const onChange = ({ name, value }) => ({ type: ON_CHANGE, diff --git a/packages/core/upload/admin/src/pages/App/ConfigureTheView/state/reducer.js b/packages/core/upload/admin/src/pages/App/ConfigureTheView/state/reducer.js index 2de14d76b1..33758f14af 100644 --- a/packages/core/upload/admin/src/pages/App/ConfigureTheView/state/reducer.js +++ b/packages/core/upload/admin/src/pages/App/ConfigureTheView/state/reducer.js @@ -1,6 +1,7 @@ import produce from 'immer'; // current -import set from 'lodash/set'; import get from 'lodash/get'; +import set from 'lodash/set'; + import { ON_CHANGE, SET_LOADED } from './actionTypes'; import { init, initialState } from './init'; diff --git a/packages/core/upload/admin/src/pages/App/ConfigureTheView/state/tests/reducer.test.js b/packages/core/upload/admin/src/pages/App/ConfigureTheView/state/tests/reducer.test.js index ff98a83bbd..abb6bb191d 100644 --- a/packages/core/upload/admin/src/pages/App/ConfigureTheView/state/tests/reducer.test.js +++ b/packages/core/upload/admin/src/pages/App/ConfigureTheView/state/tests/reducer.test.js @@ -1,5 +1,5 @@ -import reducer from '../reducer'; import { ON_CHANGE, SET_LOADED } from '../actionTypes'; +import reducer from '../reducer'; describe('Upload | ConfigureTheView | reducer', () => { let state; diff --git a/packages/core/upload/admin/src/pages/App/ConfigureTheView/tests/ConfigureTheView.test.js b/packages/core/upload/admin/src/pages/App/ConfigureTheView/tests/ConfigureTheView.test.js index a8a816a847..1f134003f6 100644 --- a/packages/core/upload/admin/src/pages/App/ConfigureTheView/tests/ConfigureTheView.test.js +++ b/packages/core/upload/admin/src/pages/App/ConfigureTheView/tests/ConfigureTheView.test.js @@ -1,12 +1,14 @@ import React from 'react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import { render as renderRTL, waitFor, fireEvent } from '@testing-library/react'; -import userEvent from '@testing-library/user-event'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { TrackingProvider } from '@strapi/helper-plugin'; -import { MemoryRouter } from 'react-router-dom'; +import { fireEvent, render as renderRTL, waitFor } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; import { IntlProvider } from 'react-intl'; +import { MemoryRouter } from 'react-router-dom'; + import ConfigureTheView from '..'; -import { sortOptions, pageSizes } from '../../../../constants'; +import { pageSizes, sortOptions } from '../../../../constants'; const mutateAsync = jest.fn(); jest.mock('../../../../hooks/useConfig', () => ({ diff --git a/packages/core/upload/admin/src/pages/App/MediaLibrary/components/BulkActions.js b/packages/core/upload/admin/src/pages/App/MediaLibrary/components/BulkActions.js index cb3f441a0f..58ebb7a94a 100644 --- a/packages/core/upload/admin/src/pages/App/MediaLibrary/components/BulkActions.js +++ b/packages/core/upload/admin/src/pages/App/MediaLibrary/components/BulkActions.js @@ -1,10 +1,12 @@ import React from 'react'; + +import { Flex, Typography } from '@strapi/design-system'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { Flex, Typography } from '@strapi/design-system'; import { AssetDefinition, FolderDefinition } from '../../../../constants'; import getTrad from '../../../../utils/getTrad'; + import { BulkDeleteButton } from './BulkDeleteButton'; import { BulkMoveButton } from './BulkMoveButton'; diff --git a/packages/core/upload/admin/src/pages/App/MediaLibrary/components/BulkDeleteButton.js b/packages/core/upload/admin/src/pages/App/MediaLibrary/components/BulkDeleteButton.js index 43555811de..2a793ebd5d 100644 --- a/packages/core/upload/admin/src/pages/App/MediaLibrary/components/BulkDeleteButton.js +++ b/packages/core/upload/admin/src/pages/App/MediaLibrary/components/BulkDeleteButton.js @@ -1,9 +1,10 @@ import React, { useState } from 'react'; + +import { Button } from '@strapi/design-system'; +import { ConfirmDialog } from '@strapi/helper-plugin'; +import { Trash } from '@strapi/icons'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { Button } from '@strapi/design-system'; -import { Trash } from '@strapi/icons'; -import { ConfirmDialog } from '@strapi/helper-plugin'; import { AssetDefinition, FolderDefinition } from '../../../../constants'; import { useBulkRemove } from '../../../../hooks/useBulkRemove'; diff --git a/packages/core/upload/admin/src/pages/App/MediaLibrary/components/BulkMoveButton.js b/packages/core/upload/admin/src/pages/App/MediaLibrary/components/BulkMoveButton.js index 05f5d2561b..1acf538b87 100644 --- a/packages/core/upload/admin/src/pages/App/MediaLibrary/components/BulkMoveButton.js +++ b/packages/core/upload/admin/src/pages/App/MediaLibrary/components/BulkMoveButton.js @@ -1,8 +1,9 @@ import React, { useState } from 'react'; -import PropTypes from 'prop-types'; -import { useIntl } from 'react-intl'; + import { Button } from '@strapi/design-system'; import { Folder } from '@strapi/icons'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; import { BulkMoveDialog } from '../../../../components/BulkMoveDialog'; import { AssetDefinition, FolderDefinition } from '../../../../constants'; diff --git a/packages/core/upload/admin/src/pages/App/MediaLibrary/components/EmptyOrNoPermissions.js b/packages/core/upload/admin/src/pages/App/MediaLibrary/components/EmptyOrNoPermissions.js index 8841974bde..1a7dac251d 100644 --- a/packages/core/upload/admin/src/pages/App/MediaLibrary/components/EmptyOrNoPermissions.js +++ b/packages/core/upload/admin/src/pages/App/MediaLibrary/components/EmptyOrNoPermissions.js @@ -1,9 +1,9 @@ -import PropTypes from 'prop-types'; import React from 'react'; -import { useIntl } from 'react-intl'; import { Button } from '@strapi/design-system'; import { EmptyPermissions, Plus } from '@strapi/icons'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; import { EmptyAssets } from '../../../../components/EmptyAssets'; import { getTrad } from '../../../../utils'; diff --git a/packages/core/upload/admin/src/pages/App/MediaLibrary/components/Filters.js b/packages/core/upload/admin/src/pages/App/MediaLibrary/components/Filters.js index 010ba079f5..9bcb87f9f5 100644 --- a/packages/core/upload/admin/src/pages/App/MediaLibrary/components/Filters.js +++ b/packages/core/upload/admin/src/pages/App/MediaLibrary/components/Filters.js @@ -1,8 +1,10 @@ -import React, { useState, useRef } from 'react'; +import React, { useRef, useState } from 'react'; + import { Button } from '@strapi/design-system'; import { useQueryParams, useTracking } from '@strapi/helper-plugin'; import { Filter } from '@strapi/icons'; import { useIntl } from 'react-intl'; + import FilterList from '../../../../components/FilterList'; import FilterPopover from '../../../../components/FilterPopover'; import displayedFilters from '../../../../utils/displayedFilters'; diff --git a/packages/core/upload/admin/src/pages/App/MediaLibrary/components/Header.js b/packages/core/upload/admin/src/pages/App/MediaLibrary/components/Header.js index 7e82815b09..e54b1f920d 100644 --- a/packages/core/upload/admin/src/pages/App/MediaLibrary/components/Header.js +++ b/packages/core/upload/admin/src/pages/App/MediaLibrary/components/Header.js @@ -1,14 +1,16 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import { useIntl } from 'react-intl'; -import { stringify } from 'qs'; -import { useLocation } from 'react-router-dom'; + +import { Button, Flex, HeaderLayout, Link } from '@strapi/design-system'; import { useQueryParams } from '@strapi/helper-plugin'; -import { HeaderLayout, Button, Flex, Link } from '@strapi/design-system'; import { ArrowLeft, Plus } from '@strapi/icons'; -import { getTrad } from '../../../../utils'; -import { FolderDefinition, BreadcrumbsDefinition } from '../../../../constants'; +import PropTypes from 'prop-types'; +import { stringify } from 'qs'; +import { useIntl } from 'react-intl'; +import { useLocation } from 'react-router-dom'; + import { Breadcrumbs } from '../../../../components/Breadcrumbs'; +import { BreadcrumbsDefinition, FolderDefinition } from '../../../../constants'; +import { getTrad } from '../../../../utils'; export const Header = ({ breadcrumbs, diff --git a/packages/core/upload/admin/src/pages/App/MediaLibrary/components/tests/BulkActions.test.js b/packages/core/upload/admin/src/pages/App/MediaLibrary/components/tests/BulkActions.test.js index 6e0ac2d54b..caf4ed931e 100644 --- a/packages/core/upload/admin/src/pages/App/MediaLibrary/components/tests/BulkActions.test.js +++ b/packages/core/upload/admin/src/pages/App/MediaLibrary/components/tests/BulkActions.test.js @@ -1,9 +1,10 @@ import React from 'react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import { QueryClientProvider, QueryClient } from 'react-query'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render } from '@testing-library/react'; -import { MemoryRouter } from 'react-router-dom'; import { IntlProvider } from 'react-intl'; +import { QueryClient, QueryClientProvider } from 'react-query'; +import { MemoryRouter } from 'react-router-dom'; import { BulkActions } from '../BulkActions'; diff --git a/packages/core/upload/admin/src/pages/App/MediaLibrary/components/tests/BulkDeleteButton.test.js b/packages/core/upload/admin/src/pages/App/MediaLibrary/components/tests/BulkDeleteButton.test.js index 08c70b0da4..b3e4d1ab3e 100644 --- a/packages/core/upload/admin/src/pages/App/MediaLibrary/components/tests/BulkDeleteButton.test.js +++ b/packages/core/upload/admin/src/pages/App/MediaLibrary/components/tests/BulkDeleteButton.test.js @@ -1,12 +1,13 @@ import React from 'react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import { QueryClientProvider, QueryClient } from 'react-query'; -import { render, fireEvent, waitFor, act } from '@testing-library/react'; -import { MemoryRouter } from 'react-router-dom'; -import { IntlProvider } from 'react-intl'; -import { BulkDeleteButton } from '../BulkDeleteButton'; +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { act, fireEvent, render, waitFor } from '@testing-library/react'; +import { IntlProvider } from 'react-intl'; +import { QueryClient, QueryClientProvider } from 'react-query'; +import { MemoryRouter } from 'react-router-dom'; + import { useBulkRemove } from '../../../../../hooks/useBulkRemove'; +import { BulkDeleteButton } from '../BulkDeleteButton'; jest.mock('../../../../../hooks/useBulkRemove'); diff --git a/packages/core/upload/admin/src/pages/App/MediaLibrary/components/tests/BulkMoveButton.test.js b/packages/core/upload/admin/src/pages/App/MediaLibrary/components/tests/BulkMoveButton.test.js index dcf82171fd..c2ef3c260c 100644 --- a/packages/core/upload/admin/src/pages/App/MediaLibrary/components/tests/BulkMoveButton.test.js +++ b/packages/core/upload/admin/src/pages/App/MediaLibrary/components/tests/BulkMoveButton.test.js @@ -1,13 +1,14 @@ import React from 'react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import { QueryClientProvider, QueryClient } from 'react-query'; -import { render, fireEvent, waitFor, act, screen } from '@testing-library/react'; -import { within } from '@testing-library/dom'; -import { MemoryRouter } from 'react-router-dom'; -import { IntlProvider } from 'react-intl'; -import { BulkMoveButton } from '../BulkMoveButton'; +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { within } from '@testing-library/dom'; +import { act, fireEvent, render, screen, waitFor } from '@testing-library/react'; +import { IntlProvider } from 'react-intl'; +import { QueryClient, QueryClientProvider } from 'react-query'; +import { MemoryRouter } from 'react-router-dom'; + import { useBulkMove } from '../../../../../hooks/useBulkMove'; +import { BulkMoveButton } from '../BulkMoveButton'; jest.mock('../../../../../hooks/useBulkMove'); jest.mock('../../../../../hooks/useFolderStructure'); diff --git a/packages/core/upload/admin/src/pages/App/MediaLibrary/components/tests/EmptyOrNoPermissions.test.js b/packages/core/upload/admin/src/pages/App/MediaLibrary/components/tests/EmptyOrNoPermissions.test.js index 90f98bd53f..4f3fc6e9e7 100644 --- a/packages/core/upload/admin/src/pages/App/MediaLibrary/components/tests/EmptyOrNoPermissions.test.js +++ b/packages/core/upload/admin/src/pages/App/MediaLibrary/components/tests/EmptyOrNoPermissions.test.js @@ -1,5 +1,6 @@ import React from 'react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; diff --git a/packages/core/upload/admin/src/pages/App/MediaLibrary/components/tests/Header.test.js b/packages/core/upload/admin/src/pages/App/MediaLibrary/components/tests/Header.test.js index 87982ee971..1ed1291caf 100644 --- a/packages/core/upload/admin/src/pages/App/MediaLibrary/components/tests/Header.test.js +++ b/packages/core/upload/admin/src/pages/App/MediaLibrary/components/tests/Header.test.js @@ -1,10 +1,11 @@ import React from 'react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import { QueryClientProvider, QueryClient } from 'react-query'; -import { render } from '@testing-library/react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { useQueryParams } from '@strapi/helper-plugin'; -import { MemoryRouter } from 'react-router-dom'; +import { render } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; +import { QueryClient, QueryClientProvider } from 'react-query'; +import { MemoryRouter } from 'react-router-dom'; import { Header } from '../Header'; diff --git a/packages/core/upload/admin/src/pages/App/MediaLibrary/index.js b/packages/core/upload/admin/src/pages/App/MediaLibrary/index.js index 2abdefac16..857ecd6d00 100644 --- a/packages/core/upload/admin/src/pages/App/MediaLibrary/index.js +++ b/packages/core/upload/admin/src/pages/App/MediaLibrary/index.js @@ -1,61 +1,62 @@ -import React, { useState, useRef } from 'react'; -import { useIntl } from 'react-intl'; -import styled from 'styled-components'; -import { useHistory, useLocation, Link as ReactRouterLink } from 'react-router-dom'; -import { stringify } from 'qs'; +import React, { useRef, useState } from 'react'; + import { - LoadingIndicatorPage, - useFocusWhenNavigate, - AnErrorOccurred, - SearchURLQuery, - useSelectionState, - useQueryParams, - useTracking, - CheckPermissions, - usePersistentState, -} from '@strapi/helper-plugin'; -import { - Layout, - ContentLayout, ActionLayout, - Main, - Box, - Divider, BaseCheckbox, - IconButton, - Typography, - GridItem, + Box, + ContentLayout, + Divider, Flex, + GridItem, + IconButton, + Layout, + Main, + Typography, VisuallyHidden, } from '@strapi/design-system'; -import { Pencil, Cog, Grid, List } from '@strapi/icons'; +import { + AnErrorOccurred, + CheckPermissions, + LoadingIndicatorPage, + SearchURLQuery, + useFocusWhenNavigate, + usePersistentState, + useQueryParams, + useSelectionState, + useTracking, +} from '@strapi/helper-plugin'; +import { Cog, Grid, List, Pencil } from '@strapi/icons'; +import { stringify } from 'qs'; +import { useIntl } from 'react-intl'; +import { Link as ReactRouterLink, useHistory, useLocation } from 'react-router-dom'; +import styled from 'styled-components'; -import { UploadAssetDialog } from '../../../components/UploadAssetDialog/UploadAssetDialog'; -import { EditFolderDialog } from '../../../components/EditFolderDialog'; -import { EditAssetDialog } from '../../../components/EditAssetDialog'; import { AssetGridList } from '../../../components/AssetGridList'; -import { FolderGridList } from '../../../components/FolderGridList'; -import { TableList } from '../../../components/TableList'; -import SortPicker from '../../../components/SortPicker'; -import { PaginationFooter } from '../../../components/PaginationFooter'; -import { BulkActions } from './components/BulkActions'; -import { EmptyOrNoPermissions } from './components/EmptyOrNoPermissions'; +import { EditAssetDialog } from '../../../components/EditAssetDialog'; +import { EditFolderDialog } from '../../../components/EditFolderDialog'; import { FolderCard, FolderCardBody, - FolderCardCheckbox, FolderCardBodyAction, + FolderCardCheckbox, } from '../../../components/FolderCard'; -import { Filters } from './components/Filters'; -import { Header } from './components/Header'; - +import { FolderGridList } from '../../../components/FolderGridList'; +import { PaginationFooter } from '../../../components/PaginationFooter'; +import SortPicker from '../../../components/SortPicker'; +import { TableList } from '../../../components/TableList'; +import { UploadAssetDialog } from '../../../components/UploadAssetDialog/UploadAssetDialog'; +import { localStorageKeys, viewOptions } from '../../../constants'; import { useAssets } from '../../../hooks/useAssets'; +import { useFolder } from '../../../hooks/useFolder'; import { useFolders } from '../../../hooks/useFolders'; import { useMediaLibraryPermissions } from '../../../hooks/useMediaLibraryPermissions'; -import { useFolder } from '../../../hooks/useFolder'; -import { getTrad, containsAssetFilter, getBreadcrumbDataML, getFolderURL } from '../../../utils'; import pluginPermissions from '../../../permissions'; -import { localStorageKeys, viewOptions } from '../../../constants'; +import { containsAssetFilter, getBreadcrumbDataML, getFolderURL, getTrad } from '../../../utils'; + +import { BulkActions } from './components/BulkActions'; +import { EmptyOrNoPermissions } from './components/EmptyOrNoPermissions'; +import { Filters } from './components/Filters'; +import { Header } from './components/Header'; const BoxWithHeight = styled(Box)` height: ${32 / 16}rem; diff --git a/packages/core/upload/admin/src/pages/App/MediaLibrary/tests/MediaLibrary.test.js b/packages/core/upload/admin/src/pages/App/MediaLibrary/tests/MediaLibrary.test.js index d91b116d7a..4d44d793c6 100644 --- a/packages/core/upload/admin/src/pages/App/MediaLibrary/tests/MediaLibrary.test.js +++ b/packages/core/upload/admin/src/pages/App/MediaLibrary/tests/MediaLibrary.test.js @@ -1,22 +1,23 @@ import React from 'react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import { QueryClientProvider, QueryClient } from 'react-query'; -import { render as renderTL, screen, waitFor, fireEvent } from '@testing-library/react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { - useSelectionState, - useQueryParams, TrackingProvider, usePersistentState, + useQueryParams, + useSelectionState, } from '@strapi/helper-plugin'; -import { MemoryRouter } from 'react-router-dom'; +import { fireEvent, render as renderTL, screen, waitFor } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; +import { QueryClient, QueryClientProvider } from 'react-query'; +import { MemoryRouter } from 'react-router-dom'; -import { useMediaLibraryPermissions } from '../../../../hooks/useMediaLibraryPermissions'; -import { useFolders } from '../../../../hooks/useFolders'; -import { useAssets } from '../../../../hooks/useAssets'; -import { useFolder } from '../../../../hooks/useFolder'; import { MediaLibrary } from '..'; import { viewOptions } from '../../../../constants'; +import { useAssets } from '../../../../hooks/useAssets'; +import { useFolder } from '../../../../hooks/useFolder'; +import { useFolders } from '../../../../hooks/useFolders'; +import { useMediaLibraryPermissions } from '../../../../hooks/useMediaLibraryPermissions'; const FIXTURE_ASSET_PAGINATION = { pageCount: 1, diff --git a/packages/core/upload/admin/src/pages/App/components/BulkActions.js b/packages/core/upload/admin/src/pages/App/components/BulkActions.js index eb23b50080..adc8633c17 100644 --- a/packages/core/upload/admin/src/pages/App/components/BulkActions.js +++ b/packages/core/upload/admin/src/pages/App/components/BulkActions.js @@ -1,10 +1,12 @@ import React from 'react'; + +import { Flex, Typography } from '@strapi/design-system'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { Flex, Typography } from '@strapi/design-system'; import { AssetDefinition, FolderDefinition } from '../../../constants'; import getTrad from '../../../utils/getTrad'; + import { BulkDeleteButton } from './BulkDeleteButton'; import { BulkMoveButton } from './BulkMoveButton'; diff --git a/packages/core/upload/admin/src/pages/App/components/BulkDeleteButton.js b/packages/core/upload/admin/src/pages/App/components/BulkDeleteButton.js index efb1d6c685..863dc90493 100644 --- a/packages/core/upload/admin/src/pages/App/components/BulkDeleteButton.js +++ b/packages/core/upload/admin/src/pages/App/components/BulkDeleteButton.js @@ -1,9 +1,10 @@ import React, { useState } from 'react'; + +import { Button } from '@strapi/design-system'; +import { ConfirmDialog } from '@strapi/helper-plugin'; +import { Trash } from '@strapi/icons'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { Button } from '@strapi/design-system'; -import { Trash } from '@strapi/icons'; -import { ConfirmDialog } from '@strapi/helper-plugin'; import { AssetDefinition, FolderDefinition } from '../../../constants'; import { useBulkRemove } from '../../../hooks/useBulkRemove'; diff --git a/packages/core/upload/admin/src/pages/App/components/BulkMoveButton.js b/packages/core/upload/admin/src/pages/App/components/BulkMoveButton.js index 16cbb6937a..c240746da6 100644 --- a/packages/core/upload/admin/src/pages/App/components/BulkMoveButton.js +++ b/packages/core/upload/admin/src/pages/App/components/BulkMoveButton.js @@ -1,8 +1,9 @@ import React, { useState } from 'react'; -import PropTypes from 'prop-types'; -import { useIntl } from 'react-intl'; + import { Button } from '@strapi/design-system'; import { Folder } from '@strapi/icons'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; import { BulkMoveDialog } from '../../../components/BulkMoveDialog'; import { AssetDefinition, FolderDefinition } from '../../../constants'; diff --git a/packages/core/upload/admin/src/pages/App/components/EmptyOrNoPermissions.js b/packages/core/upload/admin/src/pages/App/components/EmptyOrNoPermissions.js index 73984971db..217af57655 100644 --- a/packages/core/upload/admin/src/pages/App/components/EmptyOrNoPermissions.js +++ b/packages/core/upload/admin/src/pages/App/components/EmptyOrNoPermissions.js @@ -1,9 +1,9 @@ -import PropTypes from 'prop-types'; import React from 'react'; -import { useIntl } from 'react-intl'; import { Button } from '@strapi/design-system'; import { EmptyPermissions, Plus } from '@strapi/icons'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; import { EmptyAssets } from '../../../components/EmptyAssets'; import { getTrad } from '../../../utils'; diff --git a/packages/core/upload/admin/src/pages/App/components/Filters.js b/packages/core/upload/admin/src/pages/App/components/Filters.js index de67cd865c..d88e51312c 100644 --- a/packages/core/upload/admin/src/pages/App/components/Filters.js +++ b/packages/core/upload/admin/src/pages/App/components/Filters.js @@ -1,8 +1,10 @@ -import React, { useState, useRef } from 'react'; +import React, { useRef, useState } from 'react'; + import { Button } from '@strapi/design-system'; import { useQueryParams, useTracking } from '@strapi/helper-plugin'; import { Filter } from '@strapi/icons'; import { useIntl } from 'react-intl'; + import FilterList from '../../../components/FilterList'; import FilterPopover from '../../../components/FilterPopover'; import displayedFilters from '../../../utils/displayedFilters'; diff --git a/packages/core/upload/admin/src/pages/App/components/Header.js b/packages/core/upload/admin/src/pages/App/components/Header.js index c631f2f043..b4c04aa30e 100644 --- a/packages/core/upload/admin/src/pages/App/components/Header.js +++ b/packages/core/upload/admin/src/pages/App/components/Header.js @@ -1,14 +1,16 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import { useIntl } from 'react-intl'; -import { stringify } from 'qs'; -import { useLocation } from 'react-router-dom'; + +import { Button, Flex, HeaderLayout, Link } from '@strapi/design-system'; import { useQueryParams } from '@strapi/helper-plugin'; -import { HeaderLayout, Button, Flex, Link } from '@strapi/design-system'; import { ArrowLeft, Plus } from '@strapi/icons'; -import { getTrad } from '../../../utils'; -import { FolderDefinition, BreadcrumbsDefinition } from '../../../constants'; +import PropTypes from 'prop-types'; +import { stringify } from 'qs'; +import { useIntl } from 'react-intl'; +import { useLocation } from 'react-router-dom'; + import { Breadcrumbs } from '../../../components/Breadcrumbs'; +import { BreadcrumbsDefinition, FolderDefinition } from '../../../constants'; +import { getTrad } from '../../../utils'; export const Header = ({ breadcrumbs, diff --git a/packages/core/upload/admin/src/pages/App/components/tests/EmptyOrNoPermissions.test.js b/packages/core/upload/admin/src/pages/App/components/tests/EmptyOrNoPermissions.test.js index 90f98bd53f..4f3fc6e9e7 100644 --- a/packages/core/upload/admin/src/pages/App/components/tests/EmptyOrNoPermissions.test.js +++ b/packages/core/upload/admin/src/pages/App/components/tests/EmptyOrNoPermissions.test.js @@ -1,5 +1,6 @@ import React from 'react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; diff --git a/packages/core/upload/admin/src/pages/App/index.js b/packages/core/upload/admin/src/pages/App/index.js index 9c2484c24e..662b42b28b 100644 --- a/packages/core/upload/admin/src/pages/App/index.js +++ b/packages/core/upload/admin/src/pages/App/index.js @@ -1,14 +1,16 @@ -import React, { useEffect, Suspense, lazy } from 'react'; -import { Switch, Route } from 'react-router-dom'; -import { useIntl } from 'react-intl'; -import { Helmet } from 'react-helmet'; -import { LoadingIndicatorPage, useQueryParams, useFocusWhenNavigate } from '@strapi/helper-plugin'; +import React, { lazy, Suspense, useEffect } from 'react'; + import { Main } from '@strapi/design-system'; +import { LoadingIndicatorPage, useFocusWhenNavigate, useQueryParams } from '@strapi/helper-plugin'; +import { Helmet } from 'react-helmet'; +import { useIntl } from 'react-intl'; +import { Route, Switch } from 'react-router-dom'; + +import { useConfig } from '../../hooks/useConfig'; +import pluginID from '../../pluginId'; +import { getTrad } from '../../utils'; import { MediaLibrary } from './MediaLibrary'; -import { getTrad } from '../../utils'; -import pluginID from '../../pluginId'; -import { useConfig } from '../../hooks/useConfig'; const ConfigureTheView = lazy(() => import(/* webpackChunkName: "Upload_ConfigureTheView" */ './ConfigureTheView') diff --git a/packages/core/upload/admin/src/pages/App/tests/Upload.test.js b/packages/core/upload/admin/src/pages/App/tests/Upload.test.js index 2dc9f6da7f..0f3111d1a0 100644 --- a/packages/core/upload/admin/src/pages/App/tests/Upload.test.js +++ b/packages/core/upload/admin/src/pages/App/tests/Upload.test.js @@ -1,13 +1,14 @@ import React from 'react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import { QueryClientProvider, QueryClient } from 'react-query'; -import { render as renderTL, screen } from '@testing-library/react'; -import { TrackingProvider } from '@strapi/helper-plugin'; -import { MemoryRouter } from 'react-router-dom'; -import { IntlProvider } from 'react-intl'; -import { useConfig } from '../../../hooks/useConfig'; +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { TrackingProvider } from '@strapi/helper-plugin'; +import { render as renderTL, screen } from '@testing-library/react'; +import { IntlProvider } from 'react-intl'; +import { QueryClient, QueryClientProvider } from 'react-query'; +import { MemoryRouter } from 'react-router-dom'; + import Upload from '..'; +import { useConfig } from '../../../hooks/useConfig'; jest.mock('../../../hooks/useConfig'); jest.mock('@strapi/helper-plugin', () => ({ diff --git a/packages/core/upload/admin/src/pages/SettingsPage/index.js b/packages/core/upload/admin/src/pages/SettingsPage/index.js index ba2cc5b627..07808ff5a7 100644 --- a/packages/core/upload/admin/src/pages/SettingsPage/index.js +++ b/packages/core/upload/admin/src/pages/SettingsPage/index.js @@ -1,34 +1,37 @@ import React, { useEffect, useReducer, useRef } from 'react'; -import { Helmet } from 'react-helmet'; -import { useIntl } from 'react-intl'; + +import { + Box, + Button, + ContentLayout, + Flex, + Grid, + GridItem, + HeaderLayout, + Layout, + Main, + ToggleInput, + Typography, +} from '@strapi/design-system'; import { CheckPagePermissions, LoadingIndicatorPage, + useFetchClient, useFocusWhenNavigate, useNotification, useOverlayBlocker, - useFetchClient, } from '@strapi/helper-plugin'; import { Check } from '@strapi/icons'; -import { - Box, - Flex, - ToggleInput, - Typography, - Button, - Main, - Grid, - GridItem, - ContentLayout, - HeaderLayout, - Layout, -} from '@strapi/design-system'; import axios from 'axios'; import isEqual from 'lodash/isEqual'; +import { Helmet } from 'react-helmet'; +import { useIntl } from 'react-intl'; + +import pluginPermissions from '../../permissions'; import { getRequestUrl, getTrad } from '../../utils'; + import init from './init'; import reducer, { initialState } from './reducer'; -import pluginPermissions from '../../permissions'; export const SettingsPage = () => { const { formatMessage } = useIntl(); diff --git a/packages/core/upload/admin/src/pages/SettingsPage/tests/index.test.js b/packages/core/upload/admin/src/pages/SettingsPage/tests/index.test.js index 81c1432439..a3b479f158 100644 --- a/packages/core/upload/admin/src/pages/SettingsPage/tests/index.test.js +++ b/packages/core/upload/admin/src/pages/SettingsPage/tests/index.test.js @@ -5,10 +5,13 @@ */ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render, waitFor } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; + import { SettingsPage } from '../index'; + import server from './utils/server'; jest.mock('@strapi/helper-plugin', () => ({ diff --git a/packages/core/upload/admin/src/pages/SettingsPage/tests/utils/server.js b/packages/core/upload/admin/src/pages/SettingsPage/tests/utils/server.js index 9e231a74f3..6f8a2dd190 100644 --- a/packages/core/upload/admin/src/pages/SettingsPage/tests/utils/server.js +++ b/packages/core/upload/admin/src/pages/SettingsPage/tests/utils/server.js @@ -1,5 +1,5 @@ -import { setupServer } from 'msw/node'; import { rest } from 'msw'; +import { setupServer } from 'msw/node'; const handlers = [ rest.get('*/settings', (req, res, ctx) => { diff --git a/packages/core/upload/admin/src/utils/deleteRequest.js b/packages/core/upload/admin/src/utils/deleteRequest.js index 80ef952fc4..6ea6e6c03d 100644 --- a/packages/core/upload/admin/src/utils/deleteRequest.js +++ b/packages/core/upload/admin/src/utils/deleteRequest.js @@ -1,4 +1,5 @@ import { getFetchClient } from '@strapi/helper-plugin'; + import getRequestUrl from './getRequestUrl'; export const deleteRequest = (type, id) => { diff --git a/packages/core/upload/admin/src/utils/getBreadcrumbDataML.js b/packages/core/upload/admin/src/utils/getBreadcrumbDataML.js index 8de6e755a9..f5f8b47fd0 100644 --- a/packages/core/upload/admin/src/utils/getBreadcrumbDataML.js +++ b/packages/core/upload/admin/src/utils/getBreadcrumbDataML.js @@ -1,5 +1,5 @@ -import getTrad from './getTrad'; import getFolderURL from './getFolderURL'; +import getTrad from './getTrad'; const getBreadcrumbDataML = (folder, { pathname, query }) => { let data = [ diff --git a/packages/core/upload/admin/src/utils/index.js b/packages/core/upload/admin/src/utils/index.js index c83cc51fe5..93ceb98258 100644 --- a/packages/core/upload/admin/src/utils/index.js +++ b/packages/core/upload/admin/src/utils/index.js @@ -1,13 +1,13 @@ +export { default as containsAssetFilter } from './containsAssetFilter'; export { default as createAssetUrl } from './createAssetUrl'; -export { default as formatBytes } from './formatBytes'; -export { default as getRequestUrl } from './getRequestUrl'; -export { default as getTrad } from './getTrad'; export { default as findRecursiveFolderByValue } from './findRecursiveFolderByValue'; export { default as findRecursiveFolderMetadatas } from './findRecursiveFolderMetadatas'; -export { default as containsAssetFilter } from './containsAssetFilter'; -export { default as getBreadcrumbDataML } from './getBreadcrumbDataML'; -export { default as getBreadcrumbDataCM } from './getBreadcrumbDataCM'; -export { default as getFolderURL } from './getFolderURL'; -export { default as getFolderParents } from './getFolderParents'; -export { default as toSingularTypes } from './toSingularTypes'; +export { default as formatBytes } from './formatBytes'; export * from './formatDuration'; +export { default as getBreadcrumbDataCM } from './getBreadcrumbDataCM'; +export { default as getBreadcrumbDataML } from './getBreadcrumbDataML'; +export { default as getFolderParents } from './getFolderParents'; +export { default as getFolderURL } from './getFolderURL'; +export { default as getRequestUrl } from './getRequestUrl'; +export { default as getTrad } from './getTrad'; +export { default as toSingularTypes } from './toSingularTypes'; diff --git a/packages/core/upload/admin/src/utils/urlYupSchema.js b/packages/core/upload/admin/src/utils/urlYupSchema.js index 5ba49dc90c..ddfb5bee98 100644 --- a/packages/core/upload/admin/src/utils/urlYupSchema.js +++ b/packages/core/upload/admin/src/utils/urlYupSchema.js @@ -1,5 +1,6 @@ -import * as yup from 'yup'; import { translatedErrors as errorsTrads } from '@strapi/helper-plugin'; +import * as yup from 'yup'; + import getTrad from './getTrad'; export const urlSchema = yup.object().shape({ diff --git a/packages/core/upload/admin/src/utils/urlsToAssets.js b/packages/core/upload/admin/src/utils/urlsToAssets.js index f5461d0c4d..5f1d5b785b 100644 --- a/packages/core/upload/admin/src/utils/urlsToAssets.js +++ b/packages/core/upload/admin/src/utils/urlsToAssets.js @@ -1,5 +1,7 @@ import { getFetchClient } from '@strapi/helper-plugin'; + import { AssetSource } from '../constants'; + import { typeFromMime } from './typeFromMime'; function getFilenameFromURL(url) { diff --git a/packages/plugins/color-picker/admin/src/components/ColorPicker/ColorPickerIcon/index.js b/packages/plugins/color-picker/admin/src/components/ColorPicker/ColorPickerIcon/index.js index 6ab84ffcb7..7a4dfa6725 100644 --- a/packages/plugins/color-picker/admin/src/components/ColorPicker/ColorPickerIcon/index.js +++ b/packages/plugins/color-picker/admin/src/components/ColorPicker/ColorPickerIcon/index.js @@ -1,7 +1,8 @@ import React from 'react'; -import styled from 'styled-components'; -import { Icon, Flex } from '@strapi/design-system'; + +import { Flex, Icon } from '@strapi/design-system'; import { Paint } from '@strapi/icons'; +import styled from 'styled-components'; const IconBox = styled(Flex)` /* Hard code color values */ diff --git a/packages/plugins/color-picker/admin/src/components/ColorPicker/ColorPickerInput/index.js b/packages/plugins/color-picker/admin/src/components/ColorPicker/ColorPickerInput/index.js index f80460628c..333d4ecebd 100644 --- a/packages/plugins/color-picker/admin/src/components/ColorPicker/ColorPickerInput/index.js +++ b/packages/plugins/color-picker/admin/src/components/ColorPicker/ColorPickerInput/index.js @@ -1,22 +1,23 @@ -import React, { useState, useRef } from 'react'; -import PropTypes from 'prop-types'; -import styled from 'styled-components'; +import React, { useRef, useState } from 'react'; + import { - Typography, - Flex, - Box, BaseButton, - FocusTrap, + Box, Field, - FieldHint, FieldError, - FieldLabel, + FieldHint, FieldInput, + FieldLabel, + Flex, + FocusTrap, Popover, + Typography, } from '@strapi/design-system'; import { CarretDown } from '@strapi/icons'; -import { useIntl } from 'react-intl'; +import PropTypes from 'prop-types'; import { HexColorPicker } from 'react-colorful'; +import { useIntl } from 'react-intl'; +import styled from 'styled-components'; import getTrad from '../../../utils/getTrad'; diff --git a/packages/plugins/color-picker/admin/src/components/tests/color-picker-input.test.js b/packages/plugins/color-picker/admin/src/components/tests/color-picker-input.test.js index e5db282406..b104028c05 100644 --- a/packages/plugins/color-picker/admin/src/components/tests/color-picker-input.test.js +++ b/packages/plugins/color-picker/admin/src/components/tests/color-picker-input.test.js @@ -1,7 +1,9 @@ import React from 'react'; -import { render, screen, fireEvent } from '@testing-library/react'; + import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { fireEvent, render, screen } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; + import ColorPickerInput from '../ColorPicker/ColorPickerInput'; const mockAttribute = { diff --git a/packages/plugins/color-picker/admin/src/index.js b/packages/plugins/color-picker/admin/src/index.js index e09d9d9a61..19e118fd73 100644 --- a/packages/plugins/color-picker/admin/src/index.js +++ b/packages/plugins/color-picker/admin/src/index.js @@ -1,6 +1,7 @@ import { prefixPluginTranslations } from '@strapi/helper-plugin'; -import pluginId from './pluginId'; + import ColorPickerIcon from './components/ColorPicker/ColorPickerIcon'; +import pluginId from './pluginId'; import getTrad from './utils/getTrad'; export default { diff --git a/packages/plugins/documentation/admin/src/components/FieldActionWrapper/index.js b/packages/plugins/documentation/admin/src/components/FieldActionWrapper/index.js index f3f6623524..ccaccf4080 100644 --- a/packages/plugins/documentation/admin/src/components/FieldActionWrapper/index.js +++ b/packages/plugins/documentation/admin/src/components/FieldActionWrapper/index.js @@ -1,5 +1,5 @@ -import styled from 'styled-components'; import { FieldAction } from '@strapi/design-system'; +import styled from 'styled-components'; const FieldActionWrapper = styled(FieldAction)` svg { diff --git a/packages/plugins/documentation/admin/src/components/PluginIcon/index.js b/packages/plugins/documentation/admin/src/components/PluginIcon/index.js index b0a04a26f9..23c5b1c3ce 100644 --- a/packages/plugins/documentation/admin/src/components/PluginIcon/index.js +++ b/packages/plugins/documentation/admin/src/components/PluginIcon/index.js @@ -5,6 +5,7 @@ */ import React from 'react'; + import { Information } from '@strapi/icons'; const PluginIcon = () => ; diff --git a/packages/plugins/documentation/admin/src/index.js b/packages/plugins/documentation/admin/src/index.js index b28338eeb7..c2f6680ec8 100644 --- a/packages/plugins/documentation/admin/src/index.js +++ b/packages/plugins/documentation/admin/src/index.js @@ -5,7 +5,9 @@ // Also the strapi-generate-plugins/files/admin/src/index.js needs to be updated // IF THE DOC IS NOT UPDATED THE PULL REQUEST WILL NOT BE MERGED import { prefixPluginTranslations } from '@strapi/helper-plugin'; + import pluginPkg from '../../package.json'; + import PluginIcon from './components/PluginIcon'; import pluginPermissions from './permissions'; import pluginId from './pluginId'; diff --git a/packages/plugins/documentation/admin/src/pages/PluginPage/index.js b/packages/plugins/documentation/admin/src/pages/PluginPage/index.js index 5ccd7da270..82cdd17e83 100755 --- a/packages/plugins/documentation/admin/src/pages/PluginPage/index.js +++ b/packages/plugins/documentation/admin/src/pages/PluginPage/index.js @@ -6,36 +6,36 @@ */ import React, { useState } from 'react'; -import { useIntl } from 'react-intl'; -import { - CheckPermissions, - ConfirmDialog, - LoadingIndicatorPage, - stopPropagation, - EmptyStateLayout, - useFocusWhenNavigate, - AnErrorOccurred, -} from '@strapi/helper-plugin'; -import { Helmet } from 'react-helmet'; + import { + Box, Button, - Layout, - HeaderLayout, ContentLayout, - Main, - IconButton, - Typography, Flex, + HeaderLayout, + IconButton, + Layout, + Main, Table, - Tr, - Thead, - Th, Tbody, Td, - Box, + Th, + Thead, + Tr, + Typography, } from '@strapi/design-system'; - -import { Trash, Eye as Show, Refresh as Reload } from '@strapi/icons'; +import { + AnErrorOccurred, + CheckPermissions, + ConfirmDialog, + EmptyStateLayout, + LoadingIndicatorPage, + stopPropagation, + useFocusWhenNavigate, +} from '@strapi/helper-plugin'; +import { Eye as Show, Refresh as Reload, Trash } from '@strapi/icons'; +import { Helmet } from 'react-helmet'; +import { useIntl } from 'react-intl'; import permissions from '../../permissions'; import { getTrad } from '../../utils'; diff --git a/packages/plugins/documentation/admin/src/pages/PluginPage/tests/index.test.js b/packages/plugins/documentation/admin/src/pages/PluginPage/tests/index.test.js index da77cfde29..7d672e3cae 100644 --- a/packages/plugins/documentation/admin/src/pages/PluginPage/tests/index.test.js +++ b/packages/plugins/documentation/admin/src/pages/PluginPage/tests/index.test.js @@ -1,12 +1,14 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render, screen, waitFor } from '@testing-library/react'; +import { createMemoryHistory } from 'history'; import { IntlProvider } from 'react-intl'; import { QueryClient, QueryClientProvider } from 'react-query'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; import { Router } from 'react-router-dom'; -import { createMemoryHistory } from 'history'; import PluginPage from '../index'; + import server from './server'; jest.mock('@strapi/helper-plugin', () => ({ diff --git a/packages/plugins/documentation/admin/src/pages/PluginPage/tests/server.js b/packages/plugins/documentation/admin/src/pages/PluginPage/tests/server.js index 61d263bd50..d852697f66 100644 --- a/packages/plugins/documentation/admin/src/pages/PluginPage/tests/server.js +++ b/packages/plugins/documentation/admin/src/pages/PluginPage/tests/server.js @@ -1,5 +1,5 @@ -import { setupServer } from 'msw/node'; import { rest } from 'msw'; +import { setupServer } from 'msw/node'; const handlers = [ rest.get('*/getInfos', (req, res, ctx) => { diff --git a/packages/plugins/documentation/admin/src/pages/SettingsPage/index.js b/packages/plugins/documentation/admin/src/pages/SettingsPage/index.js index 4f410939cf..79802e68fb 100644 --- a/packages/plugins/documentation/admin/src/pages/SettingsPage/index.js +++ b/packages/plugins/documentation/admin/src/pages/SettingsPage/index.js @@ -1,36 +1,35 @@ import React, { useState } from 'react'; -import { useIntl } from 'react-intl'; -import { Formik } from 'formik'; + +// Strapi Parts +import { + Box, + Button, + ContentLayout, + Flex, + Grid, + GridItem, + HeaderLayout, + Main, + TextInput, + ToggleInput, + Typography, +} from '@strapi/design-system'; import { CheckPermissions, Form, LoadingIndicatorPage, useFocusWhenNavigate, } from '@strapi/helper-plugin'; - -// Strapi Parts -import { - ContentLayout, - HeaderLayout, - Main, - Button, - Box, - Flex, - Typography, - ToggleInput, - TextInput, - Grid, - GridItem, -} from '@strapi/design-system'; - // Strapi Icons -import { Eye as Show, EyeStriked as Hide, Check } from '@strapi/icons'; +import { Check, Eye as Show, EyeStriked as Hide } from '@strapi/icons'; +import { Formik } from 'formik'; +import { useIntl } from 'react-intl'; +import FieldActionWrapper from '../../components/FieldActionWrapper'; import permissions from '../../permissions'; import { getTrad } from '../../utils'; -import useReactQuery from '../utils/useReactQuery'; -import FieldActionWrapper from '../../components/FieldActionWrapper'; import schema from '../utils/schema'; +import useReactQuery from '../utils/useReactQuery'; const SettingsPage = () => { useFocusWhenNavigate(); diff --git a/packages/plugins/documentation/admin/src/pages/SettingsPage/tests/index.test.js b/packages/plugins/documentation/admin/src/pages/SettingsPage/tests/index.test.js index ea115667d6..3e0551ef02 100644 --- a/packages/plugins/documentation/admin/src/pages/SettingsPage/tests/index.test.js +++ b/packages/plugins/documentation/admin/src/pages/SettingsPage/tests/index.test.js @@ -1,12 +1,14 @@ import React from 'react'; -import { render, waitFor, screen } from '@testing-library/react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { render, screen, waitFor } from '@testing-library/react'; +import { createMemoryHistory } from 'history'; import { IntlProvider } from 'react-intl'; import { QueryClient, QueryClientProvider } from 'react-query'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; import { Router } from 'react-router-dom'; -import { createMemoryHistory } from 'history'; import SettingsPage from '../index'; + import server from './server'; jest.mock('@strapi/helper-plugin', () => ({ diff --git a/packages/plugins/documentation/admin/src/pages/SettingsPage/tests/server.js b/packages/plugins/documentation/admin/src/pages/SettingsPage/tests/server.js index 6218a16951..e41f5487b9 100644 --- a/packages/plugins/documentation/admin/src/pages/SettingsPage/tests/server.js +++ b/packages/plugins/documentation/admin/src/pages/SettingsPage/tests/server.js @@ -1,5 +1,5 @@ -import { setupServer } from 'msw/node'; import { rest } from 'msw'; +import { setupServer } from 'msw/node'; const handlers = [ rest.get('*/getInfos', (req, res, ctx) => { diff --git a/packages/plugins/documentation/admin/src/pages/utils/useReactQuery.js b/packages/plugins/documentation/admin/src/pages/utils/useReactQuery.js index 93a661d760..9f24888cb6 100644 --- a/packages/plugins/documentation/admin/src/pages/utils/useReactQuery.js +++ b/packages/plugins/documentation/admin/src/pages/utils/useReactQuery.js @@ -1,5 +1,6 @@ -import { useQuery, useMutation, useQueryClient } from 'react-query'; -import { useNotification, useFetchClient } from '@strapi/helper-plugin'; +import { useFetchClient, useNotification } from '@strapi/helper-plugin'; +import { useMutation, useQuery, useQueryClient } from 'react-query'; + import pluginId from '../../pluginId'; import getTrad from '../../utils/getTrad'; diff --git a/packages/plugins/graphql/admin/src/index.js b/packages/plugins/graphql/admin/src/index.js index 04fa0025f8..c9d5982902 100644 --- a/packages/plugins/graphql/admin/src/index.js +++ b/packages/plugins/graphql/admin/src/index.js @@ -1,5 +1,7 @@ import { prefixPluginTranslations } from '@strapi/helper-plugin'; + import pluginPkg from '../../package.json'; + import pluginId from './pluginId'; const name = pluginPkg.strapi.name; diff --git a/packages/plugins/i18n/admin/src/components/CMEditViewInjectedComponents/CMEditViewCopyLocale/index.js b/packages/plugins/i18n/admin/src/components/CMEditViewInjectedComponents/CMEditViewCopyLocale/index.js index 68ecce2af6..5ec63054a1 100644 --- a/packages/plugins/i18n/admin/src/components/CMEditViewInjectedComponents/CMEditViewCopyLocale/index.js +++ b/packages/plugins/i18n/admin/src/components/CMEditViewInjectedComponents/CMEditViewCopyLocale/index.js @@ -1,22 +1,25 @@ import React, { useState } from 'react'; -import PropTypes from 'prop-types'; -import styled from 'styled-components'; -import { useDispatch } from 'react-redux'; -import { useIntl } from 'react-intl'; + import { + Box, + Button, Dialog, DialogBody, DialogFooter, - Select, - Option, - Button, - Box, - Typography, Flex, + Option, + Select, + Typography, } from '@strapi/design-system'; -import { ExclamationMarkCircle, Duplicate } from '@strapi/icons'; -import { useCMEditViewDataManager, useNotification, useFetchClient } from '@strapi/helper-plugin'; +import { useCMEditViewDataManager, useFetchClient, useNotification } from '@strapi/helper-plugin'; +import { Duplicate, ExclamationMarkCircle } from '@strapi/icons'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import { useDispatch } from 'react-redux'; +import styled from 'styled-components'; + import { getTrad } from '../../../utils'; + import { cleanData, generateOptions } from './utils'; const StyledTypography = styled(Typography)` diff --git a/packages/plugins/i18n/admin/src/components/CMEditViewInjectedComponents/CMEditViewCopyLocale/utils/cleanData.js b/packages/plugins/i18n/admin/src/components/CMEditViewInjectedComponents/CMEditViewCopyLocale/utils/cleanData.js index 933212f879..be342da271 100644 --- a/packages/plugins/i18n/admin/src/components/CMEditViewInjectedComponents/CMEditViewCopyLocale/utils/cleanData.js +++ b/packages/plugins/i18n/admin/src/components/CMEditViewInjectedComponents/CMEditViewCopyLocale/utils/cleanData.js @@ -2,6 +2,7 @@ import { contentManagementUtilRemoveFieldsFromData, formatContentTypeData, } from '@strapi/helper-plugin'; + import removePasswordAndRelationsFieldFromData from './removePasswordAndRelationsFieldFromData'; const cleanData = (data, { contentType, components }, initialLocalizations) => { diff --git a/packages/plugins/i18n/admin/src/components/CMEditViewInjectedComponents/CMEditViewCopyLocale/utils/removePasswordAndRelationsFieldFromData.js b/packages/plugins/i18n/admin/src/components/CMEditViewInjectedComponents/CMEditViewCopyLocale/utils/removePasswordAndRelationsFieldFromData.js index 9602296b23..6716cd1277 100644 --- a/packages/plugins/i18n/admin/src/components/CMEditViewInjectedComponents/CMEditViewCopyLocale/utils/removePasswordAndRelationsFieldFromData.js +++ b/packages/plugins/i18n/admin/src/components/CMEditViewInjectedComponents/CMEditViewCopyLocale/utils/removePasswordAndRelationsFieldFromData.js @@ -1,5 +1,5 @@ +import { getOtherInfos, getType } from '@strapi/helper-plugin'; import get from 'lodash/get'; -import { getType, getOtherInfos } from '@strapi/helper-plugin'; const removePasswordAndRelationsFieldFromData = (data, contentTypeSchema, componentSchema) => { const recursiveCleanData = (data, schema) => { diff --git a/packages/plugins/i18n/admin/src/components/CMEditViewInjectedComponents/CMEditViewCopyLocale/utils/tests/removePasswordAndRelationsFieldFromData.test.js b/packages/plugins/i18n/admin/src/components/CMEditViewInjectedComponents/CMEditViewCopyLocale/utils/tests/removePasswordAndRelationsFieldFromData.test.js index 6e4ad0e891..4fcf75a0b9 100644 --- a/packages/plugins/i18n/admin/src/components/CMEditViewInjectedComponents/CMEditViewCopyLocale/utils/tests/removePasswordAndRelationsFieldFromData.test.js +++ b/packages/plugins/i18n/admin/src/components/CMEditViewInjectedComponents/CMEditViewCopyLocale/utils/tests/removePasswordAndRelationsFieldFromData.test.js @@ -1,6 +1,7 @@ -import testData from './data'; import removePasswordAndRelationsFieldFromData from '../removePasswordAndRelationsFieldFromData'; +import testData from './data'; + describe('I18n | Components | CMEditViewCopyLocale | utils', () => { describe('removePasswordAndRelationsFieldFromData', () => { it('should return an empty object', () => { diff --git a/packages/plugins/i18n/admin/src/components/CMEditViewInjectedComponents/CMEditViewLocalePicker/Bullet.js b/packages/plugins/i18n/admin/src/components/CMEditViewInjectedComponents/CMEditViewLocalePicker/Bullet.js index c78e8e9c91..13484104cf 100644 --- a/packages/plugins/i18n/admin/src/components/CMEditViewInjectedComponents/CMEditViewLocalePicker/Bullet.js +++ b/packages/plugins/i18n/admin/src/components/CMEditViewInjectedComponents/CMEditViewLocalePicker/Bullet.js @@ -1,8 +1,10 @@ import React from 'react'; + +import { pxToRem } from '@strapi/helper-plugin'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; import styled from 'styled-components'; -import { pxToRem } from '@strapi/helper-plugin'; + import { getTrad } from '../../../utils'; const statusMap = { diff --git a/packages/plugins/i18n/admin/src/components/CMEditViewInjectedComponents/CMEditViewLocalePicker/index.js b/packages/plugins/i18n/admin/src/components/CMEditViewInjectedComponents/CMEditViewLocalePicker/index.js index 561db0a733..f686f064ad 100644 --- a/packages/plugins/i18n/admin/src/components/CMEditViewInjectedComponents/CMEditViewLocalePicker/index.js +++ b/packages/plugins/i18n/admin/src/components/CMEditViewInjectedComponents/CMEditViewLocalePicker/index.js @@ -1,14 +1,17 @@ import React from 'react'; -import PropTypes from 'prop-types'; + +import { Box, Divider, Flex, Option, Select, Typography } from '@strapi/design-system'; import get from 'lodash/get'; -import { Box, Divider, Select, Option, Typography, Flex } from '@strapi/design-system'; +import PropTypes from 'prop-types'; +import { stringify } from 'qs'; import { useIntl } from 'react-intl'; import { useHistory } from 'react-router-dom'; -import { stringify } from 'qs'; + import { getTrad } from '../../../utils'; -import { createLocalesOption } from './utils'; import CMEditViewCopyLocale from '../CMEditViewCopyLocale'; + import Bullet from './Bullet'; +import { createLocalesOption } from './utils'; const CMEditViewLocalePicker = ({ appLocales, diff --git a/packages/plugins/i18n/admin/src/components/CMEditViewInjectedComponents/index.js b/packages/plugins/i18n/admin/src/components/CMEditViewInjectedComponents/index.js index fcdc07485f..9f5cd70f42 100644 --- a/packages/plugins/i18n/admin/src/components/CMEditViewInjectedComponents/index.js +++ b/packages/plugins/i18n/admin/src/components/CMEditViewInjectedComponents/index.js @@ -1,11 +1,14 @@ import React, { useMemo } from 'react'; + +import { useCMEditViewDataManager, useQueryParams } from '@strapi/helper-plugin'; import get from 'lodash/get'; import has from 'lodash/has'; import { useSelector } from 'react-redux'; import { useParams } from 'react-router-dom'; -import { useCMEditViewDataManager, useQueryParams } from '@strapi/helper-plugin'; -import selectI18NLocales from '../../selectors/selectI18nLocales'; + import useContentTypePermissions from '../../hooks/useContentTypePermissions'; +import selectI18NLocales from '../../selectors/selectI18nLocales'; + import CMEditViewLocalePicker from './CMEditViewLocalePicker'; const CMEditViewInjectedComponents = () => { diff --git a/packages/plugins/i18n/admin/src/components/CMListViewInjectedComponents/DeleteModalAdditionalInfos/index.js b/packages/plugins/i18n/admin/src/components/CMListViewInjectedComponents/DeleteModalAdditionalInfos/index.js index 615c152b51..ffa4a34712 100644 --- a/packages/plugins/i18n/admin/src/components/CMListViewInjectedComponents/DeleteModalAdditionalInfos/index.js +++ b/packages/plugins/i18n/admin/src/components/CMListViewInjectedComponents/DeleteModalAdditionalInfos/index.js @@ -1,8 +1,10 @@ import React from 'react'; -import { useIntl } from 'react-intl'; + import { Typography } from '@strapi/design-system'; -import { getTrad } from '../../../utils'; +import { useIntl } from 'react-intl'; + import useHasI18n from '../../../hooks/useHasI18n'; +import { getTrad } from '../../../utils'; const Emphasis = (chunks) => { return ( diff --git a/packages/plugins/i18n/admin/src/components/CMListViewInjectedComponents/PublishModalAdditionalInfos/index.js b/packages/plugins/i18n/admin/src/components/CMListViewInjectedComponents/PublishModalAdditionalInfos/index.js index cd7d32f1ff..9cae53719a 100644 --- a/packages/plugins/i18n/admin/src/components/CMListViewInjectedComponents/PublishModalAdditionalInfos/index.js +++ b/packages/plugins/i18n/admin/src/components/CMListViewInjectedComponents/PublishModalAdditionalInfos/index.js @@ -1,8 +1,10 @@ import React from 'react'; -import { useIntl } from 'react-intl'; + import { Typography } from '@strapi/design-system'; -import { getTrad } from '../../../utils'; +import { useIntl } from 'react-intl'; + import useHasI18n from '../../../hooks/useHasI18n'; +import { getTrad } from '../../../utils'; const Emphasis = (chunks) => { return ( diff --git a/packages/plugins/i18n/admin/src/components/CMListViewInjectedComponents/UnpublishModalAdditionalInfos/index.js b/packages/plugins/i18n/admin/src/components/CMListViewInjectedComponents/UnpublishModalAdditionalInfos/index.js index 21bae9b17e..f44c58182b 100644 --- a/packages/plugins/i18n/admin/src/components/CMListViewInjectedComponents/UnpublishModalAdditionalInfos/index.js +++ b/packages/plugins/i18n/admin/src/components/CMListViewInjectedComponents/UnpublishModalAdditionalInfos/index.js @@ -1,8 +1,10 @@ import React from 'react'; -import { useIntl } from 'react-intl'; + import { Typography } from '@strapi/design-system'; -import { getTrad } from '../../../utils'; +import { useIntl } from 'react-intl'; + import useHasI18n from '../../../hooks/useHasI18n'; +import { getTrad } from '../../../utils'; const Emphasis = (chunks) => { return ( diff --git a/packages/plugins/i18n/admin/src/components/CheckboxConfirmation/index.js b/packages/plugins/i18n/admin/src/components/CheckboxConfirmation/index.js index c300b9da39..feb8779a0f 100644 --- a/packages/plugins/i18n/admin/src/components/CheckboxConfirmation/index.js +++ b/packages/plugins/i18n/admin/src/components/CheckboxConfirmation/index.js @@ -1,17 +1,19 @@ import React, { useState } from 'react'; -import PropTypes from 'prop-types'; -import styled from 'styled-components'; -import { useIntl } from 'react-intl'; + import { + Button, Checkbox, Dialog, DialogBody, DialogFooter, - Typography, Flex, - Button, + Typography, } from '@strapi/design-system'; import { ExclamationMarkCircle } from '@strapi/icons'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import styled from 'styled-components'; + import { getTrad } from '../../utils'; const TextAlignTypography = styled(Typography)` diff --git a/packages/plugins/i18n/admin/src/components/Initializer/index.js b/packages/plugins/i18n/admin/src/components/Initializer/index.js index 8c451cb12a..ae1def8bc0 100644 --- a/packages/plugins/i18n/admin/src/components/Initializer/index.js +++ b/packages/plugins/i18n/admin/src/components/Initializer/index.js @@ -5,9 +5,11 @@ */ import { useEffect, useRef } from 'react'; + import PropTypes from 'prop-types'; -import pluginId from '../../pluginId'; + import useLocales from '../../hooks/useLocales'; +import pluginId from '../../pluginId'; const Initializer = ({ setPlugin }) => { const { isLoading, locales } = useLocales(); diff --git a/packages/plugins/i18n/admin/src/components/LabelAction/index.js b/packages/plugins/i18n/admin/src/components/LabelAction/index.js index 19661c99e3..1aeed43615 100644 --- a/packages/plugins/i18n/admin/src/components/LabelAction/index.js +++ b/packages/plugins/i18n/admin/src/components/LabelAction/index.js @@ -1,8 +1,9 @@ import React from 'react'; + +import { Tooltip } from '@strapi/design-system'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; import styled from 'styled-components'; -import { Tooltip } from '@strapi/design-system'; const Button = styled.button` border: none; diff --git a/packages/plugins/i18n/admin/src/components/LocaleList/LocaleTable.js b/packages/plugins/i18n/admin/src/components/LocaleList/LocaleTable.js index 14edfc3ae4..71ad39423b 100644 --- a/packages/plugins/i18n/admin/src/components/LocaleList/LocaleTable.js +++ b/packages/plugins/i18n/admin/src/components/LocaleList/LocaleTable.js @@ -1,20 +1,21 @@ import React from 'react'; -import PropTypes from 'prop-types'; + import { - Typography, - IconButton, Flex, + IconButton, Table, + Tbody, + Td, + Th, Thead, Tr, - Th, - Td, - Tbody, + Typography, VisuallyHidden, } from '@strapi/design-system'; +import { onRowClick, stopPropagation } from '@strapi/helper-plugin'; import { Pencil, Trash } from '@strapi/icons'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { stopPropagation, onRowClick } from '@strapi/helper-plugin'; import { getTrad } from '../../utils'; diff --git a/packages/plugins/i18n/admin/src/components/LocaleList/index.js b/packages/plugins/i18n/admin/src/components/LocaleList/index.js index ffde7fc6a6..286d19a2f3 100644 --- a/packages/plugins/i18n/admin/src/components/LocaleList/index.js +++ b/packages/plugins/i18n/admin/src/components/LocaleList/index.js @@ -1,14 +1,17 @@ import React, { useState } from 'react'; -import { useIntl } from 'react-intl'; -import PropTypes from 'prop-types'; -import { Button, Main, EmptyStateLayout, ContentLayout, HeaderLayout } from '@strapi/design-system'; + +import { Button, ContentLayout, EmptyStateLayout, HeaderLayout, Main } from '@strapi/design-system'; import { useFocusWhenNavigate } from '@strapi/helper-plugin'; -import { Plus, EmptyDocuments } from '@strapi/icons'; +import { EmptyDocuments, Plus } from '@strapi/icons'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; + import useLocales from '../../hooks/useLocales'; import { getTrad } from '../../utils'; -import ModalEdit from '../ModalEdit'; -import ModalDelete from '../ModalDelete'; import ModalCreate from '../ModalCreate'; +import ModalDelete from '../ModalDelete'; +import ModalEdit from '../ModalEdit'; + import LocaleTable from './LocaleTable'; const LocaleList = ({ canUpdateLocale, canDeleteLocale, onToggleCreateModal, isCreating }) => { diff --git a/packages/plugins/i18n/admin/src/components/LocaleListCell/LocaleListCell.js b/packages/plugins/i18n/admin/src/components/LocaleListCell/LocaleListCell.js index b237576ce6..844a5f92ac 100644 --- a/packages/plugins/i18n/admin/src/components/LocaleListCell/LocaleListCell.js +++ b/packages/plugins/i18n/admin/src/components/LocaleListCell/LocaleListCell.js @@ -1,11 +1,13 @@ -import React, { useState, useRef } from 'react'; -import PropTypes from 'prop-types'; -import styled from 'styled-components'; -import { useIntl } from 'react-intl'; -import { useSelector } from 'react-redux'; -import { Flex, Box, Tooltip, Typography, Popover } from '@strapi/design-system'; +import React, { useRef, useState } from 'react'; + +import { Box, Flex, Popover, Tooltip, Typography } from '@strapi/design-system'; import { SortIcon, stopPropagation } from '@strapi/helper-plugin'; import get from 'lodash/get'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import { useSelector } from 'react-redux'; +import styled from 'styled-components'; + import selectI18NLocales from '../../selectors/selectI18nLocales'; import { getTrad } from '../../utils'; diff --git a/packages/plugins/i18n/admin/src/components/LocaleListCell/tests/LocaleListCell.test.js b/packages/plugins/i18n/admin/src/components/LocaleListCell/tests/LocaleListCell.test.js index 55c9e01bb2..2ecae953bc 100644 --- a/packages/plugins/i18n/admin/src/components/LocaleListCell/tests/LocaleListCell.test.js +++ b/packages/plugins/i18n/admin/src/components/LocaleListCell/tests/LocaleListCell.test.js @@ -1,8 +1,10 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render, screen } from '@testing-library/react'; -import { useSelector } from 'react-redux'; import { IntlProvider } from 'react-intl'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; +import { useSelector } from 'react-redux'; + import LocaleListCell from '../LocaleListCell'; jest.mock('react-redux', () => ({ diff --git a/packages/plugins/i18n/admin/src/components/LocalePicker/index.js b/packages/plugins/i18n/admin/src/components/LocalePicker/index.js index bcf2d79d47..c79160bf04 100644 --- a/packages/plugins/i18n/admin/src/components/LocalePicker/index.js +++ b/packages/plugins/i18n/admin/src/components/LocalePicker/index.js @@ -1,10 +1,12 @@ import React, { useState } from 'react'; -import { useSelector, useDispatch } from 'react-redux'; + +import { Option, Select } from '@strapi/design-system'; import { useQueryParams } from '@strapi/helper-plugin'; -import { useRouteMatch } from 'react-router-dom'; import get from 'lodash/get'; -import { Select, Option } from '@strapi/design-system'; import { useIntl } from 'react-intl'; +import { useDispatch, useSelector } from 'react-redux'; +import { useRouteMatch } from 'react-router-dom'; + import useContentTypePermissions from '../../hooks/useContentTypePermissions'; import useHasI18n from '../../hooks/useHasI18n'; import selectI18NLocales from '../../selectors/selectI18nLocales'; diff --git a/packages/plugins/i18n/admin/src/components/LocaleSelect/index.js b/packages/plugins/i18n/admin/src/components/LocaleSelect/index.js index cfcb93ac8d..ad28979fbc 100644 --- a/packages/plugins/i18n/admin/src/components/LocaleSelect/index.js +++ b/packages/plugins/i18n/admin/src/components/LocaleSelect/index.js @@ -1,10 +1,12 @@ /* eslint-disable react/jsx-indent */ import React from 'react'; -import { ComboboxOption, Combobox } from '@strapi/design-system'; -import { useIntl } from 'react-intl'; + +import { Combobox, ComboboxOption } from '@strapi/design-system'; import PropTypes from 'prop-types'; -import useLocales from '../../hooks/useLocales'; +import { useIntl } from 'react-intl'; + import useDefaultLocales from '../../hooks/useDefaultLocales'; +import useLocales from '../../hooks/useLocales'; import { getTrad } from '../../utils'; /** diff --git a/packages/plugins/i18n/admin/src/components/LocaleSelect/tests/LocaleSelect.test.js b/packages/plugins/i18n/admin/src/components/LocaleSelect/tests/LocaleSelect.test.js index 5e2836fd3e..ac0323279a 100644 --- a/packages/plugins/i18n/admin/src/components/LocaleSelect/tests/LocaleSelect.test.js +++ b/packages/plugins/i18n/admin/src/components/LocaleSelect/tests/LocaleSelect.test.js @@ -1,14 +1,15 @@ import React from 'react'; -import { IntlProvider } from 'react-intl'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render as renderTL, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { QueryClientProvider, QueryClient } from 'react-query'; +import { IntlProvider } from 'react-intl'; +import { QueryClient, QueryClientProvider } from 'react-query'; import { Provider } from 'react-redux'; import { combineReducers, createStore } from 'redux'; -import reducers from '../../../hooks/reducers'; import LocaleSelect from '..'; +import reducers from '../../../hooks/reducers'; jest.mock('@strapi/helper-plugin', () => ({ ...jest.requireActual('@strapi/helper-plugin'), diff --git a/packages/plugins/i18n/admin/src/components/ModalCreate/AdvancedForm.js b/packages/plugins/i18n/admin/src/components/ModalCreate/AdvancedForm.js index 5b53fb92b7..0f16429039 100644 --- a/packages/plugins/i18n/admin/src/components/ModalCreate/AdvancedForm.js +++ b/packages/plugins/i18n/admin/src/components/ModalCreate/AdvancedForm.js @@ -1,7 +1,9 @@ import React from 'react'; + +import { Checkbox } from '@strapi/design-system'; import { useFormikContext } from 'formik'; import { useIntl } from 'react-intl'; -import { Checkbox } from '@strapi/design-system'; + import { getTrad } from '../../utils'; const AdvancedForm = () => { diff --git a/packages/plugins/i18n/admin/src/components/ModalCreate/BaseForm.js b/packages/plugins/i18n/admin/src/components/ModalCreate/BaseForm.js index 155ac7336a..6f2da167b5 100644 --- a/packages/plugins/i18n/admin/src/components/ModalCreate/BaseForm.js +++ b/packages/plugins/i18n/admin/src/components/ModalCreate/BaseForm.js @@ -1,7 +1,9 @@ import React, { useCallback } from 'react'; + import { Grid, GridItem, TextInput } from '@strapi/design-system'; -import { useIntl } from 'react-intl'; import { useFormikContext } from 'formik'; +import { useIntl } from 'react-intl'; + import { getTrad } from '../../utils'; import LocaleSelect from '../LocaleSelect'; diff --git a/packages/plugins/i18n/admin/src/components/ModalCreate/index.js b/packages/plugins/i18n/admin/src/components/ModalCreate/index.js index 6ae6f1887f..bbb20740ef 100644 --- a/packages/plugins/i18n/admin/src/components/ModalCreate/index.js +++ b/packages/plugins/i18n/admin/src/components/ModalCreate/index.js @@ -1,30 +1,33 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import { useRBACProvider, Form } from '@strapi/helper-plugin'; + import { - ModalLayout, - ModalHeader, + Box, + Button, + Divider, + Flex, ModalBody, ModalFooter, - TabGroup, - Tabs, + ModalHeader, + ModalLayout, Tab, - TabPanels, + TabGroup, TabPanel, - Button, + TabPanels, + Tabs, Typography, - Divider, - Box, - Flex, } from '@strapi/design-system'; +import { Form, useRBACProvider } from '@strapi/helper-plugin'; import { Check } from '@strapi/icons'; -import { useIntl } from 'react-intl'; import { Formik } from 'formik'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; + +import useAddLocale from '../../hooks/useAddLocale'; import localeFormSchema from '../../schemas'; import { getTrad } from '../../utils'; -import useAddLocale from '../../hooks/useAddLocale'; -import BaseForm from './BaseForm'; + import AdvancedForm from './AdvancedForm'; +import BaseForm from './BaseForm'; const initialFormValues = { code: '', diff --git a/packages/plugins/i18n/admin/src/components/ModalDelete/index.js b/packages/plugins/i18n/admin/src/components/ModalDelete/index.js index 3fb9a97c33..8889e67afa 100644 --- a/packages/plugins/i18n/admin/src/components/ModalDelete/index.js +++ b/packages/plugins/i18n/admin/src/components/ModalDelete/index.js @@ -1,6 +1,8 @@ import React from 'react'; -import PropTypes from 'prop-types'; + import { ConfirmDialog } from '@strapi/helper-plugin'; +import PropTypes from 'prop-types'; + import useDeleteLocale from '../../hooks/useDeleteLocale'; const ModalDelete = ({ localeToDelete, onClose }) => { diff --git a/packages/plugins/i18n/admin/src/components/ModalEdit/AdvancedForm.js b/packages/plugins/i18n/admin/src/components/ModalEdit/AdvancedForm.js index e1950cddcc..d711a346f2 100644 --- a/packages/plugins/i18n/admin/src/components/ModalEdit/AdvancedForm.js +++ b/packages/plugins/i18n/admin/src/components/ModalEdit/AdvancedForm.js @@ -1,8 +1,10 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import { useFormikContext } from 'formik'; -import { useIntl } from 'react-intl'; + import { Checkbox } from '@strapi/design-system'; +import { useFormikContext } from 'formik'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; + import { getTrad } from '../../utils'; const AdvancedForm = ({ isDefaultLocale }) => { diff --git a/packages/plugins/i18n/admin/src/components/ModalEdit/BaseForm.js b/packages/plugins/i18n/admin/src/components/ModalEdit/BaseForm.js index ca22ce6a8a..ace869bf82 100644 --- a/packages/plugins/i18n/admin/src/components/ModalEdit/BaseForm.js +++ b/packages/plugins/i18n/admin/src/components/ModalEdit/BaseForm.js @@ -1,10 +1,12 @@ import React from 'react'; -import { useIntl } from 'react-intl'; -import PropTypes from 'prop-types'; + +import { Grid, GridItem, Option, Select, TextInput } from '@strapi/design-system'; import { useFormikContext } from 'formik'; -import { Grid, GridItem, TextInput, Select, Option } from '@strapi/design-system'; -import { getTrad } from '../../utils'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; + import useDefaultLocales from '../../hooks/useDefaultLocales'; +import { getTrad } from '../../utils'; const BaseForm = ({ locale }) => { const { formatMessage } = useIntl(); diff --git a/packages/plugins/i18n/admin/src/components/ModalEdit/index.js b/packages/plugins/i18n/admin/src/components/ModalEdit/index.js index ff064674c2..59cf869c08 100644 --- a/packages/plugins/i18n/admin/src/components/ModalEdit/index.js +++ b/packages/plugins/i18n/admin/src/components/ModalEdit/index.js @@ -1,30 +1,33 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import { Form, useRBACProvider } from '@strapi/helper-plugin'; -import { useIntl } from 'react-intl'; -import { Formik } from 'formik'; -import { Check } from '@strapi/icons'; + import { - ModalLayout, - ModalHeader, - ModalBody, - ModalFooter, - TabGroup, - Tabs, - Tab, - TabPanels, - TabPanel, - Flex, Box, Button, Divider, + Flex, + ModalBody, + ModalFooter, + ModalHeader, + ModalLayout, + Tab, + TabGroup, + TabPanel, + TabPanels, + Tabs, Typography, } from '@strapi/design-system'; -import localeFormSchema from '../../schemas'; +import { Form, useRBACProvider } from '@strapi/helper-plugin'; +import { Check } from '@strapi/icons'; +import { Formik } from 'formik'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; + import useEditLocale from '../../hooks/useEditLocale'; +import localeFormSchema from '../../schemas'; import { getTrad } from '../../utils'; -import BaseForm from './BaseForm'; + import AdvancedForm from './AdvancedForm'; +import BaseForm from './BaseForm'; const ModalEdit = ({ locale, onClose }) => { const { refetchPermissions } = useRBACProvider(); diff --git a/packages/plugins/i18n/admin/src/components/SettingsModal.js b/packages/plugins/i18n/admin/src/components/SettingsModal.js index f27345a44f..30d954705e 100644 --- a/packages/plugins/i18n/admin/src/components/SettingsModal.js +++ b/packages/plugins/i18n/admin/src/components/SettingsModal.js @@ -1,16 +1,18 @@ import React from 'react'; -import PropTypes from 'prop-types'; + import { - ModalHeader, HeaderModal, HeaderModalTitle, ModalForm, + ModalHeader, + Tab, Tabs, TabsNav, - Tab, TabsPanel, } from '@strapi/helper-plugin'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; + import { getTrad } from '../utils'; const SettingsModal = ({ children, title, breadCrumb, tabsAriaLabel, tabsId }) => { diff --git a/packages/plugins/i18n/admin/src/contentManagerHooks/addColumnToTable.js b/packages/plugins/i18n/admin/src/contentManagerHooks/addColumnToTable.js index 73ce42fb1f..e4ee94d534 100644 --- a/packages/plugins/i18n/admin/src/contentManagerHooks/addColumnToTable.js +++ b/packages/plugins/i18n/admin/src/contentManagerHooks/addColumnToTable.js @@ -1,5 +1,7 @@ import React from 'react'; + import get from 'lodash/get'; + import LocaleListCell from '../components/LocaleListCell/LocaleListCell'; const addColumnToTableHook = ({ displayedHeaders, layout }) => { diff --git a/packages/plugins/i18n/admin/src/contentManagerHooks/mutateEditViewLayout.js b/packages/plugins/i18n/admin/src/contentManagerHooks/mutateEditViewLayout.js index 0e79461fcd..de1727f3d7 100644 --- a/packages/plugins/i18n/admin/src/contentManagerHooks/mutateEditViewLayout.js +++ b/packages/plugins/i18n/admin/src/contentManagerHooks/mutateEditViewLayout.js @@ -1,6 +1,8 @@ import React from 'react'; -import get from 'lodash/get'; + import { Earth as I18N, EarthStriked as StrikedWorld } from '@strapi/icons'; +import get from 'lodash/get'; + import LabelAction from '../components/LabelAction'; import { getTrad } from '../utils'; diff --git a/packages/plugins/i18n/admin/src/contentManagerHooks/tests/addLocaleToCollectionTypesLinks.test.js b/packages/plugins/i18n/admin/src/contentManagerHooks/tests/addLocaleToCollectionTypesLinks.test.js index 1e39e14a29..e4851b8703 100644 --- a/packages/plugins/i18n/admin/src/contentManagerHooks/tests/addLocaleToCollectionTypesLinks.test.js +++ b/packages/plugins/i18n/admin/src/contentManagerHooks/tests/addLocaleToCollectionTypesLinks.test.js @@ -1,4 +1,5 @@ import { fixtures } from '@strapi/admin-test-utils'; + import addLocaleToCollectionTypesLinksHook from '../addLocaleToCollectionTypesLinks'; describe('i18n | contentManagerHooks | addLocaleToCollectionTypesLinksHook', () => { diff --git a/packages/plugins/i18n/admin/src/contentManagerHooks/tests/addLocaleToSingleTypesLinks.test.js b/packages/plugins/i18n/admin/src/contentManagerHooks/tests/addLocaleToSingleTypesLinks.test.js index d0b6e5ff06..781e373026 100644 --- a/packages/plugins/i18n/admin/src/contentManagerHooks/tests/addLocaleToSingleTypesLinks.test.js +++ b/packages/plugins/i18n/admin/src/contentManagerHooks/tests/addLocaleToSingleTypesLinks.test.js @@ -1,4 +1,5 @@ import { fixtures } from '@strapi/admin-test-utils'; + import addLocaleToSingleTypesLinks from '../addLocaleToSingleTypesLinks'; describe('i18n | contentManagerHooks | addLocaleToSingleTypesLinks', () => { diff --git a/packages/plugins/i18n/admin/src/contentManagerHooks/tests/mutateEditViewLayout.test.js b/packages/plugins/i18n/admin/src/contentManagerHooks/tests/mutateEditViewLayout.test.js index 4a8f4bef6b..a21440e65a 100644 --- a/packages/plugins/i18n/admin/src/contentManagerHooks/tests/mutateEditViewLayout.test.js +++ b/packages/plugins/i18n/admin/src/contentManagerHooks/tests/mutateEditViewLayout.test.js @@ -1,5 +1,7 @@ import React from 'react'; + import { Earth as I18N, EarthStriked as StrikedWorld } from '@strapi/icons'; + import LabelAction from '../../components/LabelAction'; import { getTrad } from '../../utils'; import mutateEditViewLayout, { diff --git a/packages/plugins/i18n/admin/src/contentManagerHooks/utils/addLocaleToLinksSearch.js b/packages/plugins/i18n/admin/src/contentManagerHooks/utils/addLocaleToLinksSearch.js index 2fc824f096..42f08af5fb 100644 --- a/packages/plugins/i18n/admin/src/contentManagerHooks/utils/addLocaleToLinksSearch.js +++ b/packages/plugins/i18n/admin/src/contentManagerHooks/utils/addLocaleToLinksSearch.js @@ -1,5 +1,6 @@ import get from 'lodash/get'; -import { stringify, parse } from 'qs'; +import { parse, stringify } from 'qs'; + import getDefaultLocale from '../../utils/getDefaultLocale'; const addLocaleToLinksSearch = (links, kind, contentTypeSchemas, locales, permissions) => { diff --git a/packages/plugins/i18n/admin/src/hooks/reducers.js b/packages/plugins/i18n/admin/src/hooks/reducers.js index fe6b26ba90..e0e60df9a2 100644 --- a/packages/plugins/i18n/admin/src/hooks/reducers.js +++ b/packages/plugins/i18n/admin/src/hooks/reducers.js @@ -1,7 +1,9 @@ import produce from 'immer'; import set from 'lodash/set'; + import pluginId from '../pluginId'; -import { RESOLVE_LOCALES, ADD_LOCALE, DELETE_LOCALE, UPDATE_LOCALE } from './constants'; + +import { ADD_LOCALE, DELETE_LOCALE, RESOLVE_LOCALES, UPDATE_LOCALE } from './constants'; export const initialState = { isLoading: true, diff --git a/packages/plugins/i18n/admin/src/hooks/tests/reducers.test.js b/packages/plugins/i18n/admin/src/hooks/tests/reducers.test.js index 0f5d4a912d..8761a72422 100644 --- a/packages/plugins/i18n/admin/src/hooks/tests/reducers.test.js +++ b/packages/plugins/i18n/admin/src/hooks/tests/reducers.test.js @@ -1,5 +1,5 @@ +import { ADD_LOCALE, DELETE_LOCALE, RESOLVE_LOCALES, UPDATE_LOCALE } from '../constants'; import reducers, { initialState } from '../reducers'; -import { RESOLVE_LOCALES, ADD_LOCALE, DELETE_LOCALE, UPDATE_LOCALE } from '../constants'; describe('i18n reducer', () => { it('resolves the initial state when the action is not known', () => { diff --git a/packages/plugins/i18n/admin/src/hooks/useAddLocale/index.js b/packages/plugins/i18n/admin/src/hooks/useAddLocale/index.js index cf93518b88..993967dc29 100644 --- a/packages/plugins/i18n/admin/src/hooks/useAddLocale/index.js +++ b/packages/plugins/i18n/admin/src/hooks/useAddLocale/index.js @@ -1,7 +1,9 @@ import { useState } from 'react'; + import { useFetchClient, useNotification } from '@strapi/helper-plugin'; -import { useDispatch } from 'react-redux'; import get from 'lodash/get'; +import { useDispatch } from 'react-redux'; + import { getTrad } from '../../utils'; import { ADD_LOCALE } from '../constants'; diff --git a/packages/plugins/i18n/admin/src/hooks/useContentTypePermissions/index.js b/packages/plugins/i18n/admin/src/hooks/useContentTypePermissions/index.js index 9c3be06052..449a302a95 100644 --- a/packages/plugins/i18n/admin/src/hooks/useContentTypePermissions/index.js +++ b/packages/plugins/i18n/admin/src/hooks/useContentTypePermissions/index.js @@ -1,4 +1,5 @@ import { useSelector } from 'react-redux'; + import selectCollectionTypesRelatedPermissions from '../../selectors/selectCollectionTypesRelatedPermissions'; const useContentTypePermissions = (slug) => { diff --git a/packages/plugins/i18n/admin/src/hooks/useDefaultLocales/index.js b/packages/plugins/i18n/admin/src/hooks/useDefaultLocales/index.js index d308934759..709b7a3c2d 100644 --- a/packages/plugins/i18n/admin/src/hooks/useDefaultLocales/index.js +++ b/packages/plugins/i18n/admin/src/hooks/useDefaultLocales/index.js @@ -1,7 +1,8 @@ -import { useQuery } from 'react-query'; -import { useFetchClient, useNotification } from '@strapi/helper-plugin'; import { useNotifyAT } from '@strapi/design-system'; +import { useFetchClient, useNotification } from '@strapi/helper-plugin'; import { useIntl } from 'react-intl'; +import { useQuery } from 'react-query'; + import { getTrad } from '../../utils'; const useDefaultLocales = () => { diff --git a/packages/plugins/i18n/admin/src/hooks/useDeleteLocale/index.js b/packages/plugins/i18n/admin/src/hooks/useDeleteLocale/index.js index 2d9fc364ee..8757751ca5 100644 --- a/packages/plugins/i18n/admin/src/hooks/useDeleteLocale/index.js +++ b/packages/plugins/i18n/admin/src/hooks/useDeleteLocale/index.js @@ -1,6 +1,8 @@ import { useState } from 'react'; + import { useFetchClient, useNotification } from '@strapi/helper-plugin'; import { useDispatch } from 'react-redux'; + import { getTrad } from '../../utils'; import { DELETE_LOCALE } from '../constants'; diff --git a/packages/plugins/i18n/admin/src/hooks/useEditLocale/index.js b/packages/plugins/i18n/admin/src/hooks/useEditLocale/index.js index 564e1fe72c..434252d2a5 100644 --- a/packages/plugins/i18n/admin/src/hooks/useEditLocale/index.js +++ b/packages/plugins/i18n/admin/src/hooks/useEditLocale/index.js @@ -1,6 +1,8 @@ import { useState } from 'react'; + import { useFetchClient, useNotification } from '@strapi/helper-plugin'; import { useDispatch } from 'react-redux'; + import { getTrad } from '../../utils'; import { UPDATE_LOCALE } from '../constants'; diff --git a/packages/plugins/i18n/admin/src/hooks/useHasI18n/index.js b/packages/plugins/i18n/admin/src/hooks/useHasI18n/index.js index e20a51f413..41438328be 100644 --- a/packages/plugins/i18n/admin/src/hooks/useHasI18n/index.js +++ b/packages/plugins/i18n/admin/src/hooks/useHasI18n/index.js @@ -1,5 +1,5 @@ -import { useSelector } from 'react-redux'; import get from 'lodash/get'; +import { useSelector } from 'react-redux'; const selectContentManagerListViewPluginOptions = (state) => state['content-manager_listView'].contentType.pluginOptions; diff --git a/packages/plugins/i18n/admin/src/hooks/useLocales/index.js b/packages/plugins/i18n/admin/src/hooks/useLocales/index.js index 1b165b8323..b1c8f1e3db 100644 --- a/packages/plugins/i18n/admin/src/hooks/useLocales/index.js +++ b/packages/plugins/i18n/admin/src/hooks/useLocales/index.js @@ -1,6 +1,8 @@ import { useEffect } from 'react'; + import { useFetchClient, useNotification } from '@strapi/helper-plugin'; -import { useSelector, useDispatch } from 'react-redux'; +import { useDispatch, useSelector } from 'react-redux'; + import { RESOLVE_LOCALES } from '../constants'; const useLocales = () => { diff --git a/packages/plugins/i18n/admin/src/index.js b/packages/plugins/i18n/admin/src/index.js index d549fbf2ce..86e1404cc5 100644 --- a/packages/plugins/i18n/admin/src/index.js +++ b/packages/plugins/i18n/admin/src/index.js @@ -1,25 +1,27 @@ +import { prefixPluginTranslations } from '@strapi/helper-plugin'; import get from 'lodash/get'; import * as yup from 'yup'; -import { prefixPluginTranslations } from '@strapi/helper-plugin'; + import pluginPkg from '../../package.json'; + import CheckboxConfirmation from './components/CheckboxConfirmation'; import CMEditViewInjectedComponents from './components/CMEditViewInjectedComponents'; +import DeleteModalAdditionalInfos from './components/CMListViewInjectedComponents/DeleteModalAdditionalInfos'; +import PublishModalAdditionalInfos from './components/CMListViewInjectedComponents/PublishModalAdditionalInfos'; +import UnpublishModalAdditionalInfos from './components/CMListViewInjectedComponents/UnpublishModalAdditionalInfos'; import Initializer from './components/Initializer'; import LocalePicker from './components/LocalePicker'; +import addColumnToTableHook from './contentManagerHooks/addColumnToTable'; +import addLocaleToCollectionTypesLinksHook from './contentManagerHooks/addLocaleToCollectionTypesLinks'; +import addLocaleToSingleTypesLinksHook from './contentManagerHooks/addLocaleToSingleTypesLinks'; +import mutateEditViewLayoutHook from './contentManagerHooks/mutateEditViewLayout'; +import i18nReducers from './hooks/reducers'; import middlewares from './middlewares'; import pluginPermissions from './permissions'; import pluginId from './pluginId'; import { getTrad } from './utils'; -import mutateCTBContentTypeSchema from './utils/mutateCTBContentTypeSchema'; import LOCALIZED_FIELDS from './utils/localizedFields'; -import i18nReducers from './hooks/reducers'; -import DeleteModalAdditionalInfos from './components/CMListViewInjectedComponents/DeleteModalAdditionalInfos'; -import PublishModalAdditionalInfos from './components/CMListViewInjectedComponents/PublishModalAdditionalInfos'; -import UnpublishModalAdditionalInfos from './components/CMListViewInjectedComponents/UnpublishModalAdditionalInfos'; -import addLocaleToCollectionTypesLinksHook from './contentManagerHooks/addLocaleToCollectionTypesLinks'; -import addLocaleToSingleTypesLinksHook from './contentManagerHooks/addLocaleToSingleTypesLinks'; -import addColumnToTableHook from './contentManagerHooks/addColumnToTable'; -import mutateEditViewLayoutHook from './contentManagerHooks/mutateEditViewLayout'; +import mutateCTBContentTypeSchema from './utils/mutateCTBContentTypeSchema'; const name = pluginPkg.strapi.name; diff --git a/packages/plugins/i18n/admin/src/middlewares/addCommonFieldsToInitialDataMiddleware.js b/packages/plugins/i18n/admin/src/middlewares/addCommonFieldsToInitialDataMiddleware.js index 544771670f..e5ace616ed 100644 --- a/packages/plugins/i18n/admin/src/middlewares/addCommonFieldsToInitialDataMiddleware.js +++ b/packages/plugins/i18n/admin/src/middlewares/addCommonFieldsToInitialDataMiddleware.js @@ -1,12 +1,13 @@ +import { + contentManagementUtilRemoveFieldsFromData, + formatContentTypeData, + getFetchClient, +} from '@strapi/helper-plugin'; +import cloneDeep from 'lodash/cloneDeep'; import get from 'lodash/get'; import merge from 'lodash/merge'; -import cloneDeep from 'lodash/cloneDeep'; import { parse } from 'qs'; -import { - getFetchClient, - formatContentTypeData, - contentManagementUtilRemoveFieldsFromData, -} from '@strapi/helper-plugin'; + import pluginId from '../pluginId'; const addCommonFieldsToInitialDataMiddleware = diff --git a/packages/plugins/i18n/admin/src/middlewares/index.js b/packages/plugins/i18n/admin/src/middlewares/index.js index 64244e30b5..78d48e332d 100644 --- a/packages/plugins/i18n/admin/src/middlewares/index.js +++ b/packages/plugins/i18n/admin/src/middlewares/index.js @@ -1,6 +1,6 @@ import addCommonFieldsToInitialDataMiddleware from './addCommonFieldsToInitialDataMiddleware'; -import extendCTBInitialDataMiddleware from './extendCTBInitialDataMiddleware'; import extendCTBAttributeInitialDataMiddleware from './extendCTBAttributeInitialDataMiddleware'; +import extendCTBInitialDataMiddleware from './extendCTBInitialDataMiddleware'; import localePermissionMiddleware from './localePermissionMiddleware'; const middlewares = [ diff --git a/packages/plugins/i18n/admin/src/middlewares/tests/addCommonFieldsToInitialDataMiddleware.test.js b/packages/plugins/i18n/admin/src/middlewares/tests/addCommonFieldsToInitialDataMiddleware.test.js index edc48e6093..13dafa8504 100644 --- a/packages/plugins/i18n/admin/src/middlewares/tests/addCommonFieldsToInitialDataMiddleware.test.js +++ b/packages/plugins/i18n/admin/src/middlewares/tests/addCommonFieldsToInitialDataMiddleware.test.js @@ -1,4 +1,5 @@ import { fixtures } from '@strapi/admin-test-utils'; + import addCommonFieldsToInitialDataMiddleware from '../addCommonFieldsToInitialDataMiddleware'; jest.mock('@strapi/helper-plugin', () => ({ diff --git a/packages/plugins/i18n/admin/src/pages/SettingsPage/LocaleSettingsPage.js b/packages/plugins/i18n/admin/src/pages/SettingsPage/LocaleSettingsPage.js index 8c9240606e..9fd0bdfafb 100644 --- a/packages/plugins/i18n/admin/src/pages/SettingsPage/LocaleSettingsPage.js +++ b/packages/plugins/i18n/admin/src/pages/SettingsPage/LocaleSettingsPage.js @@ -1,5 +1,7 @@ import React, { useState } from 'react'; + import PropTypes from 'prop-types'; + import LocaleList from '../../components/LocaleList'; const LocaleSettingsPage = ({ diff --git a/packages/plugins/i18n/admin/src/pages/SettingsPage/index.js b/packages/plugins/i18n/admin/src/pages/SettingsPage/index.js index 444c3f67d7..451272ea30 100644 --- a/packages/plugins/i18n/admin/src/pages/SettingsPage/index.js +++ b/packages/plugins/i18n/admin/src/pages/SettingsPage/index.js @@ -1,8 +1,11 @@ import React from 'react'; + import { useRBAC } from '@strapi/helper-plugin'; -import LocaleSettingsPage from './LocaleSettingsPage'; + import i18nPermissions from '../../permissions'; +import LocaleSettingsPage from './LocaleSettingsPage'; + const ProtectedLocaleSettingsPage = () => { const { isLoading, diff --git a/packages/plugins/i18n/admin/src/schemas.js b/packages/plugins/i18n/admin/src/schemas.js index fc90f23ecf..e54e3b7262 100644 --- a/packages/plugins/i18n/admin/src/schemas.js +++ b/packages/plugins/i18n/admin/src/schemas.js @@ -1,5 +1,5 @@ -import { object, string } from 'yup'; import { translatedErrors as errorsTrads } from '@strapi/helper-plugin'; +import { object, string } from 'yup'; const localeFormSchema = object().shape({ code: string().required(), diff --git a/packages/plugins/i18n/admin/src/selectors/tests/selectors.test.js b/packages/plugins/i18n/admin/src/selectors/tests/selectors.test.js index 472835bf38..52f1267e01 100644 --- a/packages/plugins/i18n/admin/src/selectors/tests/selectors.test.js +++ b/packages/plugins/i18n/admin/src/selectors/tests/selectors.test.js @@ -1,4 +1,5 @@ import { fixtures } from '@strapi/admin-test-utils'; + import selectCollectionTypePermissions from '../selectCollectionTypesRelatedPermissions'; import selectI18NLocales from '../selectI18nLocales'; diff --git a/packages/plugins/sentry/admin/src/index.js b/packages/plugins/sentry/admin/src/index.js index d153f9a2f7..8b38709d0a 100644 --- a/packages/plugins/sentry/admin/src/index.js +++ b/packages/plugins/sentry/admin/src/index.js @@ -1,5 +1,7 @@ import { prefixPluginTranslations } from '@strapi/helper-plugin'; + import pluginPkg from '../../package.json'; + import pluginId from './pluginId'; const name = pluginPkg.strapi.name; diff --git a/packages/plugins/users-permissions/admin/src/components/BoundRoute/index.js b/packages/plugins/users-permissions/admin/src/components/BoundRoute/index.js index 4a06bedce5..7680ff07c7 100644 --- a/packages/plugins/users-permissions/admin/src/components/BoundRoute/index.js +++ b/packages/plugins/users-permissions/admin/src/components/BoundRoute/index.js @@ -1,10 +1,12 @@ import React from 'react'; -import styled from 'styled-components'; -import { Flex, Box, Typography } from '@strapi/design-system'; + +import { Box, Flex, Typography } from '@strapi/design-system'; import map from 'lodash/map'; import tail from 'lodash/tail'; -import { useIntl } from 'react-intl'; import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; +import styled from 'styled-components'; + import getMethodColor from './getMethodColor'; const MethodBox = styled(Box)` diff --git a/packages/plugins/users-permissions/admin/src/components/FormModal/Input/index.js b/packages/plugins/users-permissions/admin/src/components/FormModal/Input/index.js index 7d6add2d87..e5eaf945a9 100644 --- a/packages/plugins/users-permissions/admin/src/components/FormModal/Input/index.js +++ b/packages/plugins/users-permissions/admin/src/components/FormModal/Input/index.js @@ -5,9 +5,10 @@ */ import React from 'react'; -import { useIntl } from 'react-intl'; -import { ToggleInput, TextInput } from '@strapi/design-system'; + +import { TextInput, ToggleInput } from '@strapi/design-system'; import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; const Input = ({ description, diff --git a/packages/plugins/users-permissions/admin/src/components/FormModal/Input/tests/index.test.js b/packages/plugins/users-permissions/admin/src/components/FormModal/Input/tests/index.test.js index 2ced91bd54..40394e19c5 100644 --- a/packages/plugins/users-permissions/admin/src/components/FormModal/Input/tests/index.test.js +++ b/packages/plugins/users-permissions/admin/src/components/FormModal/Input/tests/index.test.js @@ -5,9 +5,11 @@ */ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; + import Input from '../index'; const messages = {}; diff --git a/packages/plugins/users-permissions/admin/src/components/FormModal/index.js b/packages/plugins/users-permissions/admin/src/components/FormModal/index.js index eff97c1aca..83c059252b 100644 --- a/packages/plugins/users-permissions/admin/src/components/FormModal/index.js +++ b/packages/plugins/users-permissions/admin/src/components/FormModal/index.js @@ -5,21 +5,23 @@ */ import React from 'react'; -import { useIntl } from 'react-intl'; + import { Button, Flex, Grid, GridItem, - ModalLayout, - ModalHeader, - ModalFooter, ModalBody, + ModalFooter, + ModalHeader, + ModalLayout, } from '@strapi/design-system'; import { Breadcrumbs, Crumb } from '@strapi/design-system/v2'; -import PropTypes from 'prop-types'; -import { Formik } from 'formik'; import { Form } from '@strapi/helper-plugin'; +import { Formik } from 'formik'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; + import Input from './Input'; const FormModal = ({ diff --git a/packages/plugins/users-permissions/admin/src/components/FormModal/tests/index.test.js b/packages/plugins/users-permissions/admin/src/components/FormModal/tests/index.test.js index b7cac37efa..ec5eb462e6 100644 --- a/packages/plugins/users-permissions/admin/src/components/FormModal/tests/index.test.js +++ b/packages/plugins/users-permissions/admin/src/components/FormModal/tests/index.test.js @@ -5,9 +5,11 @@ */ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { render } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; + import FormModal from '../index'; const messages = {}; diff --git a/packages/plugins/users-permissions/admin/src/components/Permissions/PermissionRow/CheckboxWrapper.js b/packages/plugins/users-permissions/admin/src/components/Permissions/PermissionRow/CheckboxWrapper.js index 5a1b456336..e3165e258d 100644 --- a/packages/plugins/users-permissions/admin/src/components/Permissions/PermissionRow/CheckboxWrapper.js +++ b/packages/plugins/users-permissions/admin/src/components/Permissions/PermissionRow/CheckboxWrapper.js @@ -1,5 +1,5 @@ -import styled, { css } from 'styled-components'; import { Box } from '@strapi/design-system'; +import styled, { css } from 'styled-components'; const activeCheckboxWrapperStyles = css` background: ${(props) => props.theme.colors.primary100}; diff --git a/packages/plugins/users-permissions/admin/src/components/Permissions/PermissionRow/SubCategory.js b/packages/plugins/users-permissions/admin/src/components/Permissions/PermissionRow/SubCategory.js index 1ecc9b7d57..924883932d 100644 --- a/packages/plugins/users-permissions/admin/src/components/Permissions/PermissionRow/SubCategory.js +++ b/packages/plugins/users-permissions/admin/src/components/Permissions/PermissionRow/SubCategory.js @@ -1,13 +1,16 @@ import React, { useCallback, useMemo } from 'react'; -import get from 'lodash/get'; -import styled from 'styled-components'; -import PropTypes from 'prop-types'; -import { Box, Checkbox, Flex, Typography, Grid, GridItem } from '@strapi/design-system'; + +import { Box, Checkbox, Flex, Grid, GridItem, Typography } from '@strapi/design-system'; import { Cog as CogIcon } from '@strapi/icons'; +import get from 'lodash/get'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import CheckboxWrapper from './CheckboxWrapper'; +import styled from 'styled-components'; + import { useUsersPermissions } from '../../../contexts/UsersPermissionsContext'; +import CheckboxWrapper from './CheckboxWrapper'; + const Border = styled.div` flex: 1; align-self: center; diff --git a/packages/plugins/users-permissions/admin/src/components/Permissions/PermissionRow/index.js b/packages/plugins/users-permissions/admin/src/components/Permissions/PermissionRow/index.js index 27814e1832..08ff3ffc3d 100644 --- a/packages/plugins/users-permissions/admin/src/components/Permissions/PermissionRow/index.js +++ b/packages/plugins/users-permissions/admin/src/components/Permissions/PermissionRow/index.js @@ -1,7 +1,9 @@ import React, { useMemo } from 'react'; -import PropTypes from 'prop-types'; -import sortBy from 'lodash/sortBy'; + import { Box } from '@strapi/design-system'; +import sortBy from 'lodash/sortBy'; +import PropTypes from 'prop-types'; + import SubCategory from './SubCategory'; const PermissionRow = ({ name, permissions }) => { diff --git a/packages/plugins/users-permissions/admin/src/components/Permissions/index.js b/packages/plugins/users-permissions/admin/src/components/Permissions/index.js index 65f24fca75..260ae00cfe 100644 --- a/packages/plugins/users-permissions/admin/src/components/Permissions/index.js +++ b/packages/plugins/users-permissions/admin/src/components/Permissions/index.js @@ -1,10 +1,13 @@ import React, { useReducer } from 'react'; -import { Accordion, AccordionToggle, AccordionContent, Box, Flex } from '@strapi/design-system'; + +import { Accordion, AccordionContent, AccordionToggle, Box, Flex } from '@strapi/design-system'; import { useIntl } from 'react-intl'; + import { useUsersPermissions } from '../../contexts/UsersPermissionsContext'; import formatPluginName from '../../utils/formatPluginName'; -import PermissionRow from './PermissionRow'; + import init from './init'; +import PermissionRow from './PermissionRow'; import { initialState, reducer } from './reducer'; const Permissions = () => { diff --git a/packages/plugins/users-permissions/admin/src/components/Permissions/tests/reducer.test.js b/packages/plugins/users-permissions/admin/src/components/Permissions/tests/reducer.test.js index 8640dfdcf8..5a6b8a0b4b 100644 --- a/packages/plugins/users-permissions/admin/src/components/Permissions/tests/reducer.test.js +++ b/packages/plugins/users-permissions/admin/src/components/Permissions/tests/reducer.test.js @@ -1,4 +1,5 @@ import produce from 'immer'; + import { reducer } from '../reducer'; describe('USERS PERMISSIONS | COMPONENTS | Permissions | reducer', () => { diff --git a/packages/plugins/users-permissions/admin/src/components/Policies/index.js b/packages/plugins/users-permissions/admin/src/components/Policies/index.js index 4ab6111a4e..e9c53b3bd3 100644 --- a/packages/plugins/users-permissions/admin/src/components/Policies/index.js +++ b/packages/plugins/users-permissions/admin/src/components/Policies/index.js @@ -1,9 +1,10 @@ import React from 'react'; -import { useIntl } from 'react-intl'; -import { Typography, Flex, GridItem } from '@strapi/design-system'; + +import { Flex, GridItem, Typography } from '@strapi/design-system'; import get from 'lodash/get'; import isEmpty from 'lodash/isEmpty'; import without from 'lodash/without'; +import { useIntl } from 'react-intl'; import { useUsersPermissions } from '../../contexts/UsersPermissionsContext'; import BoundRoute from '../BoundRoute'; diff --git a/packages/plugins/users-permissions/admin/src/components/UsersPermissions/index.js b/packages/plugins/users-permissions/admin/src/components/UsersPermissions/index.js index 1944c6bae3..6f40fa3e5f 100644 --- a/packages/plugins/users-permissions/admin/src/components/UsersPermissions/index.js +++ b/packages/plugins/users-permissions/admin/src/components/UsersPermissions/index.js @@ -1,13 +1,16 @@ -import React, { memo, useReducer, forwardRef, useImperativeHandle } from 'react'; +import React, { forwardRef, memo, useImperativeHandle, useReducer } from 'react'; + +import { Flex, Grid, GridItem, Typography } from '@strapi/design-system'; import PropTypes from 'prop-types'; -import { Typography, Flex, Grid, GridItem } from '@strapi/design-system'; import { useIntl } from 'react-intl'; -import getTrad from '../../utils/getTrad'; -import Policies from '../Policies'; -import Permissions from '../Permissions'; -import reducer, { initialState } from './reducer'; + import { UsersPermissionsProvider } from '../../contexts/UsersPermissionsContext'; +import getTrad from '../../utils/getTrad'; +import Permissions from '../Permissions'; +import Policies from '../Policies'; + import init from './init'; +import reducer, { initialState } from './reducer'; const UsersPermissions = forwardRef(({ permissions, routes }, ref) => { const { formatMessage } = useIntl(); diff --git a/packages/plugins/users-permissions/admin/src/components/UsersPermissions/tests/reducer.test.js b/packages/plugins/users-permissions/admin/src/components/UsersPermissions/tests/reducer.test.js index 075c4c34be..963f164ce0 100644 --- a/packages/plugins/users-permissions/admin/src/components/UsersPermissions/tests/reducer.test.js +++ b/packages/plugins/users-permissions/admin/src/components/UsersPermissions/tests/reducer.test.js @@ -1,4 +1,5 @@ import produce from 'immer'; + import reducer from '../reducer'; describe('USERS PERMISSIONS | COMPONENTS | UsersPermissions | reducer', () => { diff --git a/packages/plugins/users-permissions/admin/src/contexts/UsersPermissionsContext/index.js b/packages/plugins/users-permissions/admin/src/contexts/UsersPermissionsContext/index.js index b015df27e9..ce66c347d4 100644 --- a/packages/plugins/users-permissions/admin/src/contexts/UsersPermissionsContext/index.js +++ b/packages/plugins/users-permissions/admin/src/contexts/UsersPermissionsContext/index.js @@ -1,4 +1,5 @@ import React, { createContext, useContext } from 'react'; + import PropTypes from 'prop-types'; const UsersPermissions = createContext({}); diff --git a/packages/plugins/users-permissions/admin/src/hooks/index.js b/packages/plugins/users-permissions/admin/src/hooks/index.js index a3059f6e83..3b6a597d15 100644 --- a/packages/plugins/users-permissions/admin/src/hooks/index.js +++ b/packages/plugins/users-permissions/admin/src/hooks/index.js @@ -1,5 +1,5 @@ // eslint-disable-next-line import/prefer-default-export -export { default as useForm } from './useForm'; -export { default as useRolesList } from './useRolesList'; -export { default as usePlugins } from './usePlugins'; export { default as useFetchRole } from './useFetchRole'; +export { default as useForm } from './useForm'; +export { default as usePlugins } from './usePlugins'; +export { default as useRolesList } from './useRolesList'; diff --git a/packages/plugins/users-permissions/admin/src/hooks/useFetchRole/index.js b/packages/plugins/users-permissions/admin/src/hooks/useFetchRole/index.js index d633d1cb7e..629e00199b 100644 --- a/packages/plugins/users-permissions/admin/src/hooks/useFetchRole/index.js +++ b/packages/plugins/users-permissions/admin/src/hooks/useFetchRole/index.js @@ -1,8 +1,11 @@ -import { useCallback, useReducer, useEffect, useRef } from 'react'; -import { useNotification, useFetchClient } from '@strapi/helper-plugin'; -import reducer, { initialState } from './reducer'; +import { useCallback, useEffect, useReducer, useRef } from 'react'; + +import { useFetchClient, useNotification } from '@strapi/helper-plugin'; + import pluginId from '../../pluginId'; +import reducer, { initialState } from './reducer'; + const useFetchRole = (id) => { const [state, dispatch] = useReducer(reducer, initialState); const toggleNotification = useNotification(); diff --git a/packages/plugins/users-permissions/admin/src/hooks/useForm/index.js b/packages/plugins/users-permissions/admin/src/hooks/useForm/index.js index 35000194a4..0cf0ef6652 100644 --- a/packages/plugins/users-permissions/admin/src/hooks/useForm/index.js +++ b/packages/plugins/users-permissions/admin/src/hooks/useForm/index.js @@ -1,6 +1,9 @@ import { useCallback, useEffect, useReducer, useRef } from 'react'; -import { useRBAC, useFetchClient, useNotification } from '@strapi/helper-plugin'; + +import { useFetchClient, useNotification, useRBAC } from '@strapi/helper-plugin'; + import { getRequestURL } from '../../utils'; + import reducer, { initialState } from './reducer'; const useUserForm = (endPoint, permissions) => { diff --git a/packages/plugins/users-permissions/admin/src/hooks/useForm/tests/reducer.test.js b/packages/plugins/users-permissions/admin/src/hooks/useForm/tests/reducer.test.js index 0684142db8..0182050457 100644 --- a/packages/plugins/users-permissions/admin/src/hooks/useForm/tests/reducer.test.js +++ b/packages/plugins/users-permissions/admin/src/hooks/useForm/tests/reducer.test.js @@ -1,4 +1,5 @@ import produce from 'immer'; + import reducer from '../reducer'; describe('USERS PERMISSIONS | HOOKS | useForm | reducer', () => { diff --git a/packages/plugins/users-permissions/admin/src/hooks/usePlugins/index.js b/packages/plugins/users-permissions/admin/src/hooks/usePlugins/index.js index efa0389cb6..d1abd28af5 100644 --- a/packages/plugins/users-permissions/admin/src/hooks/usePlugins/index.js +++ b/packages/plugins/users-permissions/admin/src/hooks/usePlugins/index.js @@ -1,9 +1,12 @@ import { useCallback, useEffect, useReducer } from 'react'; -import { useNotification, useFetchClient } from '@strapi/helper-plugin'; + +import { useFetchClient, useNotification } from '@strapi/helper-plugin'; import get from 'lodash/get'; -import init from './init'; + import pluginId from '../../pluginId'; import { cleanPermissions } from '../../utils'; + +import init from './init'; import reducer, { initialState } from './reducer'; const usePlugins = (shouldFetchData = true) => { diff --git a/packages/plugins/users-permissions/admin/src/hooks/useRolesList/index.js b/packages/plugins/users-permissions/admin/src/hooks/useRolesList/index.js index 10e4d37ad9..aae9175751 100644 --- a/packages/plugins/users-permissions/admin/src/hooks/useRolesList/index.js +++ b/packages/plugins/users-permissions/admin/src/hooks/useRolesList/index.js @@ -1,8 +1,11 @@ import { useCallback, useEffect, useReducer, useRef } from 'react'; + import { useFetchClient, useNotification } from '@strapi/helper-plugin'; import get from 'lodash/get'; -import init from './init'; + import pluginId from '../../pluginId'; + +import init from './init'; import reducer, { initialState } from './reducer'; const useRolesList = (shouldFetchData = true) => { diff --git a/packages/plugins/users-permissions/admin/src/index.js b/packages/plugins/users-permissions/admin/src/index.js index ff6e470b84..ba721ed189 100644 --- a/packages/plugins/users-permissions/admin/src/index.js +++ b/packages/plugins/users-permissions/admin/src/index.js @@ -5,7 +5,9 @@ // Also the strapi-generate-plugins/files/admin/src/index.js needs to be updated // IF THE DOC IS NOT UPDATED THE PULL REQUEST WILL NOT BE MERGED import { prefixPluginTranslations } from '@strapi/helper-plugin'; + import pluginPkg from '../../package.json'; + import pluginPermissions from './permissions'; import pluginId from './pluginId'; import getTrad from './utils/getTrad'; diff --git a/packages/plugins/users-permissions/admin/src/pages/AdvancedSettings/index.js b/packages/plugins/users-permissions/admin/src/pages/AdvancedSettings/index.js index 75c198637f..3f0726f12b 100644 --- a/packages/plugins/users-permissions/admin/src/pages/AdvancedSettings/index.js +++ b/packages/plugins/users-permissions/admin/src/pages/AdvancedSettings/index.js @@ -1,7 +1,19 @@ import React, { useMemo } from 'react'; -import { useQuery, useMutation, useQueryClient } from 'react-query'; -import { useIntl } from 'react-intl'; -import { Formik } from 'formik'; + +import { + Box, + Button, + ContentLayout, + Flex, + Grid, + GridItem, + HeaderLayout, + Main, + Option, + Select, + Typography, + useNotifyAT, +} from '@strapi/design-system'; import { CheckPagePermissions, Form, @@ -13,26 +25,17 @@ import { useOverlayBlocker, useRBAC, } from '@strapi/helper-plugin'; -import { - useNotifyAT, - Main, - HeaderLayout, - ContentLayout, - Button, - Box, - Flex, - Select, - Option, - Typography, - Grid, - GridItem, -} from '@strapi/design-system'; import { Check } from '@strapi/icons'; +import { Formik } from 'formik'; +import { useIntl } from 'react-intl'; +import { useMutation, useQuery, useQueryClient } from 'react-query'; + import pluginPermissions from '../../permissions'; import { getTrad } from '../../utils'; + +import { fetchData, putAdvancedSettings } from './utils/api'; import layout from './utils/layout'; import schema from './utils/schema'; -import { fetchData, putAdvancedSettings } from './utils/api'; const ProtectedAdvancedSettingsPage = () => ( diff --git a/packages/plugins/users-permissions/admin/src/pages/AdvancedSettings/tests/index.test.js b/packages/plugins/users-permissions/admin/src/pages/AdvancedSettings/tests/index.test.js index 66df6ed671..db3cf66616 100644 --- a/packages/plugins/users-permissions/admin/src/pages/AdvancedSettings/tests/index.test.js +++ b/packages/plugins/users-permissions/admin/src/pages/AdvancedSettings/tests/index.test.js @@ -1,10 +1,13 @@ import React from 'react'; -import { render, waitFor, screen } from '@testing-library/react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { useRBAC } from '@strapi/helper-plugin'; +import { render, screen, waitFor } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; import { QueryClient, QueryClientProvider } from 'react-query'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import { useRBAC } from '@strapi/helper-plugin'; + import ProtectedAdvancedSettingsPage from '../index'; + import server from './utils/server'; jest.mock('@strapi/helper-plugin', () => ({ diff --git a/packages/plugins/users-permissions/admin/src/pages/AdvancedSettings/tests/utils/server.js b/packages/plugins/users-permissions/admin/src/pages/AdvancedSettings/tests/utils/server.js index 6a54522be8..644d99cfce 100644 --- a/packages/plugins/users-permissions/admin/src/pages/AdvancedSettings/tests/utils/server.js +++ b/packages/plugins/users-permissions/admin/src/pages/AdvancedSettings/tests/utils/server.js @@ -1,5 +1,5 @@ -import { setupServer } from 'msw/node'; import { rest } from 'msw'; +import { setupServer } from 'msw/node'; const handlers = [ rest.get('*/advanced', (req, res, ctx) => { diff --git a/packages/plugins/users-permissions/admin/src/pages/AdvancedSettings/utils/api.js b/packages/plugins/users-permissions/admin/src/pages/AdvancedSettings/utils/api.js index 8b6f5b4c66..238862ae0a 100644 --- a/packages/plugins/users-permissions/admin/src/pages/AdvancedSettings/utils/api.js +++ b/packages/plugins/users-permissions/admin/src/pages/AdvancedSettings/utils/api.js @@ -1,4 +1,5 @@ import { getFetchClient } from '@strapi/helper-plugin'; + import { getRequestURL } from '../../../utils'; const fetchData = async () => { diff --git a/packages/plugins/users-permissions/admin/src/pages/AdvancedSettings/utils/schema.js b/packages/plugins/users-permissions/admin/src/pages/AdvancedSettings/utils/schema.js index d0cd5af675..b8958a8d64 100644 --- a/packages/plugins/users-permissions/admin/src/pages/AdvancedSettings/utils/schema.js +++ b/packages/plugins/users-permissions/admin/src/pages/AdvancedSettings/utils/schema.js @@ -1,5 +1,5 @@ -import * as yup from 'yup'; import { translatedErrors } from '@strapi/helper-plugin'; +import * as yup from 'yup'; // eslint-disable-next-line prefer-regex-literals const URL_REGEX = new RegExp('(^$)|((.+:\\/\\/.*)(d*)\\/?(.*))'); diff --git a/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/components/EmailForm.js b/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/components/EmailForm.js index b997e762a1..5d981227d1 100644 --- a/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/components/EmailForm.js +++ b/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/components/EmailForm.js @@ -1,19 +1,21 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import { useIntl } from 'react-intl'; -import { Form, GenericInput } from '@strapi/helper-plugin'; -import { Formik } from 'formik'; + import { - ModalLayout, - ModalHeader, - ModalFooter, - ModalBody, + Button, Grid, GridItem, - Button, + ModalBody, + ModalFooter, + ModalHeader, + ModalLayout, Textarea, } from '@strapi/design-system'; import { Breadcrumbs, Crumb } from '@strapi/design-system/v2'; +import { Form, GenericInput } from '@strapi/helper-plugin'; +import { Formik } from 'formik'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; + import { getTrad } from '../../../utils'; import schema from '../utils/schema'; diff --git a/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/components/EmailTable.js b/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/components/EmailTable.js index f50ec41d28..6562324b93 100644 --- a/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/components/EmailTable.js +++ b/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/components/EmailTable.js @@ -1,20 +1,22 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import { useIntl } from 'react-intl'; + import { + Icon, + IconButton, Table, - Thead, Tbody, - Tr, Td, Th, + Thead, + Tr, Typography, - IconButton, - Icon, VisuallyHidden, } from '@strapi/design-system'; -import { Pencil, Refresh, Check } from '@strapi/icons'; import { onRowClick, stopPropagation } from '@strapi/helper-plugin'; +import { Check, Pencil, Refresh } from '@strapi/icons'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; + import { getTrad } from '../../../utils'; const EmailTable = ({ canUpdate, onEditClick }) => { diff --git a/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/index.js b/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/index.js index 0a40840f69..3c3887c7a2 100644 --- a/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/index.js +++ b/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/index.js @@ -1,22 +1,25 @@ import React, { useMemo, useRef, useState } from 'react'; -import { useQuery, useMutation, useQueryClient } from 'react-query'; -import { useIntl } from 'react-intl'; + +import { ContentLayout, HeaderLayout, Main, useNotifyAT } from '@strapi/design-system'; import { + CheckPagePermissions, + LoadingIndicatorPage, SettingsPageTitle, - useTracking, + useFocusWhenNavigate, useNotification, useOverlayBlocker, - CheckPagePermissions, useRBAC, - useFocusWhenNavigate, - LoadingIndicatorPage, + useTracking, } from '@strapi/helper-plugin'; -import { useNotifyAT, Main, ContentLayout, HeaderLayout } from '@strapi/design-system'; +import { useIntl } from 'react-intl'; +import { useMutation, useQuery, useQueryClient } from 'react-query'; + import pluginPermissions from '../../permissions'; import { getTrad } from '../../utils'; -import { fetchData, putEmailTemplate } from './utils/api'; -import EmailTable from './components/EmailTable'; + import EmailForm from './components/EmailForm'; +import EmailTable from './components/EmailTable'; +import { fetchData, putEmailTemplate } from './utils/api'; const ProtectedEmailTemplatesPage = () => ( diff --git a/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/tests/index.test.js b/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/tests/index.test.js index dd70cf0b46..4568143899 100644 --- a/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/tests/index.test.js +++ b/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/tests/index.test.js @@ -1,10 +1,13 @@ import React from 'react'; -import { render, waitFor, screen } from '@testing-library/react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { useRBAC } from '@strapi/helper-plugin'; +import { render, screen, waitFor } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; import { QueryClient, QueryClientProvider } from 'react-query'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import { useRBAC } from '@strapi/helper-plugin'; + import ProtectedEmailTemplatesPage from '../index'; + import server from './utils/server'; jest.mock('@strapi/helper-plugin', () => ({ diff --git a/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/tests/utils/server.js b/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/tests/utils/server.js index 1fb4317427..e01d131332 100644 --- a/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/tests/utils/server.js +++ b/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/tests/utils/server.js @@ -1,5 +1,5 @@ -import { setupServer } from 'msw/node'; import { rest } from 'msw'; +import { setupServer } from 'msw/node'; const handlers = [ rest.get('*/email-templates', (req, res, ctx) => { diff --git a/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/utils/api.js b/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/utils/api.js index 0afc1b75bf..46aef9f191 100644 --- a/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/utils/api.js +++ b/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/utils/api.js @@ -1,4 +1,5 @@ import { getFetchClient } from '@strapi/helper-plugin'; + import { getRequestURL } from '../../../utils'; const fetchData = async () => { diff --git a/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/utils/schema.js b/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/utils/schema.js index e89c230616..33ca1216f4 100644 --- a/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/utils/schema.js +++ b/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/utils/schema.js @@ -1,5 +1,5 @@ -import * as yup from 'yup'; import { translatedErrors } from '@strapi/helper-plugin'; +import * as yup from 'yup'; const schema = yup.object().shape({ options: yup diff --git a/packages/plugins/users-permissions/admin/src/pages/Providers/index.js b/packages/plugins/users-permissions/admin/src/pages/Providers/index.js index 7772354d64..c492f2dd2f 100644 --- a/packages/plugins/users-permissions/admin/src/pages/Providers/index.js +++ b/packages/plugins/users-permissions/admin/src/pages/Providers/index.js @@ -1,43 +1,46 @@ import React, { useMemo, useRef, useState } from 'react'; -import { useIntl } from 'react-intl'; + import { - SettingsPageTitle, - LoadingIndicatorPage, - useTracking, - useNotification, - useOverlayBlocker, - CheckPagePermissions, - useRBAC, - useFocusWhenNavigate, - onRowClick, - stopPropagation, -} from '@strapi/helper-plugin'; -import has from 'lodash/has'; -import upperFirst from 'lodash/upperFirst'; -import { - HeaderLayout, - Layout, ContentLayout, + HeaderLayout, + IconButton, + Layout, Main, - useNotifyAT, Table, - Thead, - Tr, - Th, Tbody, Td, + Th, + Thead, + Tr, Typography, - IconButton, + useNotifyAT, VisuallyHidden, } from '@strapi/design-system'; +import { + CheckPagePermissions, + LoadingIndicatorPage, + onRowClick, + SettingsPageTitle, + stopPropagation, + useFocusWhenNavigate, + useNotification, + useOverlayBlocker, + useRBAC, + useTracking, +} from '@strapi/helper-plugin'; import { Pencil } from '@strapi/icons'; -import { useQuery, useMutation, useQueryClient } from 'react-query'; -import forms from './utils/forms'; +import has from 'lodash/has'; +import upperFirst from 'lodash/upperFirst'; +import { useIntl } from 'react-intl'; +import { useMutation, useQuery, useQueryClient } from 'react-query'; + +import FormModal from '../../components/FormModal'; +import pluginPermissions from '../../permissions'; +import { getTrad } from '../../utils'; + import { fetchData, putProvider } from './utils/api'; import createProvidersArray from './utils/createProvidersArray'; -import { getTrad } from '../../utils'; -import pluginPermissions from '../../permissions'; -import FormModal from '../../components/FormModal'; +import forms from './utils/forms'; export const ProvidersPage = () => { const { formatMessage } = useIntl(); diff --git a/packages/plugins/users-permissions/admin/src/pages/Providers/tests/index.test.js b/packages/plugins/users-permissions/admin/src/pages/Providers/tests/index.test.js index 5423e29b9b..549b297511 100644 --- a/packages/plugins/users-permissions/admin/src/pages/Providers/tests/index.test.js +++ b/packages/plugins/users-permissions/admin/src/pages/Providers/tests/index.test.js @@ -1,12 +1,15 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { useRBAC } from '@strapi/helper-plugin'; import { render, screen, waitFor } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; import { QueryClient, QueryClientProvider } from 'react-query'; -import { useRBAC } from '@strapi/helper-plugin'; -import server from './server'; + import { ProvidersPage } from '../index'; +import server from './server'; + jest.mock('@strapi/helper-plugin', () => ({ ...jest.requireActual('@strapi/helper-plugin'), useNotification: jest.fn(), diff --git a/packages/plugins/users-permissions/admin/src/pages/Providers/tests/server.js b/packages/plugins/users-permissions/admin/src/pages/Providers/tests/server.js index 8cd9ec1f18..16125084e6 100644 --- a/packages/plugins/users-permissions/admin/src/pages/Providers/tests/server.js +++ b/packages/plugins/users-permissions/admin/src/pages/Providers/tests/server.js @@ -1,5 +1,5 @@ -import { setupServer } from 'msw/node'; import { rest } from 'msw'; +import { setupServer } from 'msw/node'; const handlers = [ rest.get('*/providers', (req, res, ctx) => { diff --git a/packages/plugins/users-permissions/admin/src/pages/Providers/utils/api.js b/packages/plugins/users-permissions/admin/src/pages/Providers/utils/api.js index a66b302673..0401426a02 100644 --- a/packages/plugins/users-permissions/admin/src/pages/Providers/utils/api.js +++ b/packages/plugins/users-permissions/admin/src/pages/Providers/utils/api.js @@ -1,4 +1,5 @@ import { getFetchClient } from '@strapi/helper-plugin'; + import { getRequestURL } from '../../../utils'; // eslint-disable-next-line import/prefer-default-export diff --git a/packages/plugins/users-permissions/admin/src/pages/Providers/utils/forms.js b/packages/plugins/users-permissions/admin/src/pages/Providers/utils/forms.js index 71fe4c5f18..08d285982c 100644 --- a/packages/plugins/users-permissions/admin/src/pages/Providers/utils/forms.js +++ b/packages/plugins/users-permissions/admin/src/pages/Providers/utils/forms.js @@ -1,5 +1,5 @@ -import * as yup from 'yup'; import { translatedErrors } from '@strapi/helper-plugin'; +import * as yup from 'yup'; import { getTrad } from '../../../utils'; diff --git a/packages/plugins/users-permissions/admin/src/pages/Roles/CreatePage/index.js b/packages/plugins/users-permissions/admin/src/pages/Roles/CreatePage/index.js index 4ae121d8f9..9744ec4630 100644 --- a/packages/plugins/users-permissions/admin/src/pages/Roles/CreatePage/index.js +++ b/packages/plugins/users-permissions/admin/src/pages/Roles/CreatePage/index.js @@ -1,33 +1,36 @@ -import React, { useState, useRef } from 'react'; -import { useHistory } from 'react-router-dom'; +import React, { useRef, useState } from 'react'; + import { + Box, + Button, ContentLayout, + Flex, + Grid, + GridItem, HeaderLayout, Main, - Button, - Flex, - Box, - TextInput, Textarea, + TextInput, Typography, - GridItem, - Grid, } from '@strapi/design-system'; +import { + Form, + SettingsPageTitle, + useFetchClient, + useNotification, + useOverlayBlocker, + useTracking, +} from '@strapi/helper-plugin'; import { Check } from '@strapi/icons'; import { Formik } from 'formik'; import { useIntl } from 'react-intl'; -import { - useOverlayBlocker, - SettingsPageTitle, - useFetchClient, - useTracking, - Form, - useNotification, -} from '@strapi/helper-plugin'; +import { useHistory } from 'react-router-dom'; + import UsersPermissions from '../../../components/UsersPermissions'; -import getTrad from '../../../utils/getTrad'; -import pluginId from '../../../pluginId'; import { usePlugins } from '../../../hooks'; +import pluginId from '../../../pluginId'; +import getTrad from '../../../utils/getTrad'; + import schema from './utils/schema'; const EditPage = () => { diff --git a/packages/plugins/users-permissions/admin/src/pages/Roles/CreatePage/tests/index.test.js b/packages/plugins/users-permissions/admin/src/pages/Roles/CreatePage/tests/index.test.js index f253f53930..b50e69d1ef 100644 --- a/packages/plugins/users-permissions/admin/src/pages/Roles/CreatePage/tests/index.test.js +++ b/packages/plugins/users-permissions/admin/src/pages/Roles/CreatePage/tests/index.test.js @@ -1,11 +1,14 @@ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; import { act, render, waitFor } from '@testing-library/react'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import { Router, Switch, Route } from 'react-router-dom'; -import { IntlProvider } from 'react-intl'; import { createMemoryHistory } from 'history'; -import pluginId from '../../../../pluginId'; +import { IntlProvider } from 'react-intl'; +import { Route, Router, Switch } from 'react-router-dom'; + import RolesCreatePage from '..'; +import pluginId from '../../../../pluginId'; + import server from './server'; jest.mock('@strapi/helper-plugin', () => { diff --git a/packages/plugins/users-permissions/admin/src/pages/Roles/CreatePage/tests/server.js b/packages/plugins/users-permissions/admin/src/pages/Roles/CreatePage/tests/server.js index dcf4ae0da8..578564c45d 100644 --- a/packages/plugins/users-permissions/admin/src/pages/Roles/CreatePage/tests/server.js +++ b/packages/plugins/users-permissions/admin/src/pages/Roles/CreatePage/tests/server.js @@ -1,5 +1,6 @@ -import { setupServer } from 'msw/node'; import { rest } from 'msw'; +import { setupServer } from 'msw/node'; + import pluginId from '../../../../pluginId'; const handlers = [ diff --git a/packages/plugins/users-permissions/admin/src/pages/Roles/CreatePage/utils/schema.js b/packages/plugins/users-permissions/admin/src/pages/Roles/CreatePage/utils/schema.js index 5e2ac5c5af..c3bcd9cf28 100644 --- a/packages/plugins/users-permissions/admin/src/pages/Roles/CreatePage/utils/schema.js +++ b/packages/plugins/users-permissions/admin/src/pages/Roles/CreatePage/utils/schema.js @@ -1,5 +1,5 @@ -import * as yup from 'yup'; import { translatedErrors } from '@strapi/helper-plugin'; +import * as yup from 'yup'; const schema = yup.object().shape({ name: yup.string().required(translatedErrors.required), diff --git a/packages/plugins/users-permissions/admin/src/pages/Roles/EditPage/index.js b/packages/plugins/users-permissions/admin/src/pages/Roles/EditPage/index.js index f7d057a68a..07824f934c 100644 --- a/packages/plugins/users-permissions/admin/src/pages/Roles/EditPage/index.js +++ b/packages/plugins/users-permissions/admin/src/pages/Roles/EditPage/index.js @@ -1,34 +1,37 @@ -import React, { useState, useRef } from 'react'; +import React, { useRef, useState } from 'react'; + +import { + Box, + Button, + ContentLayout, + Flex, + Grid, + GridItem, + HeaderLayout, + Main, + Textarea, + TextInput, + Typography, +} from '@strapi/design-system'; +import { + Form, + Link, + LoadingIndicatorPage, + SettingsPageTitle, + useFetchClient, + useNotification, + useOverlayBlocker, +} from '@strapi/helper-plugin'; +import { ArrowLeft, Check } from '@strapi/icons'; import { Formik } from 'formik'; import { useIntl } from 'react-intl'; import { useRouteMatch } from 'react-router-dom'; -import { - useFetchClient, - useOverlayBlocker, - SettingsPageTitle, - LoadingIndicatorPage, - Form, - useNotification, - Link, -} from '@strapi/helper-plugin'; -import { - ContentLayout, - HeaderLayout, - Main, - Button, - Flex, - Box, - TextInput, - Textarea, - Typography, - GridItem, - Grid, -} from '@strapi/design-system'; -import { ArrowLeft, Check } from '@strapi/icons'; + import UsersPermissions from '../../../components/UsersPermissions'; -import getTrad from '../../../utils/getTrad'; +import { useFetchRole, usePlugins } from '../../../hooks'; import pluginId from '../../../pluginId'; -import { usePlugins, useFetchRole } from '../../../hooks'; +import getTrad from '../../../utils/getTrad'; + import schema from './utils/schema'; const EditPage = () => { diff --git a/packages/plugins/users-permissions/admin/src/pages/Roles/EditPage/tests/index.test.js b/packages/plugins/users-permissions/admin/src/pages/Roles/EditPage/tests/index.test.js index daab77b600..a6e774640f 100644 --- a/packages/plugins/users-permissions/admin/src/pages/Roles/EditPage/tests/index.test.js +++ b/packages/plugins/users-permissions/admin/src/pages/Roles/EditPage/tests/index.test.js @@ -1,12 +1,15 @@ import React from 'react'; -import { render, waitFor, act, waitForElementToBeRemoved } from '@testing-library/react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { act, render, waitFor, waitForElementToBeRemoved } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import { Router, Switch, Route } from 'react-router-dom'; -import { IntlProvider } from 'react-intl'; import { createMemoryHistory } from 'history'; -import pluginId from '../../../../pluginId'; +import { IntlProvider } from 'react-intl'; +import { Route, Router, Switch } from 'react-router-dom'; + import RolesEditPage from '..'; +import pluginId from '../../../../pluginId'; + import server from './server'; jest.mock('@strapi/helper-plugin', () => { diff --git a/packages/plugins/users-permissions/admin/src/pages/Roles/EditPage/tests/server.js b/packages/plugins/users-permissions/admin/src/pages/Roles/EditPage/tests/server.js index 549ca69ae7..917c012e35 100644 --- a/packages/plugins/users-permissions/admin/src/pages/Roles/EditPage/tests/server.js +++ b/packages/plugins/users-permissions/admin/src/pages/Roles/EditPage/tests/server.js @@ -1,5 +1,6 @@ -import { setupServer } from 'msw/node'; import { rest } from 'msw'; +import { setupServer } from 'msw/node'; + import pluginId from '../../../../pluginId'; const handlers = [ diff --git a/packages/plugins/users-permissions/admin/src/pages/Roles/EditPage/utils/schema.js b/packages/plugins/users-permissions/admin/src/pages/Roles/EditPage/utils/schema.js index 5e2ac5c5af..c3bcd9cf28 100644 --- a/packages/plugins/users-permissions/admin/src/pages/Roles/EditPage/utils/schema.js +++ b/packages/plugins/users-permissions/admin/src/pages/Roles/EditPage/utils/schema.js @@ -1,5 +1,5 @@ -import * as yup from 'yup'; import { translatedErrors } from '@strapi/helper-plugin'; +import * as yup from 'yup'; const schema = yup.object().shape({ name: yup.string().required(translatedErrors.required), diff --git a/packages/plugins/users-permissions/admin/src/pages/Roles/ListPage/components/TableBody.js b/packages/plugins/users-permissions/admin/src/pages/Roles/ListPage/components/TableBody.js index 680d18f9f1..a27b8923e7 100644 --- a/packages/plugins/users-permissions/admin/src/pages/Roles/ListPage/components/TableBody.js +++ b/packages/plugins/users-permissions/admin/src/pages/Roles/ListPage/components/TableBody.js @@ -1,8 +1,9 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import { IconButton, Typography, Flex, Tbody, Tr, Td } from '@strapi/design-system'; -import { Pencil, Trash } from '@strapi/icons'; + +import { Flex, IconButton, Tbody, Td, Tr, Typography } from '@strapi/design-system'; import { CheckPermissions, onRowClick, stopPropagation } from '@strapi/helper-plugin'; +import { Pencil, Trash } from '@strapi/icons'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; import { useHistory } from 'react-router-dom'; diff --git a/packages/plugins/users-permissions/admin/src/pages/Roles/ListPage/index.js b/packages/plugins/users-permissions/admin/src/pages/Roles/ListPage/index.js index ac607e9697..2326f2b5ca 100644 --- a/packages/plugins/users-permissions/admin/src/pages/Roles/ListPage/index.js +++ b/packages/plugins/users-permissions/admin/src/pages/Roles/ListPage/index.js @@ -1,45 +1,47 @@ import React, { useMemo, useState } from 'react'; + import { + ActionLayout, Button, + ContentLayout, HeaderLayout, Layout, - ContentLayout, - ActionLayout, Main, Table, - Tr, - Thead, Th, + Thead, + Tr, Typography, useNotifyAT, VisuallyHidden, } from '@strapi/design-system'; -import { Plus } from '@strapi/icons'; import { - useTracking, - SettingsPageTitle, CheckPermissions, - useNotification, - useRBAC, - NoPermissions, - LoadingIndicatorPage, - SearchURLQuery, - useFocusWhenNavigate, - useQueryParams, - EmptyStateLayout, ConfirmDialog, - useFilter, + EmptyStateLayout, + LoadingIndicatorPage, + NoPermissions, + SearchURLQuery, + SettingsPageTitle, useCollator, + useFilter, + useFocusWhenNavigate, + useNotification, + useQueryParams, + useRBAC, + useTracking, } from '@strapi/helper-plugin'; +import { Plus } from '@strapi/icons'; import { useIntl } from 'react-intl'; -import { useHistory } from 'react-router-dom'; import { useMutation, useQuery, useQueryClient } from 'react-query'; +import { useHistory } from 'react-router-dom'; -import { fetchData, deleteData } from './utils/api'; -import { getTrad } from '../../../utils'; -import pluginId from '../../../pluginId'; import permissions from '../../../permissions'; +import pluginId from '../../../pluginId'; +import { getTrad } from '../../../utils'; + import TableBody from './components/TableBody'; +import { deleteData, fetchData } from './utils/api'; const RoleListPage = () => { const { trackUsage } = useTracking(); diff --git a/packages/plugins/users-permissions/admin/src/pages/Roles/ListPage/tests/index.test.js b/packages/plugins/users-permissions/admin/src/pages/Roles/ListPage/tests/index.test.js index edcda42a5c..b7904d9ad5 100644 --- a/packages/plugins/users-permissions/admin/src/pages/Roles/ListPage/tests/index.test.js +++ b/packages/plugins/users-permissions/admin/src/pages/Roles/ListPage/tests/index.test.js @@ -1,15 +1,17 @@ /* eslint-disable react/jsx-no-constructed-context-values */ import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { TrackingProvider, useRBAC } from '@strapi/helper-plugin'; import { render, screen, waitFor } from '@testing-library/react'; +import { createMemoryHistory } from 'history'; import { IntlProvider } from 'react-intl'; import { QueryClient, QueryClientProvider } from 'react-query'; -import { ThemeProvider, lightTheme } from '@strapi/design-system'; -import { TrackingProvider, useRBAC } from '@strapi/helper-plugin'; import { Router } from 'react-router-dom'; -import { createMemoryHistory } from 'history'; import RoleListPage from '../index'; + import server from './server'; jest.mock('@strapi/helper-plugin', () => ({ diff --git a/packages/plugins/users-permissions/admin/src/pages/Roles/ListPage/tests/server.js b/packages/plugins/users-permissions/admin/src/pages/Roles/ListPage/tests/server.js index 4fc68e8050..dde6e1ef0a 100644 --- a/packages/plugins/users-permissions/admin/src/pages/Roles/ListPage/tests/server.js +++ b/packages/plugins/users-permissions/admin/src/pages/Roles/ListPage/tests/server.js @@ -1,5 +1,5 @@ -import { setupServer } from 'msw/node'; import { rest } from 'msw'; +import { setupServer } from 'msw/node'; const handlers = [ rest.get('*/roles', (req, res, ctx) => { diff --git a/packages/plugins/users-permissions/admin/src/pages/Roles/ListPage/utils/api.js b/packages/plugins/users-permissions/admin/src/pages/Roles/ListPage/utils/api.js index e66552f599..9c4d2f22ca 100644 --- a/packages/plugins/users-permissions/admin/src/pages/Roles/ListPage/utils/api.js +++ b/packages/plugins/users-permissions/admin/src/pages/Roles/ListPage/utils/api.js @@ -1,4 +1,5 @@ import { getFetchClient } from '@strapi/helper-plugin'; + import { getRequestURL } from '../../../../utils'; export const fetchData = async (toggleNotification, notifyStatus) => { diff --git a/packages/plugins/users-permissions/admin/src/pages/Roles/ProtectedCreatePage/index.js b/packages/plugins/users-permissions/admin/src/pages/Roles/ProtectedCreatePage/index.js index b1f8ebf5ea..2ed1c26346 100644 --- a/packages/plugins/users-permissions/admin/src/pages/Roles/ProtectedCreatePage/index.js +++ b/packages/plugins/users-permissions/admin/src/pages/Roles/ProtectedCreatePage/index.js @@ -1,5 +1,7 @@ import React from 'react'; + import { CheckPagePermissions } from '@strapi/helper-plugin'; + import pluginPermissions from '../../../permissions'; import RolesCreatePage from '../CreatePage'; diff --git a/packages/plugins/users-permissions/admin/src/pages/Roles/ProtectedEditPage/index.js b/packages/plugins/users-permissions/admin/src/pages/Roles/ProtectedEditPage/index.js index 728ede03b5..01d37685aa 100644 --- a/packages/plugins/users-permissions/admin/src/pages/Roles/ProtectedEditPage/index.js +++ b/packages/plugins/users-permissions/admin/src/pages/Roles/ProtectedEditPage/index.js @@ -1,5 +1,7 @@ import React from 'react'; + import { CheckPagePermissions } from '@strapi/helper-plugin'; + import pluginPermissions from '../../../permissions'; import RolesEditPage from '../EditPage'; diff --git a/packages/plugins/users-permissions/admin/src/pages/Roles/ProtectedListPage/index.js b/packages/plugins/users-permissions/admin/src/pages/Roles/ProtectedListPage/index.js index d9f2415bf1..6476f6f5a5 100644 --- a/packages/plugins/users-permissions/admin/src/pages/Roles/ProtectedListPage/index.js +++ b/packages/plugins/users-permissions/admin/src/pages/Roles/ProtectedListPage/index.js @@ -1,7 +1,8 @@ import React from 'react'; -import { CheckPagePermissions } from '@strapi/helper-plugin'; -import pluginPermissions from '../../../permissions'; +import { CheckPagePermissions } from '@strapi/helper-plugin'; + +import pluginPermissions from '../../../permissions'; import RolesListPage from '../ListPage'; const ProtectedRolesListPage = () => { diff --git a/packages/plugins/users-permissions/admin/src/pages/Roles/index.js b/packages/plugins/users-permissions/admin/src/pages/Roles/index.js index 371f14b301..d23637bff9 100644 --- a/packages/plugins/users-permissions/admin/src/pages/Roles/index.js +++ b/packages/plugins/users-permissions/admin/src/pages/Roles/index.js @@ -1,11 +1,14 @@ import React from 'react'; -import { Switch, Route } from 'react-router-dom'; -import { CheckPagePermissions, AnErrorOccurred } from '@strapi/helper-plugin'; -import pluginId from '../../pluginId'; + +import { AnErrorOccurred, CheckPagePermissions } from '@strapi/helper-plugin'; +import { Route, Switch } from 'react-router-dom'; + import pluginPermissions from '../../permissions'; -import ProtectedRolesListPage from './ProtectedListPage'; -import ProtectedRolesEditPage from './ProtectedEditPage'; +import pluginId from '../../pluginId'; + import ProtectedRolesCreatePage from './ProtectedCreatePage'; +import ProtectedRolesEditPage from './ProtectedEditPage'; +import ProtectedRolesListPage from './ProtectedListPage'; const Roles = () => { return ( diff --git a/packages/plugins/users-permissions/admin/src/utils/index.js b/packages/plugins/users-permissions/admin/src/utils/index.js index d32b9cf74d..61137b9ca6 100644 --- a/packages/plugins/users-permissions/admin/src/utils/index.js +++ b/packages/plugins/users-permissions/admin/src/utils/index.js @@ -1,4 +1,4 @@ export { default as cleanPermissions } from './cleanPermissions'; +export { default as formatPolicies } from './formatPolicies'; export { default as getRequestURL } from './getRequestURL'; export { default as getTrad } from './getTrad'; -export { default as formatPolicies } from './formatPolicies'; From 96948e0d1e15621971fc8f56b39164551c1e906c Mon Sep 17 00:00:00 2001 From: Gustav Hansen Date: Mon, 12 Jun 2023 22:10:54 +0200 Subject: [PATCH 151/172] Chore: Update snapshot tests --- .../components/Login/tests/BaseLogin.test.js | 8 +- .../components/Oops/tests/index.test.js | 8 +- .../ResetPassword/tests/index.test.js | 8 +- .../tests/__snapshots__/index.test.js.snap | 8 +- .../tests/__snapshots__/index.test.js.snap | 194 +++++++++--------- .../__snapshots__/AssetGridList.test.js.snap | 16 +- .../PendingAssetStep.test.js.snap | 16 +- 7 files changed, 129 insertions(+), 129 deletions(-) diff --git a/packages/core/admin/admin/src/pages/AuthPage/components/Login/tests/BaseLogin.test.js b/packages/core/admin/admin/src/pages/AuthPage/components/Login/tests/BaseLogin.test.js index 404d1aacfb..281b586e7a 100644 --- a/packages/core/admin/admin/src/pages/AuthPage/components/Login/tests/BaseLogin.test.js +++ b/packages/core/admin/admin/src/pages/AuthPage/components/Login/tests/BaseLogin.test.js @@ -626,6 +626,10 @@ describe('ADMIN | PAGES | AUTH | BaseLogin', () => { border: 2px solid #4945ff; } + .c5 { + height: 4.5rem; + } + .c2 { margin: 0 auto; width: 552px; @@ -637,10 +641,6 @@ describe('ADMIN | PAGES | AUTH | BaseLogin', () => { flex-direction: column; } - .c5 { - height: 4.5rem; - } - .c26 svg { height: 1rem; width: 1rem; diff --git a/packages/core/admin/admin/src/pages/AuthPage/components/Oops/tests/index.test.js b/packages/core/admin/admin/src/pages/AuthPage/components/Oops/tests/index.test.js index f5f4c3912d..5a74776069 100644 --- a/packages/core/admin/admin/src/pages/AuthPage/components/Oops/tests/index.test.js +++ b/packages/core/admin/admin/src/pages/AuthPage/components/Oops/tests/index.test.js @@ -351,6 +351,10 @@ describe('ADMIN | PAGES | AUTH | Oops', () => { border: 2px solid #4945ff; } + .c15 { + height: 4.5rem; + } + .c13 { margin: 0 auto; width: 552px; @@ -362,10 +366,6 @@ describe('ADMIN | PAGES | AUTH | Oops', () => { flex-direction: column; } - .c15 { - height: 4.5rem; - } -

{ border: 2px solid #4945ff; } + .c15 { + height: 4.5rem; + } + .c13 { margin: 0 auto; width: 552px; @@ -599,10 +603,6 @@ describe('ADMIN | PAGES | AUTH | ResetPassword', () => { flex-direction: column; } - .c15 { - height: 4.5rem; - } - .c32 svg { height: 1rem; width: 1rem; diff --git a/packages/core/admin/admin/src/pages/MarketplacePage/tests/__snapshots__/index.test.js.snap b/packages/core/admin/admin/src/pages/MarketplacePage/tests/__snapshots__/index.test.js.snap index dcbae9aac9..75e2cdfb09 100644 --- a/packages/core/admin/admin/src/pages/MarketplacePage/tests/__snapshots__/index.test.js.snap +++ b/packages/core/admin/admin/src/pages/MarketplacePage/tests/__snapshots__/index.test.js.snap @@ -1135,6 +1135,10 @@ exports[`Marketplace page - layout renders the online layout 1`] = ` word-break: break-all; } +.c54 { + height: 2rem; +} + .c70 { width: 0.75rem; -webkit-transform: rotate(90deg); @@ -1169,10 +1173,6 @@ exports[`Marketplace page - layout renders the online layout 1`] = ` width: 1px; } -.c54 { - height: 2rem; -} - @media (max-width:68.75rem) { .c57 { grid-column: span 6; diff --git a/packages/core/content-type-builder/admin/src/pages/ListView/tests/__snapshots__/index.test.js.snap b/packages/core/content-type-builder/admin/src/pages/ListView/tests/__snapshots__/index.test.js.snap index 36b1ebe4d3..3dcfad604a 100644 --- a/packages/core/content-type-builder/admin/src/pages/ListView/tests/__snapshots__/index.test.js.snap +++ b/packages/core/content-type-builder/admin/src/pages/ListView/tests/__snapshots__/index.test.js.snap @@ -734,64 +734,6 @@ exports[` renders and matches the snapshot 1`] = ` border: 2px solid #4945ff; } -.c64 { - position: absolute; - display: none; - top: 5px; - right: 0.5rem; -} - -.c64 svg { - width: 0.625rem; - height: 0.625rem; -} - -.c64 svg path { - fill: #4945ff; -} - -.c57 { - width: 8.75rem; - height: 5rem; - position: relative; - border: 1px solid #dcdce4; - background: #f6f6f9; - border-radius: 4px; - max-width: 100%; -} - -.c57.active, -.c57:focus, -.c57:hover { - border: 1px solid #d9d8ff; - background: #f0f0ff; -} - -.c57.active .c63, -.c57:focus .c63, -.c57:hover .c63 { - display: block; -} - -.c57.active .c7, -.c57:focus .c7, -.c57:hover .c7 { - color: #4945ff; -} - -.c57.active > div:first-child, -.c57:focus > div:first-child, -.c57:hover > div:first-child { - background: #d9d8ff; - color: #4945ff; -} - -.c57.active > div:first-child svg path, -.c57:focus > div:first-child svg path, -.c57:hover > div:first-child svg path { - fill: #4945ff; -} - .c37.component-row, .c37.dynamiczone-row { position: relative; @@ -858,6 +800,64 @@ exports[` renders and matches the snapshot 1`] = ` padding: 0; } +.c64 { + position: absolute; + display: none; + top: 5px; + right: 0.5rem; +} + +.c64 svg { + width: 0.625rem; + height: 0.625rem; +} + +.c64 svg path { + fill: #4945ff; +} + +.c57 { + width: 8.75rem; + height: 5rem; + position: relative; + border: 1px solid #dcdce4; + background: #f6f6f9; + border-radius: 4px; + max-width: 100%; +} + +.c57.active, +.c57:focus, +.c57:hover { + border: 1px solid #d9d8ff; + background: #f0f0ff; +} + +.c57.active .c63, +.c57:focus .c63, +.c57:hover .c63 { + display: block; +} + +.c57.active .c7, +.c57:focus .c7, +.c57:hover .c7 { + color: #4945ff; +} + +.c57.active > div:first-child, +.c57:focus > div:first-child, +.c57:hover > div:first-child { + background: #d9d8ff; + color: #4945ff; +} + +.c57.active > div:first-child svg path, +.c57:focus > div:first-child svg path, +.c57:hover > div:first-child svg path { + fill: #4945ff; +} + .c53 { width: 2rem; height: 2rem; @@ -903,41 +903,6 @@ exports[` renders and matches the snapshot 1`] = ` align-items: center; } -.c22 table { - width: 100%; - white-space: nowrap; -} - -.c22 thead { - border-bottom: 1px solid #eaeaef; -} - -.c22 thead tr { - border-top: 0; -} - -.c22 tr { - border-top: 1px solid #eaeaef; -} - -.c22 tr td, -.c22 tr th { - padding: 16px; -} - -.c22 tr td:first-of-type, -.c22 tr th:first-of-type { - padding: 0 4px; -} - -.c22 th, -.c22 td { - vertical-align: middle; - text-align: left; - color: #666687; - outline-offset: -4px; -} - .c44 { height: 1.5rem; width: 1.5rem; @@ -1001,6 +966,41 @@ exports[` renders and matches the snapshot 1`] = ` left: -0.25rem; } +.c22 table { + width: 100%; + white-space: nowrap; +} + +.c22 thead { + border-bottom: 1px solid #eaeaef; +} + +.c22 thead tr { + border-top: 0; +} + +.c22 tr { + border-top: 1px solid #eaeaef; +} + +.c22 tr td, +.c22 tr th { + padding: 16px; +} + +.c22 tr td:first-of-type, +.c22 tr th:first-of-type { + padding: 0 4px; +} + +.c22 th, +.c22 td { + vertical-align: middle; + text-align: left; + color: #666687; + outline-offset: -4px; +} + .c39 { position: absolute; left: -1.125rem; @@ -1042,15 +1042,15 @@ exports[` renders and matches the snapshot 1`] = ` fill: #d9d8ff; } -.c25 { - position: relative; -} - .c29 svg { height: 100%; width: 100%; } +.c25 { + position: relative; +} +
Date: Tue, 13 Jun 2023 06:28:00 +0200 Subject: [PATCH 152/172] Docs: Add contributor docs for the userEnterprise hook --- .../01-core/admin/04-hooks/use-enterprise.mdx | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 docs/docs/docs/01-core/admin/04-hooks/use-enterprise.mdx diff --git a/docs/docs/docs/01-core/admin/04-hooks/use-enterprise.mdx b/docs/docs/docs/01-core/admin/04-hooks/use-enterprise.mdx new file mode 100644 index 0000000000..a8e0c49977 --- /dev/null +++ b/docs/docs/docs/01-core/admin/04-hooks/use-enterprise.mdx @@ -0,0 +1,56 @@ +--- +title: useEnterprise +description: API reference for the useEnterprise hook +tags: + - admin + - hooks + - users +--- + +A hook that returns either community or enterprise-edition data-structures based on the global `window.strapi.isEE` flag. + +## Usage + +``` +import { CE_DATA } from './data'; + +function Component() { + const data = useEnterprise(CE_DATA, async () => (await import('./ee/data')).default); +} +``` + +It accepts an optional third argument to pass in options customizing the hook behavior: + +### `combine()` + +THe `combine` callback can be used as a custom "merge" function for the ce and ee arguments: + +``` +const data = useEnterprise({ a: 1 }, () => { b: 1 }, { combine(ce, ee) { return { ...ce, ...ee } } }); + +console.log(data); // { a: 1, b: 1 } +``` + +### `defaultValue` + +By default the hook returns `null` if `window.strapi.isEE` is true and the enterprise data structure is not yet loaded. Customizing +this value can help implementing various loading scenarios: + +``` +// display a loading state while an EE component is loading +const Component = useEnterprise(() =>

CE

, () =>

EE

, { + defaultValue: () =>
loading ...
+}) + +// display nothing while an EE component is loading, but don't block the overall rendering +const Component = useEnterprise(() =>

CE

, () =>

EE

, { + defaultValue: () => null +}) + +// display nothing while an EE component is loading +const Component = useEnterprise(() =>

CE

, () =>

EE

) + +if (!Component) { + return; +} +``` From 02915b3cf0133d01c45b9ab6d185e4e15f709d3d Mon Sep 17 00:00:00 2001 From: Gustav Hansen Date: Tue, 13 Jun 2023 07:16:45 +0200 Subject: [PATCH 153/172] Enhancement: Replace ee_else_ce imports with useEnterprise in auth --- .../AuthPage/{utils/forms.js => constants.js} | 14 +++++------- .../admin/admin/src/pages/AuthPage/index.js | 22 ++++++++++++++----- .../admin/src/pages/AuthPage/utils/index.js | 2 -- .../ee/admin/pages/AuthPage/constants.js | 12 ++++++++++ .../ee/admin/pages/AuthPage/utils/forms.js | 16 -------------- 5 files changed, 35 insertions(+), 31 deletions(-) rename packages/core/admin/admin/src/pages/AuthPage/{utils/forms.js => constants.js} (92%) delete mode 100644 packages/core/admin/admin/src/pages/AuthPage/utils/index.js create mode 100644 packages/core/admin/ee/admin/pages/AuthPage/constants.js delete mode 100644 packages/core/admin/ee/admin/pages/AuthPage/utils/forms.js diff --git a/packages/core/admin/admin/src/pages/AuthPage/utils/forms.js b/packages/core/admin/admin/src/pages/AuthPage/constants.js similarity index 92% rename from packages/core/admin/admin/src/pages/AuthPage/utils/forms.js rename to packages/core/admin/admin/src/pages/AuthPage/constants.js index ec4239ee34..f8aa8fd338 100644 --- a/packages/core/admin/admin/src/pages/AuthPage/utils/forms.js +++ b/packages/core/admin/admin/src/pages/AuthPage/constants.js @@ -1,13 +1,13 @@ import * as yup from 'yup'; import { translatedErrors } from '@strapi/helper-plugin'; import Login from 'ee_else_ce/pages/AuthPage/components/Login'; -import ForgotPassword from '../components/ForgotPassword'; -import ForgotPasswordSuccess from '../components/ForgotPasswordSuccess'; -import Oops from '../components/Oops'; -import Register from '../components/Register'; -import ResetPassword from '../components/ResetPassword'; +import ForgotPassword from './components/ForgotPassword'; +import ForgotPasswordSuccess from './components/ForgotPasswordSuccess'; +import Oops from './components/Oops'; +import Register from './components/Register'; +import ResetPassword from './components/ResetPassword'; -const forms = { +export const FORMS = { 'forgot-password': { Component: ForgotPassword, endPoint: 'forgot-password', @@ -118,5 +118,3 @@ const forms = { }), }, }; - -export default forms; diff --git a/packages/core/admin/admin/src/pages/AuthPage/index.js b/packages/core/admin/admin/src/pages/AuthPage/index.js index 361e114e5c..0f06178ed3 100644 --- a/packages/core/admin/admin/src/pages/AuthPage/index.js +++ b/packages/core/admin/admin/src/pages/AuthPage/index.js @@ -6,12 +6,13 @@ import omit from 'lodash/omit'; import { Redirect, useRouteMatch, useHistory } from 'react-router-dom'; import { auth, useQuery, useGuidedTour, useTracking, useFetchClient } from '@strapi/helper-plugin'; import PropTypes from 'prop-types'; -import forms from 'ee_else_ce/pages/AuthPage/utils/forms'; import persistStateToLocaleStorage from '../../components/GuidedTour/utils/persistStateToLocaleStorage'; import useLocalesProvider from '../../components/LocalesProvider/useLocalesProvider'; import formatAPIErrors from '../../utils/formatAPIErrors'; import init from './init'; import { initialState, reducer } from './reducer'; +import { FORMS } from './constants'; +import { useEnterprise } from '../../hooks/useEnterprise'; const AuthPage = ({ hasAdmin, setHasAdmin }) => { const { @@ -25,10 +26,19 @@ const AuthPage = ({ hasAdmin, setHasAdmin }) => { params: { authType }, } = useRouteMatch('/auth/:authType'); const query = useQuery(); - const { Component, endPoint, fieldsToDisable, fieldsToOmit, inputsPrefix, schema, ...rest } = get( - forms, - authType, - {} + const forms = useEnterprise( + FORMS, + async () => (await import('../../../../ee/admin/pages/AuthPage/constants')).FORMS, + { + combine(ceForms, eeForms) { + return { + ...ceForms, + ...eeForms, + }; + }, + + defaultValue: {}, + } ); const [{ formErrors, modifiedData, requestError }, dispatch] = useReducer( reducer, @@ -37,6 +47,8 @@ const AuthPage = ({ hasAdmin, setHasAdmin }) => { ); const CancelToken = axios.CancelToken; const source = CancelToken.source(); + const { Component, endPoint, fieldsToDisable, fieldsToOmit, inputsPrefix, schema, ...rest } = + forms?.[authType] ?? {}; useEffect(() => { // Cancel request on unmount diff --git a/packages/core/admin/admin/src/pages/AuthPage/utils/index.js b/packages/core/admin/admin/src/pages/AuthPage/utils/index.js deleted file mode 100644 index 67c9083218..0000000000 --- a/packages/core/admin/admin/src/pages/AuthPage/utils/index.js +++ /dev/null @@ -1,2 +0,0 @@ -/* eslint-disable import/prefer-default-export */ -export { default as forms } from './forms'; diff --git a/packages/core/admin/ee/admin/pages/AuthPage/constants.js b/packages/core/admin/ee/admin/pages/AuthPage/constants.js new file mode 100644 index 0000000000..aea98735eb --- /dev/null +++ b/packages/core/admin/ee/admin/pages/AuthPage/constants.js @@ -0,0 +1,12 @@ +import Providers from './components/Providers'; + +export const FORMS = { + providers: { + Component: Providers, + endPoint: null, + fieldsToDisable: [], + fieldsToOmit: [], + schema: null, + inputsPrefix: '', + }, +}; diff --git a/packages/core/admin/ee/admin/pages/AuthPage/utils/forms.js b/packages/core/admin/ee/admin/pages/AuthPage/utils/forms.js deleted file mode 100644 index d2d9eb5bde..0000000000 --- a/packages/core/admin/ee/admin/pages/AuthPage/utils/forms.js +++ /dev/null @@ -1,16 +0,0 @@ -import Providers from '../components/Providers'; -import baseForms from '../../../../../admin/src/pages/AuthPage/utils/forms'; - -const forms = { - ...baseForms, - providers: { - Component: Providers, - endPoint: null, - fieldsToDisable: [], - fieldsToOmit: [], - schema: null, - inputsPrefix: '', - }, -}; - -export default forms; From e54595c02ce1e38fbdd679f1b9ff561ce9239416 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 18 Jun 2023 23:01:53 +0000 Subject: [PATCH 154/172] chore(deps): bump aws-sdk from 2.1372.0 to 2.1399.0 Bumps [aws-sdk](https://github.com/aws/aws-sdk-js) from 2.1372.0 to 2.1399.0. - [Release notes](https://github.com/aws/aws-sdk-js/releases) - [Commits](https://github.com/aws/aws-sdk-js/compare/v2.1372.0...v2.1399.0) --- updated-dependencies: - dependency-name: aws-sdk dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- packages/providers/upload-aws-s3/package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/providers/upload-aws-s3/package.json b/packages/providers/upload-aws-s3/package.json index 2740a4b759..705dab0951 100644 --- a/packages/providers/upload-aws-s3/package.json +++ b/packages/providers/upload-aws-s3/package.json @@ -45,7 +45,7 @@ "lint": "run -T eslint ." }, "dependencies": { - "aws-sdk": "2.1372.0", + "aws-sdk": "2.1399.0", "lodash": "4.17.21" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index 17b533e0cd..a5e2fa4af6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8617,7 +8617,7 @@ __metadata: resolution: "@strapi/provider-upload-aws-s3@workspace:packages/providers/upload-aws-s3" dependencies: "@types/jest": 29.2.0 - aws-sdk: 2.1372.0 + aws-sdk: 2.1399.0 eslint-config-custom: 4.11.1 lodash: 4.17.21 tsconfig: 4.11.1 @@ -12088,9 +12088,9 @@ __metadata: languageName: node linkType: hard -"aws-sdk@npm:2.1372.0": - version: 2.1372.0 - resolution: "aws-sdk@npm:2.1372.0" +"aws-sdk@npm:2.1399.0": + version: 2.1399.0 + resolution: "aws-sdk@npm:2.1399.0" dependencies: buffer: 4.9.2 events: 1.1.1 @@ -12102,7 +12102,7 @@ __metadata: util: ^0.12.4 uuid: 8.0.0 xml2js: 0.5.0 - checksum: da064626d434f792adf74861534ab3fc15757ba9352f735f6703deacebf1b982c057d5db434ac00fc5d364aee1c82de684572e205228f5014ca468e05e312d97 + checksum: 74dc46a921cd449749e6a9ba318eb959db0004a21b0c8257660a0cb9727c09b3260f5adb460429d9f362b5c432897df9f7dab3b72dc8c599fdbb96681b132dbc languageName: node linkType: hard From 8184bf218466ea9cad4883ceb4428fd625591440 Mon Sep 17 00:00:00 2001 From: Gustav Hansen Date: Mon, 19 Jun 2023 09:42:25 +0200 Subject: [PATCH 155/172] Chore: Bump nx from v15 to v16 --- package.json | 2 +- yarn.lock | 204 +++++++++++++++++++++++++-------------------------- 2 files changed, 103 insertions(+), 103 deletions(-) diff --git a/package.json b/package.json index 95c9404a1a..ea72c22151 100644 --- a/package.json +++ b/package.json @@ -104,7 +104,7 @@ "lerna": "6.5.1", "lint-staged": "13.2.2", "lodash": "4.17.21", - "nx": "15.9.4", + "nx": "16.3.2", "plop": "2.7.6", "prettier": "2.8.4", "qs": "6.11.1", diff --git a/yarn.lock b/yarn.lock index 17b533e0cd..e81ba5ce41 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4690,15 +4690,6 @@ __metadata: languageName: node linkType: hard -"@nrwl/cli@npm:15.9.4": - version: 15.9.4 - resolution: "@nrwl/cli@npm:15.9.4" - dependencies: - nx: 15.9.4 - checksum: 039df998bbc56cc6d506a4c07500c97ce6662dff1ed0756d893d48398ffbfcfc9a1c274914011dbe331c0663b5c3e6de496ad6cdd05180ea0505fdcee19c67ff - languageName: node - linkType: hard - "@nrwl/devkit@npm:>=15.5.2 < 16": version: 15.8.2 resolution: "@nrwl/devkit@npm:15.8.2" @@ -4722,13 +4713,6 @@ __metadata: languageName: node linkType: hard -"@nrwl/nx-darwin-arm64@npm:15.9.4": - version: 15.9.4 - resolution: "@nrwl/nx-darwin-arm64@npm:15.9.4" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - "@nrwl/nx-darwin-x64@npm:15.8.2": version: 15.8.2 resolution: "@nrwl/nx-darwin-x64@npm:15.8.2" @@ -4736,13 +4720,6 @@ __metadata: languageName: node linkType: hard -"@nrwl/nx-darwin-x64@npm:15.9.4": - version: 15.9.4 - resolution: "@nrwl/nx-darwin-x64@npm:15.9.4" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - "@nrwl/nx-linux-arm-gnueabihf@npm:15.8.2": version: 15.8.2 resolution: "@nrwl/nx-linux-arm-gnueabihf@npm:15.8.2" @@ -4750,13 +4727,6 @@ __metadata: languageName: node linkType: hard -"@nrwl/nx-linux-arm-gnueabihf@npm:15.9.4": - version: 15.9.4 - resolution: "@nrwl/nx-linux-arm-gnueabihf@npm:15.9.4" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - "@nrwl/nx-linux-arm64-gnu@npm:15.8.2": version: 15.8.2 resolution: "@nrwl/nx-linux-arm64-gnu@npm:15.8.2" @@ -4764,13 +4734,6 @@ __metadata: languageName: node linkType: hard -"@nrwl/nx-linux-arm64-gnu@npm:15.9.4": - version: 15.9.4 - resolution: "@nrwl/nx-linux-arm64-gnu@npm:15.9.4" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - "@nrwl/nx-linux-arm64-musl@npm:15.8.2": version: 15.8.2 resolution: "@nrwl/nx-linux-arm64-musl@npm:15.8.2" @@ -4778,13 +4741,6 @@ __metadata: languageName: node linkType: hard -"@nrwl/nx-linux-arm64-musl@npm:15.9.4": - version: 15.9.4 - resolution: "@nrwl/nx-linux-arm64-musl@npm:15.9.4" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - "@nrwl/nx-linux-x64-gnu@npm:15.8.2": version: 15.8.2 resolution: "@nrwl/nx-linux-x64-gnu@npm:15.8.2" @@ -4792,13 +4748,6 @@ __metadata: languageName: node linkType: hard -"@nrwl/nx-linux-x64-gnu@npm:15.9.4": - version: 15.9.4 - resolution: "@nrwl/nx-linux-x64-gnu@npm:15.9.4" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - "@nrwl/nx-linux-x64-musl@npm:15.8.2": version: 15.8.2 resolution: "@nrwl/nx-linux-x64-musl@npm:15.8.2" @@ -4806,13 +4755,6 @@ __metadata: languageName: node linkType: hard -"@nrwl/nx-linux-x64-musl@npm:15.9.4": - version: 15.9.4 - resolution: "@nrwl/nx-linux-x64-musl@npm:15.9.4" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - "@nrwl/nx-win32-arm64-msvc@npm:15.8.2": version: 15.8.2 resolution: "@nrwl/nx-win32-arm64-msvc@npm:15.8.2" @@ -4820,13 +4762,6 @@ __metadata: languageName: node linkType: hard -"@nrwl/nx-win32-arm64-msvc@npm:15.9.4": - version: 15.9.4 - resolution: "@nrwl/nx-win32-arm64-msvc@npm:15.9.4" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - "@nrwl/nx-win32-x64-msvc@npm:15.8.2": version: 15.8.2 resolution: "@nrwl/nx-win32-x64-msvc@npm:15.8.2" @@ -4834,13 +4769,6 @@ __metadata: languageName: node linkType: hard -"@nrwl/nx-win32-x64-msvc@npm:15.9.4": - version: 15.9.4 - resolution: "@nrwl/nx-win32-x64-msvc@npm:15.9.4" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - "@nrwl/tao@npm:15.8.2": version: 15.8.2 resolution: "@nrwl/tao@npm:15.8.2" @@ -4852,14 +4780,84 @@ __metadata: languageName: node linkType: hard -"@nrwl/tao@npm:15.9.4": - version: 15.9.4 - resolution: "@nrwl/tao@npm:15.9.4" +"@nrwl/tao@npm:16.3.2": + version: 16.3.2 + resolution: "@nrwl/tao@npm:16.3.2" dependencies: - nx: 15.9.4 + nx: 16.3.2 bin: tao: index.js - checksum: 03acf914b443fc5b0a93674dbdf9d770856d48adf8956819869aef6c5378ecb52e9696361e8c8799c639fd384f7ab5d109189d44251a8975901adcfe77fa0c9e + checksum: 85f6c83170b0beccee7d86ae7cc3a09154d003be4fb9ab7b34f66044b71161d439766b6b19ef63424671780285476bad3375306c7e2af099d82c39d755997678 + languageName: node + linkType: hard + +"@nx/nx-darwin-arm64@npm:16.3.2": + version: 16.3.2 + resolution: "@nx/nx-darwin-arm64@npm:16.3.2" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@nx/nx-darwin-x64@npm:16.3.2": + version: 16.3.2 + resolution: "@nx/nx-darwin-x64@npm:16.3.2" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@nx/nx-freebsd-x64@npm:16.3.2": + version: 16.3.2 + resolution: "@nx/nx-freebsd-x64@npm:16.3.2" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@nx/nx-linux-arm-gnueabihf@npm:16.3.2": + version: 16.3.2 + resolution: "@nx/nx-linux-arm-gnueabihf@npm:16.3.2" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@nx/nx-linux-arm64-gnu@npm:16.3.2": + version: 16.3.2 + resolution: "@nx/nx-linux-arm64-gnu@npm:16.3.2" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@nx/nx-linux-arm64-musl@npm:16.3.2": + version: 16.3.2 + resolution: "@nx/nx-linux-arm64-musl@npm:16.3.2" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@nx/nx-linux-x64-gnu@npm:16.3.2": + version: 16.3.2 + resolution: "@nx/nx-linux-x64-gnu@npm:16.3.2" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@nx/nx-linux-x64-musl@npm:16.3.2": + version: 16.3.2 + resolution: "@nx/nx-linux-x64-musl@npm:16.3.2" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@nx/nx-win32-arm64-msvc@npm:16.3.2": + version: 16.3.2 + resolution: "@nx/nx-win32-arm64-msvc@npm:16.3.2" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@nx/nx-win32-x64-msvc@npm:16.3.2": + version: 16.3.2 + resolution: "@nx/nx-win32-x64-msvc@npm:16.3.2" + conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -25670,21 +25668,21 @@ __metadata: languageName: node linkType: hard -"nx@npm:15.9.4": - version: 15.9.4 - resolution: "nx@npm:15.9.4" +"nx@npm:16.3.2": + version: 16.3.2 + resolution: "nx@npm:16.3.2" dependencies: - "@nrwl/cli": 15.9.4 - "@nrwl/nx-darwin-arm64": 15.9.4 - "@nrwl/nx-darwin-x64": 15.9.4 - "@nrwl/nx-linux-arm-gnueabihf": 15.9.4 - "@nrwl/nx-linux-arm64-gnu": 15.9.4 - "@nrwl/nx-linux-arm64-musl": 15.9.4 - "@nrwl/nx-linux-x64-gnu": 15.9.4 - "@nrwl/nx-linux-x64-musl": 15.9.4 - "@nrwl/nx-win32-arm64-msvc": 15.9.4 - "@nrwl/nx-win32-x64-msvc": 15.9.4 - "@nrwl/tao": 15.9.4 + "@nrwl/tao": 16.3.2 + "@nx/nx-darwin-arm64": 16.3.2 + "@nx/nx-darwin-x64": 16.3.2 + "@nx/nx-freebsd-x64": 16.3.2 + "@nx/nx-linux-arm-gnueabihf": 16.3.2 + "@nx/nx-linux-arm64-gnu": 16.3.2 + "@nx/nx-linux-arm64-musl": 16.3.2 + "@nx/nx-linux-x64-gnu": 16.3.2 + "@nx/nx-linux-x64-musl": 16.3.2 + "@nx/nx-win32-arm64-msvc": 16.3.2 + "@nx/nx-win32-x64-msvc": 16.3.2 "@parcel/watcher": 2.0.4 "@yarnpkg/lockfile": ^1.1.0 "@yarnpkg/parsers": ^3.0.0-rc.18 @@ -25722,23 +25720,25 @@ __metadata: "@swc-node/register": ^1.4.2 "@swc/core": ^1.2.173 dependenciesMeta: - "@nrwl/nx-darwin-arm64": + "@nx/nx-darwin-arm64": optional: true - "@nrwl/nx-darwin-x64": + "@nx/nx-darwin-x64": optional: true - "@nrwl/nx-linux-arm-gnueabihf": + "@nx/nx-freebsd-x64": optional: true - "@nrwl/nx-linux-arm64-gnu": + "@nx/nx-linux-arm-gnueabihf": optional: true - "@nrwl/nx-linux-arm64-musl": + "@nx/nx-linux-arm64-gnu": optional: true - "@nrwl/nx-linux-x64-gnu": + "@nx/nx-linux-arm64-musl": optional: true - "@nrwl/nx-linux-x64-musl": + "@nx/nx-linux-x64-gnu": optional: true - "@nrwl/nx-win32-arm64-msvc": + "@nx/nx-linux-x64-musl": optional: true - "@nrwl/nx-win32-x64-msvc": + "@nx/nx-win32-arm64-msvc": + optional: true + "@nx/nx-win32-x64-msvc": optional: true peerDependenciesMeta: "@swc-node/register": @@ -25747,7 +25747,7 @@ __metadata: optional: true bin: nx: bin/nx.js - checksum: 61b92c070db1474462eb31f86cf3ac5a5ab2a3f454bed307a0b931cf09ef5ee883c90f05b4440f5760ff57f3965ecdd744320ff3b0475fba9b52004840173b5f + checksum: 627decdb89cea60f45ab035b33a53f2e3170f24c0eed07cfbec59eeeda4a6d62b57738e5f34fd1cdcdc00dcff83bb4d1022fe892c69e89420182d50ff0f6b547 languageName: node linkType: hard @@ -30710,7 +30710,7 @@ __metadata: lerna: 6.5.1 lint-staged: 13.2.2 lodash: 4.17.21 - nx: 15.9.4 + nx: 16.3.2 plop: 2.7.6 prettier: 2.8.4 qs: 6.11.1 From e26c1c122bd9fff6cda6c1fea3952e696cd7037f Mon Sep 17 00:00:00 2001 From: Convly Date: Mon, 19 Jun 2023 09:45:04 +0200 Subject: [PATCH 156/172] Make the abstract service type looser to allow unsafe calls --- packages/core/strapi/lib/types/core/common/service.d.ts | 2 +- packages/core/strapi/lib/types/core/strapi/index.d.ts | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/core/strapi/lib/types/core/common/service.d.ts b/packages/core/strapi/lib/types/core/common/service.d.ts index 8bcf454022..110456acde 100644 --- a/packages/core/strapi/lib/types/core/common/service.d.ts +++ b/packages/core/strapi/lib/types/core/common/service.d.ts @@ -1,3 +1,3 @@ export type Service = { - [key: keyof any]: unknown; + [key: keyof any]: any; }; diff --git a/packages/core/strapi/lib/types/core/strapi/index.d.ts b/packages/core/strapi/lib/types/core/strapi/index.d.ts index 33856e2f2a..88e0a5c5f9 100644 --- a/packages/core/strapi/lib/types/core/strapi/index.d.ts +++ b/packages/core/strapi/lib/types/core/strapi/index.d.ts @@ -82,7 +82,9 @@ export interface Strapi { /** * Find a controller using its unique identifier */ - controller(uid: TContentTypeUID): Shared.Controllers[TContentTypeUID]; + controller( + uid: TContentTypeUID + ): Shared.Controllers[TContentTypeUID]; /** * Getter for the Strapi content types container From 52626f52b9698c3b89f05a3fa144891b3d7bb021 Mon Sep 17 00:00:00 2001 From: Convly Date: Mon, 19 Jun 2023 09:57:47 +0200 Subject: [PATCH 157/172] Add comment to explain context about the common.service any use --- packages/core/strapi/lib/types/core/common/service.d.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/core/strapi/lib/types/core/common/service.d.ts b/packages/core/strapi/lib/types/core/common/service.d.ts index 110456acde..2fafcf64e2 100644 --- a/packages/core/strapi/lib/types/core/common/service.d.ts +++ b/packages/core/strapi/lib/types/core/common/service.d.ts @@ -1,3 +1,5 @@ export type Service = { + // TODO [V5] Consider changing the any value to unknown. + // See: https://github.com/strapi/strapi/issues/16993 and https://github.com/strapi/strapi/pull/17020 for further information [key: keyof any]: any; }; From bc6034cf841f8cfb048751ea26efcff64903bd48 Mon Sep 17 00:00:00 2001 From: Josh <37798644+joshuaellis@users.noreply.github.com> Date: Mon, 19 Jun 2023 10:22:38 +0100 Subject: [PATCH 158/172] chore: remove history & clean up some U&P tests (#16992) --- .../Permissions/PermissionRow/SubCategory.js | 22 +- .../admin/src/hooks/index.js | 4 +- .../admin/src/hooks/usePlugins.js | 71 + .../admin/src/hooks/usePlugins/index.js | 70 - .../admin/src/hooks/usePlugins/init.js | 5 - .../admin/src/hooks/usePlugins/reducer.js | 34 - .../src/hooks/usePlugins/tests/init.test.js | 32 - .../hooks/usePlugins/tests/reducer.test.js | 96 -- .../AdvancedSettings/tests/index.test.js | 9 - .../AdvancedSettings/tests/utils/server.js | 26 - .../pages/EmailTemplates/tests/index.test.js | 9 - .../EmailTemplates/tests/utils/server.js | 41 - .../src/pages/Providers/tests/index.test.js | 8 - .../admin/src/pages/Providers/tests/server.js | 26 - .../{CreatePage/index.js => CreatePage.js} | 16 +- .../Roles/CreatePage/tests/index.test.js | 1059 -------------- .../pages/Roles/CreatePage/tests/server.js | 65 - .../Roles/{EditPage/index.js => EditPage.js} | 34 +- .../pages/Roles/EditPage/tests/index.test.js | 1221 ----------------- .../src/pages/Roles/EditPage/tests/server.js | 95 -- .../src/pages/Roles/EditPage/utils/schema.js | 9 - .../pages/Roles/ListPage/tests/index.test.js | 763 +--------- .../src/pages/Roles/ListPage/tests/server.js | 33 - .../src/pages/Roles/ListPage/utils/api.js | 2 +- .../index.js => ProtectedCreatePage.js} | 5 +- .../index.js => ProtectedEditPage.js} | 5 +- .../index.js => ProtectedListPage.js} | 5 +- .../utils/schema.js => constants.js} | 4 +- .../src/pages/Roles/tests/CreatePage.test.js | 108 ++ .../src/pages/Roles/tests/EditPage.test.js | 155 +++ .../users-permissions/jest.config.front.js | 1 + .../plugins/users-permissions/package.json | 1 - .../plugins/users-permissions/tests/server.js | 191 +++ .../plugins/users-permissions/tests/setup.js | 15 + yarn.lock | 1 - 35 files changed, 671 insertions(+), 3570 deletions(-) create mode 100644 packages/plugins/users-permissions/admin/src/hooks/usePlugins.js delete mode 100644 packages/plugins/users-permissions/admin/src/hooks/usePlugins/index.js delete mode 100644 packages/plugins/users-permissions/admin/src/hooks/usePlugins/init.js delete mode 100644 packages/plugins/users-permissions/admin/src/hooks/usePlugins/reducer.js delete mode 100644 packages/plugins/users-permissions/admin/src/hooks/usePlugins/tests/init.test.js delete mode 100644 packages/plugins/users-permissions/admin/src/hooks/usePlugins/tests/reducer.test.js delete mode 100644 packages/plugins/users-permissions/admin/src/pages/AdvancedSettings/tests/utils/server.js delete mode 100644 packages/plugins/users-permissions/admin/src/pages/EmailTemplates/tests/utils/server.js delete mode 100644 packages/plugins/users-permissions/admin/src/pages/Providers/tests/server.js rename packages/plugins/users-permissions/admin/src/pages/Roles/{CreatePage/index.js => CreatePage.js} (94%) delete mode 100644 packages/plugins/users-permissions/admin/src/pages/Roles/CreatePage/tests/index.test.js delete mode 100644 packages/plugins/users-permissions/admin/src/pages/Roles/CreatePage/tests/server.js rename packages/plugins/users-permissions/admin/src/pages/Roles/{EditPage/index.js => EditPage.js} (95%) delete mode 100644 packages/plugins/users-permissions/admin/src/pages/Roles/EditPage/tests/index.test.js delete mode 100644 packages/plugins/users-permissions/admin/src/pages/Roles/EditPage/tests/server.js delete mode 100644 packages/plugins/users-permissions/admin/src/pages/Roles/EditPage/utils/schema.js delete mode 100644 packages/plugins/users-permissions/admin/src/pages/Roles/ListPage/tests/server.js rename packages/plugins/users-permissions/admin/src/pages/Roles/{ProtectedCreatePage/index.js => ProtectedCreatePage.js} (74%) rename packages/plugins/users-permissions/admin/src/pages/Roles/{ProtectedEditPage/index.js => ProtectedEditPage.js} (75%) rename packages/plugins/users-permissions/admin/src/pages/Roles/{ProtectedListPage/index.js => ProtectedListPage.js} (76%) rename packages/plugins/users-permissions/admin/src/pages/Roles/{CreatePage/utils/schema.js => constants.js} (78%) create mode 100644 packages/plugins/users-permissions/admin/src/pages/Roles/tests/CreatePage.test.js create mode 100644 packages/plugins/users-permissions/admin/src/pages/Roles/tests/EditPage.test.js create mode 100644 packages/plugins/users-permissions/tests/server.js create mode 100644 packages/plugins/users-permissions/tests/setup.js diff --git a/packages/plugins/users-permissions/admin/src/components/Permissions/PermissionRow/SubCategory.js b/packages/plugins/users-permissions/admin/src/components/Permissions/PermissionRow/SubCategory.js index 924883932d..a9a91bdffc 100644 --- a/packages/plugins/users-permissions/admin/src/components/Permissions/PermissionRow/SubCategory.js +++ b/packages/plugins/users-permissions/admin/src/components/Permissions/PermissionRow/SubCategory.js @@ -1,6 +1,14 @@ import React, { useCallback, useMemo } from 'react'; -import { Box, Checkbox, Flex, Grid, GridItem, Typography } from '@strapi/design-system'; +import { + Box, + Checkbox, + Flex, + Typography, + Grid, + GridItem, + VisuallyHidden, +} from '@strapi/design-system'; import { Cog as CogIcon } from '@strapi/icons'; import get from 'lodash/get'; import PropTypes from 'prop-types'; @@ -90,10 +98,20 @@ const SubCategory = ({ subCategory }) => { diff --git a/packages/plugins/users-permissions/admin/src/hooks/index.js b/packages/plugins/users-permissions/admin/src/hooks/index.js index 3b6a597d15..9988733f3f 100644 --- a/packages/plugins/users-permissions/admin/src/hooks/index.js +++ b/packages/plugins/users-permissions/admin/src/hooks/index.js @@ -1,5 +1,5 @@ // eslint-disable-next-line import/prefer-default-export -export { default as useFetchRole } from './useFetchRole'; export { default as useForm } from './useForm'; -export { default as usePlugins } from './usePlugins'; export { default as useRolesList } from './useRolesList'; +export * from './usePlugins'; +export { default as useFetchRole } from './useFetchRole'; diff --git a/packages/plugins/users-permissions/admin/src/hooks/usePlugins.js b/packages/plugins/users-permissions/admin/src/hooks/usePlugins.js new file mode 100644 index 0000000000..ce1f0e8d23 --- /dev/null +++ b/packages/plugins/users-permissions/admin/src/hooks/usePlugins.js @@ -0,0 +1,71 @@ +import { useEffect } from 'react'; + +import { useNotification, useFetchClient, useAPIErrorHandler } from '@strapi/helper-plugin'; +import { useQueries } from 'react-query'; + +import pluginId from '../pluginId'; +import { cleanPermissions, getTrad } from '../utils'; + +export const usePlugins = () => { + const toggleNotification = useNotification(); + const { get } = useFetchClient(); + const { formatAPIError } = useAPIErrorHandler(getTrad); + + const [ + { + data: permissions, + isLoading: isLoadingPermissions, + error: permissionsError, + refetch: refetchPermissions, + }, + { data: routes, isLoading: isLoadingRoutes, error: routesError, refetch: refetchRoutes }, + ] = useQueries([ + { + queryKey: [pluginId, 'permissions'], + async queryFn() { + const res = await get(`/${pluginId}/permissions`); + + return res.data.permissions; + }, + }, + { + queryKey: [pluginId, 'routes'], + async queryFn() { + const res = await get(`/${pluginId}/routes`); + + return res.data.routes; + }, + }, + ]); + + const refetchQueries = async () => { + await Promise.all([refetchPermissions(), refetchRoutes()]); + }; + + useEffect(() => { + if (permissionsError) { + toggleNotification({ + type: 'warning', + message: formatAPIError(permissionsError), + }); + } + }, [toggleNotification, permissionsError, formatAPIError]); + + useEffect(() => { + if (routesError) { + toggleNotification({ + type: 'warning', + message: formatAPIError(routesError), + }); + } + }, [toggleNotification, routesError, formatAPIError]); + + const isLoading = isLoadingPermissions || isLoadingRoutes; + + return { + permissions: permissions ? cleanPermissions(permissions) : {}, + routes: routes ?? {}, + getData: refetchQueries, + isLoading, + }; +}; diff --git a/packages/plugins/users-permissions/admin/src/hooks/usePlugins/index.js b/packages/plugins/users-permissions/admin/src/hooks/usePlugins/index.js deleted file mode 100644 index d1abd28af5..0000000000 --- a/packages/plugins/users-permissions/admin/src/hooks/usePlugins/index.js +++ /dev/null @@ -1,70 +0,0 @@ -import { useCallback, useEffect, useReducer } from 'react'; - -import { useFetchClient, useNotification } from '@strapi/helper-plugin'; -import get from 'lodash/get'; - -import pluginId from '../../pluginId'; -import { cleanPermissions } from '../../utils'; - -import init from './init'; -import reducer, { initialState } from './reducer'; - -const usePlugins = (shouldFetchData = true) => { - const toggleNotification = useNotification(); - const [{ permissions, routes, isLoading }, dispatch] = useReducer(reducer, initialState, () => - init(initialState, shouldFetchData) - ); - const fetchClient = useFetchClient(); - - const fetchPlugins = useCallback(async () => { - try { - dispatch({ - type: 'GET_DATA', - }); - - const [{ permissions }, { routes }] = await Promise.all( - [`/${pluginId}/permissions`, `/${pluginId}/routes`].map(async (endpoint) => { - const res = await fetchClient.get(endpoint); - - return res.data; - }) - ); - - dispatch({ - type: 'GET_DATA_SUCCEEDED', - permissions: cleanPermissions(permissions), - routes, - }); - } catch (err) { - const message = get(err, ['response', 'payload', 'message'], 'An error occured'); - - dispatch({ - type: 'GET_DATA_ERROR', - }); - - if (message !== 'Forbidden') { - toggleNotification({ - type: 'warning', - message, - }); - } - } - - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [toggleNotification]); - - useEffect(() => { - if (shouldFetchData) { - fetchPlugins(); - } - }, [fetchPlugins, shouldFetchData]); - - return { - permissions, - routes, - getData: fetchPlugins, - isLoading, - }; -}; - -export default usePlugins; diff --git a/packages/plugins/users-permissions/admin/src/hooks/usePlugins/init.js b/packages/plugins/users-permissions/admin/src/hooks/usePlugins/init.js deleted file mode 100644 index dfe71d9376..0000000000 --- a/packages/plugins/users-permissions/admin/src/hooks/usePlugins/init.js +++ /dev/null @@ -1,5 +0,0 @@ -const init = (initialState, shouldFetchData) => { - return { ...initialState, isLoading: shouldFetchData }; -}; - -export default init; diff --git a/packages/plugins/users-permissions/admin/src/hooks/usePlugins/reducer.js b/packages/plugins/users-permissions/admin/src/hooks/usePlugins/reducer.js deleted file mode 100644 index 8a19db2dd2..0000000000 --- a/packages/plugins/users-permissions/admin/src/hooks/usePlugins/reducer.js +++ /dev/null @@ -1,34 +0,0 @@ -/* eslint-disable consistent-return */ -import produce from 'immer'; - -export const initialState = { - permissions: {}, - routes: {}, - isLoading: true, -}; - -const reducer = (state, action) => - produce(state, (draftState) => { - switch (action.type) { - case 'GET_DATA': { - draftState.isLoading = true; - draftState.permissions = {}; - draftState.routes = {}; - break; - } - case 'GET_DATA_SUCCEEDED': { - draftState.permissions = action.permissions; - draftState.routes = action.routes; - draftState.isLoading = false; - break; - } - case 'GET_DATA_ERROR': { - draftState.isLoading = false; - break; - } - default: - return draftState; - } - }); - -export default reducer; diff --git a/packages/plugins/users-permissions/admin/src/hooks/usePlugins/tests/init.test.js b/packages/plugins/users-permissions/admin/src/hooks/usePlugins/tests/init.test.js deleted file mode 100644 index 9900a6bcb3..0000000000 --- a/packages/plugins/users-permissions/admin/src/hooks/usePlugins/tests/init.test.js +++ /dev/null @@ -1,32 +0,0 @@ -import init from '../init'; - -describe('USERS PERMISSIONS | HOOKS | usePlugins | init', () => { - it('should return the initial state and set the isLoading key to true', () => { - const initialState = { - ok: true, - }; - - const expected = { - ok: true, - isLoading: true, - }; - - expect(init(initialState, true)).toEqual(expected); - }); - - it('should return the initial state and set the isLoading key to false', () => { - const initialState = { - permissions: {}, - routes: {}, - isLoading: null, - }; - - const expected = { - permissions: {}, - routes: {}, - isLoading: false, - }; - - expect(init(initialState, false)).toEqual(expected); - }); -}); diff --git a/packages/plugins/users-permissions/admin/src/hooks/usePlugins/tests/reducer.test.js b/packages/plugins/users-permissions/admin/src/hooks/usePlugins/tests/reducer.test.js deleted file mode 100644 index c9e62e2942..0000000000 --- a/packages/plugins/users-permissions/admin/src/hooks/usePlugins/tests/reducer.test.js +++ /dev/null @@ -1,96 +0,0 @@ -import reducer from '../reducer'; - -describe('USERS PERMISSIONS | HOOKS | usePlugins | reducer', () => { - describe('DEFAULT_ACTION', () => { - it('should return the initialState', () => { - const state = { - test: true, - }; - - expect(reducer(state, {})).toEqual(state); - }); - }); - - describe('GET_DATA', () => { - it('should set the isLoading key to true', () => { - const state = { - permissions: { ok: true }, - routes: { ok: true }, - isLoading: false, - }; - - const action = { - type: 'GET_DATA', - }; - - const expected = { - permissions: {}, - routes: {}, - isLoading: true, - }; - - expect(reducer(state, action)).toEqual(expected); - }); - }); - - describe('GET_DATA_ERROR', () => { - it('should set isLoading to false is an error occured', () => { - const action = { - type: 'GET_DATA_ERROR', - }; - const initialState = { - permissions: {}, - routes: {}, - isLoading: true, - }; - const expected = { - permissions: {}, - routes: {}, - isLoading: false, - }; - - expect(reducer(initialState, action)).toEqual(expected); - }); - }); - - describe('GET_DATA_SUCCEEDED', () => { - it('should return the state with the permissions list', () => { - const action = { - type: 'GET_DATA_SUCCEEDED', - permissions: { - application: { - controllers: { - address: { - count: { enabled: false }, - }, - }, - }, - }, - routes: { - application: [{ method: 'GET', path: '/addresses' }], - }, - }; - const initialState = { - permissions: {}, - isLoading: true, - }; - const expected = { - permissions: { - application: { - controllers: { - address: { - count: { enabled: false }, - }, - }, - }, - }, - routes: { - application: [{ method: 'GET', path: '/addresses' }], - }, - isLoading: false, - }; - - expect(reducer(initialState, action)).toEqual(expected); - }); - }); -}); diff --git a/packages/plugins/users-permissions/admin/src/pages/AdvancedSettings/tests/index.test.js b/packages/plugins/users-permissions/admin/src/pages/AdvancedSettings/tests/index.test.js index db3cf66616..5b487fb47b 100644 --- a/packages/plugins/users-permissions/admin/src/pages/AdvancedSettings/tests/index.test.js +++ b/packages/plugins/users-permissions/admin/src/pages/AdvancedSettings/tests/index.test.js @@ -8,8 +8,6 @@ import { QueryClient, QueryClientProvider } from 'react-query'; import ProtectedAdvancedSettingsPage from '../index'; -import server from './utils/server'; - jest.mock('@strapi/helper-plugin', () => ({ ...jest.requireActual('@strapi/helper-plugin'), useNotification: jest.fn(), @@ -38,19 +36,12 @@ const App = ( ); describe('ADMIN | Pages | Settings | Advanced Settings', () => { - beforeAll(() => server.listen()); - beforeEach(() => { jest.clearAllMocks(); }); - afterEach(() => { - server.resetHandlers(); - }); - afterAll(() => { jest.resetAllMocks(); - server.close(); }); it('renders and matches the snapshot', async () => { diff --git a/packages/plugins/users-permissions/admin/src/pages/AdvancedSettings/tests/utils/server.js b/packages/plugins/users-permissions/admin/src/pages/AdvancedSettings/tests/utils/server.js deleted file mode 100644 index 644d99cfce..0000000000 --- a/packages/plugins/users-permissions/admin/src/pages/AdvancedSettings/tests/utils/server.js +++ /dev/null @@ -1,26 +0,0 @@ -import { rest } from 'msw'; -import { setupServer } from 'msw/node'; - -const handlers = [ - rest.get('*/advanced', (req, res, ctx) => { - return res( - ctx.delay(100), - ctx.status(200), - ctx.json({ - roles: [{ name: 'Authenticated', type: 'authenticated' }], - settings: { - allow_register: false, - default_role: 'authenticated', - email_confirmation: false, - email_confirmation_redirection: '', - email_reset_password: 'https://cat-bounce.com/', - unique_email: false, - }, - }) - ); - }), -]; - -const server = setupServer(...handlers); - -export default server; diff --git a/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/tests/index.test.js b/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/tests/index.test.js index 4568143899..49af90dcc3 100644 --- a/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/tests/index.test.js +++ b/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/tests/index.test.js @@ -8,8 +8,6 @@ import { QueryClient, QueryClientProvider } from 'react-query'; import ProtectedEmailTemplatesPage from '../index'; -import server from './utils/server'; - jest.mock('@strapi/helper-plugin', () => ({ ...jest.requireActual('@strapi/helper-plugin'), useNotification: jest.fn(), @@ -38,19 +36,12 @@ const App = ( ); describe('ADMIN | Pages | Settings | Email Templates', () => { - beforeAll(() => server.listen()); - beforeEach(() => { jest.clearAllMocks(); }); - afterEach(() => { - server.resetHandlers(); - }); - afterAll(() => { jest.resetAllMocks(); - server.close(); }); it('renders and matches the snapshot', async () => { diff --git a/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/tests/utils/server.js b/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/tests/utils/server.js deleted file mode 100644 index e01d131332..0000000000 --- a/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/tests/utils/server.js +++ /dev/null @@ -1,41 +0,0 @@ -import { rest } from 'msw'; -import { setupServer } from 'msw/node'; - -const handlers = [ - rest.get('*/email-templates', (req, res, ctx) => { - return res( - ctx.delay(100), - ctx.status(200), - ctx.json({ - email_confirmation: { - display: 'Email.template.email_confirmation', - options: { - from: { - email: 'mochoko@strapi.io', - name: 'Administration Panel', - }, - message: 'Thank you for registering. Please click on the link below.', - object: 'Account confirmation', - response_email: '', - }, - }, - reset_password: { - display: 'Email.template.reset_password', - options: { - from: { - email: 'mochoko@strapi.io', - name: 'Administration Panel', - }, - message: 'We heard that you lost your password. Sorry about that!', - object: 'Reset password', - response_email: '', - }, - }, - }) - ); - }), -]; - -const server = setupServer(...handlers); - -export default server; diff --git a/packages/plugins/users-permissions/admin/src/pages/Providers/tests/index.test.js b/packages/plugins/users-permissions/admin/src/pages/Providers/tests/index.test.js index 549b297511..a63aee292d 100644 --- a/packages/plugins/users-permissions/admin/src/pages/Providers/tests/index.test.js +++ b/packages/plugins/users-permissions/admin/src/pages/Providers/tests/index.test.js @@ -8,8 +8,6 @@ import { QueryClient, QueryClientProvider } from 'react-query'; import { ProvidersPage } from '../index'; -import server from './server'; - jest.mock('@strapi/helper-plugin', () => ({ ...jest.requireActual('@strapi/helper-plugin'), useNotification: jest.fn(), @@ -36,16 +34,10 @@ const App = ( ); describe('Admin | containers | ProvidersPage', () => { - beforeAll(() => server.listen()); - beforeEach(() => { jest.clearAllMocks(); }); - afterEach(() => server.resetHandlers()); - - afterAll(() => server.close()); - it('renders and matches the snapshot', () => { useRBAC.mockImplementation(() => ({ isLoading: true, diff --git a/packages/plugins/users-permissions/admin/src/pages/Providers/tests/server.js b/packages/plugins/users-permissions/admin/src/pages/Providers/tests/server.js deleted file mode 100644 index 16125084e6..0000000000 --- a/packages/plugins/users-permissions/admin/src/pages/Providers/tests/server.js +++ /dev/null @@ -1,26 +0,0 @@ -import { rest } from 'msw'; -import { setupServer } from 'msw/node'; - -const handlers = [ - rest.get('*/providers', (req, res, ctx) => { - return res( - ctx.delay(1000), - ctx.status(200), - ctx.json({ - email: { enabled: true, icon: 'envelope' }, - discord: { - callback: '/auth/discord/callback', - enabled: false, - icon: 'discord', - key: '', - scope: ['identify', 'email'], - secret: '', - }, - }) - ); - }), -]; - -const server = setupServer(...handlers); - -export default server; diff --git a/packages/plugins/users-permissions/admin/src/pages/Roles/CreatePage/index.js b/packages/plugins/users-permissions/admin/src/pages/Roles/CreatePage.js similarity index 94% rename from packages/plugins/users-permissions/admin/src/pages/Roles/CreatePage/index.js rename to packages/plugins/users-permissions/admin/src/pages/Roles/CreatePage.js index 9744ec4630..15888f7ffc 100644 --- a/packages/plugins/users-permissions/admin/src/pages/Roles/CreatePage/index.js +++ b/packages/plugins/users-permissions/admin/src/pages/Roles/CreatePage.js @@ -26,14 +26,14 @@ import { Formik } from 'formik'; import { useIntl } from 'react-intl'; import { useHistory } from 'react-router-dom'; -import UsersPermissions from '../../../components/UsersPermissions'; -import { usePlugins } from '../../../hooks'; -import pluginId from '../../../pluginId'; -import getTrad from '../../../utils/getTrad'; +import UsersPermissions from '../../components/UsersPermissions'; +import { usePlugins } from '../../hooks'; +import pluginId from '../../pluginId'; +import getTrad from '../../utils/getTrad'; -import schema from './utils/schema'; +import { createRoleSchema } from './constants'; -const EditPage = () => { +const CreatePage = () => { const { formatMessage } = useIntl(); const [isSubmitting, setIsSubmitting] = useState(false); const toggleNotification = useNotification(); @@ -85,7 +85,7 @@ const EditPage = () => { enableReinitialize initialValues={{ name: '', description: '' }} onSubmit={handleCreateRoleSubmit} - validationSchema={schema} + validationSchema={createRoleSchema} > {({ handleSubmit, values, handleChange, errors }) => (
@@ -182,4 +182,4 @@ const EditPage = () => { ); }; -export default EditPage; +export default CreatePage; diff --git a/packages/plugins/users-permissions/admin/src/pages/Roles/CreatePage/tests/index.test.js b/packages/plugins/users-permissions/admin/src/pages/Roles/CreatePage/tests/index.test.js deleted file mode 100644 index b50e69d1ef..0000000000 --- a/packages/plugins/users-permissions/admin/src/pages/Roles/CreatePage/tests/index.test.js +++ /dev/null @@ -1,1059 +0,0 @@ -import React from 'react'; - -import { lightTheme, ThemeProvider } from '@strapi/design-system'; -import { act, render, waitFor } from '@testing-library/react'; -import { createMemoryHistory } from 'history'; -import { IntlProvider } from 'react-intl'; -import { Route, Router, Switch } from 'react-router-dom'; - -import RolesCreatePage from '..'; -import pluginId from '../../../../pluginId'; - -import server from './server'; - -jest.mock('@strapi/helper-plugin', () => { - // Make sure the references of the mock functions stay the same, otherwise we get an endless loop - const mockToggleNotification = jest.fn(); - const mockUseNotification = jest.fn(() => { - return mockToggleNotification; - }); - - return { - ...jest.requireActual('@strapi/helper-plugin'), - useNotification: mockUseNotification, - useOverlayBlocker: jest.fn(() => ({ lockApp: jest.fn(), unlockApp: jest.fn() })), - }; -}); - -function makeAndRenderApp() { - const history = createMemoryHistory(); - const app = ( - - - - - - - - - - ); - const renderResult = render(app); - act(() => history.push(`/settings/${pluginId}/roles/new`)); - - return renderResult; -} - -describe('Admin | containers | RoleCreatePage', () => { - beforeAll(() => server.listen()); - - beforeEach(() => jest.clearAllMocks()); - - afterEach(() => server.resetHandlers()); - - afterAll(() => server.close()); - - it('renders users-permissions create role and matches snapshot', async () => { - const { container, getByText, getByRole } = makeAndRenderApp(); - await waitFor(() => - expect(getByRole('heading', { name: /create a role/i })).toBeInTheDocument() - ); - await waitFor(() => { - expect( - getByText(/define all allowed actions for the api::address plugin/i) - ).toBeInTheDocument(); - }); - - expect(container.firstChild).toMatchInlineSnapshot(` - .c7 { - font-weight: 600; - font-size: 2rem; - line-height: 1.25; - color: #32324d; - } - - .c13 { - font-size: 1rem; - line-height: 1.5; - color: #666687; - } - - .c18 { - font-weight: 500; - font-size: 1rem; - line-height: 1.25; - color: #32324d; - } - - .c22 { - font-size: 0.75rem; - line-height: 1.33; - font-weight: 600; - color: #32324d; - } - - .c12 { - font-size: 0.75rem; - line-height: 1.33; - font-weight: 600; - line-height: 0; - color: #ffffff; - } - - .c36 { - font-size: 0.875rem; - line-height: 1.43; - color: #666687; - } - - .c46 { - font-size: 0.75rem; - line-height: 1.33; - color: #4945ff; - } - - .c47 { - font-weight: 500; - font-size: 1rem; - line-height: 1.25; - display: block; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - color: #4a4a6a; - } - - .c1 { - background: #f6f6f9; - padding-top: 40px; - padding-right: 56px; - padding-bottom: 40px; - padding-left: 56px; - } - - .c4 { - min-width: 0; - } - - .c14 { - padding-right: 56px; - padding-left: 56px; - } - - .c16 { - background: #ffffff; - padding-top: 24px; - padding-right: 32px; - padding-bottom: 24px; - padding-left: 32px; - border-radius: 4px; - box-shadow: 0px 1px 4px rgba(33,33,52,0.1); - } - - .c26 { - border-radius: 4px; - border-color: #dcdce4; - border: 1px solid #dcdce4; - } - - .c28 { - font-size: 0.875rem; - background: #ffffff; - color: #32324d; - padding: 16px; - border-radius: 4px; - width: 100%; - height: 6.5625rem; - line-height: 1.43; - } - - .c8 { - background: #4945ff; - padding: 8px; - padding-right: 16px; - padding-left: 16px; - border-radius: 4px; - border-color: #4945ff; - border: 1px solid #4945ff; - cursor: pointer; - } - - .c30 { - background: #ffffff; - border-radius: 4px; - box-shadow: 0px 1px 4px rgba(33,33,52,0.1); - } - - .c32 { - padding-top: 24px; - padding-right: 32px; - padding-bottom: 24px; - padding-left: 32px; - } - - .c37 { - border-radius: 4px; - } - - .c39 { - background: #f6f6f9; - padding-top: 24px; - padding-right: 24px; - padding-bottom: 24px; - padding-left: 24px; - } - - .c41 { - max-width: 100%; - -webkit-flex: 1; - -ms-flex: 1; - flex: 1; - } - - .c43 { - background: transparent; - min-width: 0; - -webkit-flex: 1; - -ms-flex: 1; - flex: 1; - } - - .c48 { - background: #dcdce4; - border-radius: 50%; - width: 2rem; - height: 2rem; - -webkit-flex-shrink: 0; - -ms-flex-negative: 0; - flex-shrink: 0; - cursor: pointer; - } - - .c50 { - color: #666687; - width: 0.6875rem; - } - - .c52 { - background: #eaeaef; - padding-top: 24px; - padding-right: 32px; - padding-bottom: 24px; - padding-left: 32px; - } - - .c3 { - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-box-pack: justify; - -webkit-justify-content: space-between; - -ms-flex-pack: justify; - justify-content: space-between; - } - - .c5 { - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - } - - .c15 { - -webkit-align-items: stretch; - -webkit-box-align: stretch; - -ms-flex-align: stretch; - align-items: stretch; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: column; - -ms-flex-direction: column; - flex-direction: column; - gap: 32px; - } - - .c17 { - -webkit-align-items: stretch; - -webkit-box-align: stretch; - -ms-flex-align: stretch; - align-items: stretch; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: column; - -ms-flex-direction: column; - flex-direction: column; - gap: 16px; - } - - .c21 { - -webkit-align-items: stretch; - -webkit-box-align: stretch; - -ms-flex-align: stretch; - align-items: stretch; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: column; - -ms-flex-direction: column; - flex-direction: column; - gap: 4px; - } - - .c9 { - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - gap: 8px; - } - - .c34 { - -webkit-align-items: stretch; - -webkit-box-align: stretch; - -ms-flex-align: stretch; - align-items: stretch; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: column; - -ms-flex-direction: column; - flex-direction: column; - gap: 24px; - } - - .c35 { - -webkit-align-items: stretch; - -webkit-box-align: stretch; - -ms-flex-align: stretch; - align-items: stretch; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: column; - -ms-flex-direction: column; - flex-direction: column; - gap: 8px; - } - - .c42 { - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - gap: 12px; - } - - .c49 { - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-flex-shrink: 0; - -ms-flex-negative: 0; - flex-shrink: 0; - -webkit-box-pack: center; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; - } - - .c38 { - border: 1px solid #f6f6f9; - } - - .c38:hover:not([aria-disabled='true']) { - border: 1px solid #4945ff; - } - - .c38:hover:not([aria-disabled='true']) .c6 { - color: #4945ff; - } - - .c38:hover:not([aria-disabled='true']) > .c2 { - background: #f0f0ff; - } - - .c38:hover:not([aria-disabled='true']) [data-strapi-dropdown='true'] { - background: #d9d8ff; - } - - .c44 { - border: none; - position: relative; - outline: none; - } - - .c44[aria-disabled='true'] { - pointer-events: none; - } - - .c44[aria-disabled='true'] svg path { - fill: #666687; - } - - .c44 svg path { - fill: #4945ff; - } - - .c44:after { - -webkit-transition-property: all; - transition-property: all; - -webkit-transition-duration: 0.2s; - transition-duration: 0.2s; - border-radius: 8px; - content: ''; - position: absolute; - top: -4px; - bottom: -4px; - left: -4px; - right: -4px; - border: 2px solid transparent; - } - - .c44:focus-visible { - outline: none; - } - - .c44:focus-visible:after { - border-radius: 8px; - content: ''; - position: absolute; - top: -5px; - bottom: -5px; - left: -5px; - right: -5px; - border: 2px solid #4945ff; - } - - .c51 path { - fill: #666687; - } - - .c45 { - text-align: left; - } - - .c45 > span { - max-width: 100%; - } - - .c45 svg { - width: 0.875rem; - height: 0.875rem; - } - - .c45 svg path { - fill: #8e8ea9; - } - - .c40 { - min-height: 5.5rem; - border-radius: 4px; - } - - .c40:hover svg path { - fill: #4945ff; - } - - .c10 { - position: relative; - outline: none; - } - - .c10 > svg { - height: 12px; - width: 12px; - } - - .c10 > svg > g, - .c10 > svg path { - fill: #ffffff; - } - - .c10[aria-disabled='true'] { - pointer-events: none; - } - - .c10:after { - -webkit-transition-property: all; - transition-property: all; - -webkit-transition-duration: 0.2s; - transition-duration: 0.2s; - border-radius: 8px; - content: ''; - position: absolute; - top: -4px; - bottom: -4px; - left: -4px; - right: -4px; - border: 2px solid transparent; - } - - .c10:focus-visible { - outline: none; - } - - .c10:focus-visible:after { - border-radius: 8px; - content: ''; - position: absolute; - top: -5px; - bottom: -5px; - left: -5px; - right: -5px; - border: 2px solid #4945ff; - } - - .c11 { - height: 2rem; - } - - .c11 svg { - height: 0.75rem; - width: auto; - } - - .c11[aria-disabled='true'] { - border: 1px solid #dcdce4; - background: #eaeaef; - } - - .c11[aria-disabled='true'] .c6 { - color: #666687; - } - - .c11[aria-disabled='true'] svg > g,.c11[aria-disabled='true'] svg path { - fill: #666687; - } - - .c11[aria-disabled='true']:active { - border: 1px solid #dcdce4; - background: #eaeaef; - } - - .c11[aria-disabled='true']:active .c6 { - color: #666687; - } - - .c11[aria-disabled='true']:active svg > g,.c11[aria-disabled='true']:active svg path { - fill: #666687; - } - - .c11:hover { - border: 1px solid #7b79ff; - background: #7b79ff; - } - - .c11:active { - border: 1px solid #4945ff; - background: #4945ff; - } - - .c11 svg > g, - .c11 svg path { - fill: #ffffff; - } - - .c23 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - } - - .c25 { - border: none; - border-radius: 4px; - padding-bottom: 0.65625rem; - padding-left: 16px; - padding-right: 16px; - padding-top: 0.65625rem; - color: #32324d; - font-weight: 400; - font-size: 0.875rem; - display: block; - width: 100%; - background: inherit; - } - - .c25::-webkit-input-placeholder { - color: #8e8ea9; - opacity: 1; - } - - .c25::-moz-placeholder { - color: #8e8ea9; - opacity: 1; - } - - .c25:-ms-input-placeholder { - color: #8e8ea9; - opacity: 1; - } - - .c25::placeholder { - color: #8e8ea9; - opacity: 1; - } - - .c25[aria-disabled='true'] { - color: inherit; - } - - .c25:focus { - outline: none; - box-shadow: none; - } - - .c24 { - border: 1px solid #dcdce4; - border-radius: 4px; - background: #ffffff; - outline: none; - box-shadow: 0; - -webkit-transition-property: border-color,box-shadow,fill; - transition-property: border-color,box-shadow,fill; - -webkit-transition-duration: 0.2s; - transition-duration: 0.2s; - } - - .c24:focus-within { - border: 1px solid #4945ff; - box-shadow: #4945ff 0px 0px 0px 2px; - } - - .c19 { - display: grid; - grid-template-columns: repeat(12,1fr); - gap: 16px; - } - - .c31 { - display: grid; - grid-template-columns: repeat(12,1fr); - } - - .c20 { - grid-column: span 6; - max-width: 100%; - } - - .c33 { - grid-column: span 7; - max-width: 100%; - } - - .c53 { - grid-column: span 5; - max-width: 100%; - } - - .c0:focus-visible { - outline: none; - } - - .c27 { - outline: none; - box-shadow: 0; - -webkit-transition-property: border-color,box-shadow,fill; - transition-property: border-color,box-shadow,fill; - -webkit-transition-duration: 0.2s; - transition-duration: 0.2s; - } - - .c27:focus-within { - border: 1px solid #4945ff; - box-shadow: #4945ff 0px 0px 0px 2px; - } - - .c29 { - border: none; - resize: none; - } - - .c29::-webkit-input-placeholder { - color: #8e8ea9; - font-size: 0.875rem; - color: #8e8ea9; - opacity: 1; - } - - .c29::-moz-placeholder { - color: #8e8ea9; - font-size: 0.875rem; - color: #8e8ea9; - opacity: 1; - } - - .c29:-ms-input-placeholder { - color: #8e8ea9; - font-size: 0.875rem; - color: #8e8ea9; - opacity: 1; - } - - .c29::placeholder { - color: #8e8ea9; - font-size: 0.875rem; - color: #8e8ea9; - opacity: 1; - } - - .c29:focus-within { - outline: none; - } - - @media (max-width:68.75rem) { - .c20 { - grid-column: span; - } - } - - @media (max-width:34.375rem) { - .c20 { - grid-column: span; - } - } - - @media (max-width:68.75rem) { - .c33 { - grid-column: span; - } - } - - @media (max-width:34.375rem) { - .c33 { - grid-column: span; - } - } - - @media (max-width:68.75rem) { - .c53 { - grid-column: span; - } - } - - @media (max-width:34.375rem) { - .c53 { - grid-column: span; - } - } - -
- -
-
-
-
-

- Create a role -

-
- -
-

- Define the rights given to the role -

-
-
-
-
-
-
-

- Role details -

-
-
-
-
-
- -
- -
-
-
-
-
-
-
-
- -
- -
-
-
-
-
-
-
-
-
-
-
-

- Permissions -

-

- Only actions bound by a route are listed below. -

-
-
-
-
-
- -
- -
-
-
-
-
-
-
-
-
-

- Advanced settings -

-

- Select the application's actions or the plugin's actions and click on the cog icon to display the bound route -

-
-
-
-
-
- -
- `); - }); - - it("can edit a users-permissions role's name and description", async () => { - const { getByLabelText, getByRole, getByTestId, getAllByText } = makeAndRenderApp(); - const user = userEvent.setup(); - - // Check loading screen - const loader = getByTestId('loader'); - expect(loader).toBeInTheDocument(); - - // After loading, check other elements - await waitForElementToBeRemoved(loader); - const saveButton = getByRole('button', { name: /save/i }); - expect(saveButton).toBeInTheDocument(); - const nameField = getByLabelText(/name/i); - expect(nameField).toBeInTheDocument(); - const descriptionField = getByLabelText(/description/i); - expect(descriptionField).toBeInTheDocument(); - - // Shows error when name is missing - await user.clear(nameField); - expect(nameField).toHaveValue(''); - await user.clear(descriptionField); - expect(descriptionField).toHaveValue(''); - - // Show errors after form submit - await user.click(saveButton); - await waitFor(() => expect(saveButton).not.toBeDisabled()); - const errorMessages = await getAllByText(/invalid value/i); - errorMessages.forEach((errorMessage) => expect(errorMessage).toBeInTheDocument()); - }); - - it('can toggle the permissions accordions and actions', async () => { - const user = userEvent.setup(); - // Create app and wait for loading - const { getByLabelText, getByRole, queryByText, getByTestId, getByText, getAllByRole } = - makeAndRenderApp(); - const loader = getByTestId('loader'); - await waitForElementToBeRemoved(loader); - - // Open the collapse - const collapse = getByText(/define all allowed actions for the api::address plugin/i); - await user.click(collapse); - expect(getByLabelText(/select all/i)).toBeInTheDocument(); - - // Display the selected action's bound route - const actionCogButton = getByTestId('action-cog'); - await user.click(actionCogButton); - expect(getByText(/bound route to/i)).toBeInTheDocument(); - expect(getByText('POST')).toBeInTheDocument(); - expect(getByText('/addresses')).toBeInTheDocument(); - - expect(getByRole('checkbox', { name: 'Select all' }).checked).toBe(false); - - await user.click(getByRole('checkbox', { name: 'Select all' })); - - getAllByRole('checkbox') - .slice(1, -1) - .forEach((actionCheckbox) => { - console.log(actionCheckbox.checked); - expect(actionCheckbox.checked).toBe(true); - }); - - // Close the collapse - await user.click(collapse); - expect(queryByText(/select all/i)).not.toBeInTheDocument(); - }); -}); diff --git a/packages/plugins/users-permissions/admin/src/pages/Roles/EditPage/tests/server.js b/packages/plugins/users-permissions/admin/src/pages/Roles/EditPage/tests/server.js deleted file mode 100644 index 917c012e35..0000000000 --- a/packages/plugins/users-permissions/admin/src/pages/Roles/EditPage/tests/server.js +++ /dev/null @@ -1,95 +0,0 @@ -import { rest } from 'msw'; -import { setupServer } from 'msw/node'; - -import pluginId from '../../../../pluginId'; - -const handlers = [ - // Mock get role route - rest.get(`*/${pluginId}/roles/:roleId`, (req, res, ctx) => { - return res( - ctx.delay(100), - ctx.status(200), - ctx.json({ - role: { - id: req.params.roleId, - name: 'Authenticated', - description: 'Default role given to authenticated user.', - type: 'authenticated', - createdAt: '2021-09-08T16:26:18.061Z', - updatedAt: '2021-09-08T16:26:18.061Z', - permissions: { - 'api::address': { - controllers: { - address: { - create: { - enabled: false, - policy: '', - }, - }, - }, - }, - }, - }, - }) - ); - }), - - // Mock edit role route - rest.put(`*/${pluginId}/roles/:roleId`, (req, res, ctx) => { - return res(ctx.delay(500), ctx.status(200), ctx.json({ ok: true })); - }), - - // Mock get all routes route - rest.get(`*/${pluginId}/routes`, (req, res, ctx) => { - return res( - ctx.status(200), - ctx.json({ - routes: { - 'api::address': [ - { - method: 'POST', - path: '/addresses', - handler: 'address.create', - config: { - policies: [], - auth: { - scope: 'api::address.address.create', - }, - }, - info: { - apiName: 'address', - type: 'content-api', - }, - }, - ], - }, - }) - ); - }), - - // Mock permissions route - rest.get(`*/${pluginId}/permissions`, (req, res, ctx) => { - return res( - ctx.delay(100), - ctx.status(200), - ctx.json({ - permissions: { - 'api::address': { - controllers: { - address: { - create: { - enabled: false, - policy: '', - }, - }, - }, - }, - }, - }) - ); - }), -]; - -const server = setupServer(...handlers); - -export default server; diff --git a/packages/plugins/users-permissions/admin/src/pages/Roles/EditPage/utils/schema.js b/packages/plugins/users-permissions/admin/src/pages/Roles/EditPage/utils/schema.js deleted file mode 100644 index c3bcd9cf28..0000000000 --- a/packages/plugins/users-permissions/admin/src/pages/Roles/EditPage/utils/schema.js +++ /dev/null @@ -1,9 +0,0 @@ -import { translatedErrors } from '@strapi/helper-plugin'; -import * as yup from 'yup'; - -const schema = yup.object().shape({ - name: yup.string().required(translatedErrors.required), - description: yup.string().required(translatedErrors.required), -}); - -export default schema; diff --git a/packages/plugins/users-permissions/admin/src/pages/Roles/ListPage/tests/index.test.js b/packages/plugins/users-permissions/admin/src/pages/Roles/ListPage/tests/index.test.js index b7904d9ad5..c603e9228d 100644 --- a/packages/plugins/users-permissions/admin/src/pages/Roles/ListPage/tests/index.test.js +++ b/packages/plugins/users-permissions/admin/src/pages/Roles/ListPage/tests/index.test.js @@ -2,724 +2,105 @@ import React from 'react'; -import { lightTheme, ThemeProvider } from '@strapi/design-system'; -import { TrackingProvider, useRBAC } from '@strapi/helper-plugin'; -import { render, screen, waitFor } from '@testing-library/react'; -import { createMemoryHistory } from 'history'; +import { ThemeProvider, lightTheme } from '@strapi/design-system'; +import { render as renderRTL, waitForElementToBeRemoved } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; import { IntlProvider } from 'react-intl'; import { QueryClient, QueryClientProvider } from 'react-query'; -import { Router } from 'react-router-dom'; +import { MemoryRouter, Route } from 'react-router-dom'; import RoleListPage from '../index'; -import server from './server'; +jest.mock('@strapi/design-system', () => ({ + ...jest.requireActual('@strapi/design-system'), + useNotifyAT: () => ({ + notifyStatus: jest.fn(), + }), +})); jest.mock('@strapi/helper-plugin', () => ({ ...jest.requireActual('@strapi/helper-plugin'), - useNotification: jest.fn(), - useRBAC: jest.fn(), + useNotification: jest.fn().mockImplementation(() => jest.fn()), + useRBAC: jest + .fn() + .mockImplementation(() => ({ isLoading: false, allowedActions: { canRead: true } })), CheckPermissions: jest.fn(({ children }) => children), })); -const client = new QueryClient({ - defaultOptions: { - queries: { - retry: false, +let testLocation; + +const render = () => ({ + ...renderRTL(, { + wrapper({ children }) { + const client = new QueryClient({ + defaultOptions: { + queries: { + retry: false, + }, + }, + }); + + return ( + + + + + {children} + + + + { + testLocation = location; + + return null; + }} + /> + + ); }, - }, + }), + user: userEvent.setup(), }); -const makeApp = (history) => ( - - - - - - - - - - - -); - -describe('Plugin | Users and Permissions | RoleListPage', () => { - beforeAll(() => server.listen()); - +describe('Roles – ListPage', () => { beforeEach(() => { jest.clearAllMocks(); }); - afterEach(() => server.resetHandlers()); + it('renders as expected with headers, actions and a table', async () => { + const { getByRole, queryByText, getByText } = render(); - afterAll(() => server.close()); + expect(queryByText('Loading content.')).toBeInTheDocument(); - it('renders and matches the snapshot', () => { - useRBAC.mockImplementation(() => ({ isLoading: false, allowedActions: { canRead: true } })); - const history = createMemoryHistory(); - const App = makeApp(history); - const { - container: { firstChild }, - } = render(App); + expect(getByRole('heading', { name: 'Roles' })).toBeInTheDocument(); + expect(getByText('List of roles')).toBeInTheDocument(); + expect(getByRole('button', { name: 'Add new role' })).toBeInTheDocument(); + expect(getByRole('button', { name: 'Search' })).toBeInTheDocument(); - expect(firstChild).toMatchInlineSnapshot(` - .c22 { - border: 0; - -webkit-clip: rect(0 0 0 0); - clip: rect(0 0 0 0); - height: 1px; - margin: -1px; - overflow: hidden; - padding: 0; - position: absolute; - width: 1px; - } + await waitForElementToBeRemoved(() => queryByText('Loading content.')); - .c9 { - font-weight: 600; - font-size: 2rem; - line-height: 1.25; - color: #32324d; - } - - .c14 { - font-size: 0.75rem; - line-height: 1.33; - font-weight: 600; - line-height: 0; - color: #ffffff; - } - - .c15 { - font-size: 1rem; - line-height: 1.5; - color: #666687; - } - - .c36 { - font-weight: 500; - font-size: 1rem; - line-height: 1.25; - color: #666687; - text-align: center; - } - - .c1 { - padding-bottom: 56px; - } - - .c4 { - background: #f6f6f9; - padding-top: 40px; - padding-right: 56px; - padding-bottom: 40px; - padding-left: 56px; - } - - .c6 { - min-width: 0; - } - - .c10 { - background: #4945ff; - padding: 8px; - padding-right: 16px; - padding-left: 16px; - border-radius: 4px; - border-color: #4945ff; - border: 1px solid #4945ff; - cursor: pointer; - } - - .c16 { - padding-right: 56px; - padding-bottom: 16px; - padding-left: 56px; - } - - .c19 { - background: #ffffff; - padding: 8px; - border-radius: 4px; - border-color: #dcdce4; - border: 1px solid #dcdce4; - width: 2rem; - height: 2rem; - cursor: pointer; - } - - .c23 { - color: #32324d; - } - - .c25 { - -webkit-flex-shrink: 0; - -ms-flex-negative: 0; - flex-shrink: 0; - } - - .c27 { - padding-right: 56px; - padding-left: 56px; - } - - .c31 { - background: #ffffff; - padding: 64px; - border-radius: 4px; - box-shadow: 0px 1px 4px rgba(33,33,52,0.1); - } - - .c33 { - padding-bottom: 24px; - } - - .c35 { - padding-bottom: 16px; - } - - .c5 { - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-box-pack: justify; - -webkit-justify-content: space-between; - -ms-flex-pack: justify; - justify-content: space-between; - } - - .c7 { - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - } - - .c11 { - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - gap: 8px; - } - - .c17 { - -webkit-align-items: flex-start; - -webkit-box-align: flex-start; - -ms-flex-align: flex-start; - align-items: flex-start; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-box-pack: justify; - -webkit-justify-content: space-between; - -ms-flex-pack: justify; - justify-content: space-between; - } - - .c18 { - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-flex-wrap: wrap; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - gap: 8px; - } - - .c20 { - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-box-pack: center; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; - } - - .c26 { - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-flex-shrink: 0; - -ms-flex-negative: 0; - flex-shrink: 0; - -webkit-flex-wrap: wrap; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - gap: 8px; - } - - .c28 { - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-box-pack: space-around; - -webkit-justify-content: space-around; - -ms-flex-pack: space-around; - justify-content: space-around; - } - - .c32 { - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: column; - -ms-flex-direction: column; - flex-direction: column; - } - - .c24 path { - fill: #32324d; - } - - .c12 { - position: relative; - outline: none; - } - - .c12 > svg { - height: 12px; - width: 12px; - } - - .c12 > svg > g, - .c12 > svg path { - fill: #ffffff; - } - - .c12[aria-disabled='true'] { - pointer-events: none; - } - - .c12:after { - -webkit-transition-property: all; - transition-property: all; - -webkit-transition-duration: 0.2s; - transition-duration: 0.2s; - border-radius: 8px; - content: ''; - position: absolute; - top: -4px; - bottom: -4px; - left: -4px; - right: -4px; - border: 2px solid transparent; - } - - .c12:focus-visible { - outline: none; - } - - .c12:focus-visible:after { - border-radius: 8px; - content: ''; - position: absolute; - top: -5px; - bottom: -5px; - left: -5px; - right: -5px; - border: 2px solid #4945ff; - } - - .c13 { - height: 2rem; - } - - .c13 svg { - height: 0.75rem; - width: auto; - } - - .c13[aria-disabled='true'] { - border: 1px solid #dcdce4; - background: #eaeaef; - } - - .c13[aria-disabled='true'] .c8 { - color: #666687; - } - - .c13[aria-disabled='true'] svg > g,.c13[aria-disabled='true'] svg path { - fill: #666687; - } - - .c13[aria-disabled='true']:active { - border: 1px solid #dcdce4; - background: #eaeaef; - } - - .c13[aria-disabled='true']:active .c8 { - color: #666687; - } - - .c13[aria-disabled='true']:active svg > g,.c13[aria-disabled='true']:active svg path { - fill: #666687; - } - - .c13:hover { - border: 1px solid #7b79ff; - background: #7b79ff; - } - - .c13:active { - border: 1px solid #4945ff; - background: #4945ff; - } - - .c13 svg > g, - .c13 svg path { - fill: #ffffff; - } - - .c30 { - -webkit-animation: gzYjWD 1s infinite linear; - animation: gzYjWD 1s infinite linear; - will-change: transform; - } - - .c34 svg { - height: 5.5rem; - } - - .c21 svg > g, - .c21 svg path { - fill: #8e8ea9; - } - - .c21:hover svg > g, - .c21:hover svg path { - fill: #666687; - } - - .c21:active svg > g, - .c21:active svg path { - fill: #a5a5ba; - } - - .c21[aria-disabled='true'] svg path { - fill: #666687; - } - - .c0 { - display: grid; - grid-template-columns: 1fr; - } - - .c2 { - overflow-x: hidden; - } - - .c3:focus-visible { - outline: none; - } - - .c29 { - height: 100vh; - } - -
-
-
-
-
-
-
-

- Roles -

-
- -
-

- List of roles -

-
-
-
-
- - - -
-
-
-
-
-
-
- Loading content. -
- -
-
-
- -
-

- You don't have any roles yet. -

-
-
-
-
-
-
- `); + expect(getByRole('grid')).toBeInTheDocument(); + expect(getByRole('gridcell', { name: 'Authenticated' })).toBeInTheDocument(); + expect(getByRole('gridcell', { name: 'Public' })).toBeInTheDocument(); }); - it('should show a loader when fetching data', () => { - const history = createMemoryHistory(); - const App = makeApp(history); - render(App); + it('should direct me to the new user page when I press the add a new role button', async () => { + const { getByRole } = render(); - expect(screen.getByTestId('loader')).toBeInTheDocument(); + await userEvent.click(getByRole('button', { name: 'Add new role' })); + + expect(testLocation.pathname).toBe('/settings/users-permissions/roles/new'); }); - it('should show a list of roles', async () => { - const history = createMemoryHistory(); - const App = makeApp(history); - render(App); + it('should direct me to the edit view of a selected role if I click the edit role button', async () => { + const { getByRole, queryByText } = render(); - await waitFor(() => { - expect(screen.getByText('Authenticated')).toBeInTheDocument(); - expect(screen.getByText('Public')).toBeInTheDocument(); - }); + await waitForElementToBeRemoved(() => queryByText('Loading content.')); + + await userEvent.click(getByRole('button', { name: 'Edit Authenticated', hidden: true })); + + expect(testLocation.pathname).toBe('/settings/users-permissions/roles/1'); }); }); diff --git a/packages/plugins/users-permissions/admin/src/pages/Roles/ListPage/tests/server.js b/packages/plugins/users-permissions/admin/src/pages/Roles/ListPage/tests/server.js deleted file mode 100644 index dde6e1ef0a..0000000000 --- a/packages/plugins/users-permissions/admin/src/pages/Roles/ListPage/tests/server.js +++ /dev/null @@ -1,33 +0,0 @@ -import { rest } from 'msw'; -import { setupServer } from 'msw/node'; - -const handlers = [ - rest.get('*/roles', (req, res, ctx) => { - return res( - ctx.delay(1000), - ctx.status(200), - ctx.json({ - roles: [ - { - id: 1, - name: 'Authenticated', - description: 'Default role given to authenticated user.', - type: 'authenticated', - nb_users: 0, - }, - { - id: 2, - name: 'Public', - description: 'Default role given to unauthenticated user.', - type: 'public', - nb_users: 0, - }, - ], - }) - ); - }), -]; - -const server = setupServer(...handlers); - -export default server; diff --git a/packages/plugins/users-permissions/admin/src/pages/Roles/ListPage/utils/api.js b/packages/plugins/users-permissions/admin/src/pages/Roles/ListPage/utils/api.js index 9c4d2f22ca..67fb5e706e 100644 --- a/packages/plugins/users-permissions/admin/src/pages/Roles/ListPage/utils/api.js +++ b/packages/plugins/users-permissions/admin/src/pages/Roles/ListPage/utils/api.js @@ -15,7 +15,7 @@ export const fetchData = async (toggleNotification, notifyStatus) => { message: { id: 'notification.error' }, }); - throw new Error('error'); + throw new Error(err); } }; diff --git a/packages/plugins/users-permissions/admin/src/pages/Roles/ProtectedCreatePage/index.js b/packages/plugins/users-permissions/admin/src/pages/Roles/ProtectedCreatePage.js similarity index 74% rename from packages/plugins/users-permissions/admin/src/pages/Roles/ProtectedCreatePage/index.js rename to packages/plugins/users-permissions/admin/src/pages/Roles/ProtectedCreatePage.js index 2ed1c26346..be2a0d1441 100644 --- a/packages/plugins/users-permissions/admin/src/pages/Roles/ProtectedCreatePage/index.js +++ b/packages/plugins/users-permissions/admin/src/pages/Roles/ProtectedCreatePage.js @@ -2,8 +2,9 @@ import React from 'react'; import { CheckPagePermissions } from '@strapi/helper-plugin'; -import pluginPermissions from '../../../permissions'; -import RolesCreatePage from '../CreatePage'; +import pluginPermissions from '../../permissions'; + +import RolesCreatePage from './CreatePage'; const ProtectedRolesCreatePage = () => ( diff --git a/packages/plugins/users-permissions/admin/src/pages/Roles/ProtectedEditPage/index.js b/packages/plugins/users-permissions/admin/src/pages/Roles/ProtectedEditPage.js similarity index 75% rename from packages/plugins/users-permissions/admin/src/pages/Roles/ProtectedEditPage/index.js rename to packages/plugins/users-permissions/admin/src/pages/Roles/ProtectedEditPage.js index 01d37685aa..c3e0691b07 100644 --- a/packages/plugins/users-permissions/admin/src/pages/Roles/ProtectedEditPage/index.js +++ b/packages/plugins/users-permissions/admin/src/pages/Roles/ProtectedEditPage.js @@ -2,8 +2,9 @@ import React from 'react'; import { CheckPagePermissions } from '@strapi/helper-plugin'; -import pluginPermissions from '../../../permissions'; -import RolesEditPage from '../EditPage'; +import pluginPermissions from '../../permissions'; + +import RolesEditPage from './EditPage'; const ProtectedRolesEditPage = () => ( diff --git a/packages/plugins/users-permissions/admin/src/pages/Roles/ProtectedListPage/index.js b/packages/plugins/users-permissions/admin/src/pages/Roles/ProtectedListPage.js similarity index 76% rename from packages/plugins/users-permissions/admin/src/pages/Roles/ProtectedListPage/index.js rename to packages/plugins/users-permissions/admin/src/pages/Roles/ProtectedListPage.js index 6476f6f5a5..867a72be07 100644 --- a/packages/plugins/users-permissions/admin/src/pages/Roles/ProtectedListPage/index.js +++ b/packages/plugins/users-permissions/admin/src/pages/Roles/ProtectedListPage.js @@ -2,8 +2,9 @@ import React from 'react'; import { CheckPagePermissions } from '@strapi/helper-plugin'; -import pluginPermissions from '../../../permissions'; -import RolesListPage from '../ListPage'; +import pluginPermissions from '../../permissions'; + +import RolesListPage from './ListPage'; const ProtectedRolesListPage = () => { return ( diff --git a/packages/plugins/users-permissions/admin/src/pages/Roles/CreatePage/utils/schema.js b/packages/plugins/users-permissions/admin/src/pages/Roles/constants.js similarity index 78% rename from packages/plugins/users-permissions/admin/src/pages/Roles/CreatePage/utils/schema.js rename to packages/plugins/users-permissions/admin/src/pages/Roles/constants.js index c3bcd9cf28..51bd2c31b3 100644 --- a/packages/plugins/users-permissions/admin/src/pages/Roles/CreatePage/utils/schema.js +++ b/packages/plugins/users-permissions/admin/src/pages/Roles/constants.js @@ -1,9 +1,7 @@ import { translatedErrors } from '@strapi/helper-plugin'; import * as yup from 'yup'; -const schema = yup.object().shape({ +export const createRoleSchema = yup.object().shape({ name: yup.string().required(translatedErrors.required), description: yup.string().required(translatedErrors.required), }); - -export default schema; diff --git a/packages/plugins/users-permissions/admin/src/pages/Roles/tests/CreatePage.test.js b/packages/plugins/users-permissions/admin/src/pages/Roles/tests/CreatePage.test.js new file mode 100644 index 0000000000..032064f349 --- /dev/null +++ b/packages/plugins/users-permissions/admin/src/pages/Roles/tests/CreatePage.test.js @@ -0,0 +1,108 @@ +import React from 'react'; + +import { ThemeProvider, lightTheme } from '@strapi/design-system'; +import { NotificationsProvider } from '@strapi/helper-plugin'; +import { fireEvent, render as renderRTL, waitFor } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { IntlProvider } from 'react-intl'; +import { QueryClient, QueryClientProvider } from 'react-query'; +import { MemoryRouter, Switch, Route } from 'react-router-dom'; + +import pluginId from '../../../pluginId'; +import RolesCreatePage from '../CreatePage'; + +jest.mock('@strapi/helper-plugin', () => ({ + ...jest.requireActual('@strapi/helper-plugin'), + useOverlayBlocker: jest.fn(() => ({ lockApp: jest.fn(), unlockApp: jest.fn() })), +})); + +const render = () => ({ + ...renderRTL(, { + wrapper({ children }) { + const client = new QueryClient({ + defaultOptions: { + queries: { + retry: false, + }, + }, + }); + + return ( + + + + + + {children} + + + + + + ); + }, + }), + user: userEvent.setup(), +}); + +describe('Roles – CreatePage', () => { + beforeEach(() => jest.clearAllMocks()); + + it('renders correctly', async () => { + const { getByRole, user } = render(); + + expect(getByRole('heading', { name: 'Create a role' })).toBeInTheDocument(); + expect(getByRole('heading', { name: 'Role details' })).toBeInTheDocument(); + + /** + * This means the `usePlugins` hook has finished fetching + */ + await waitFor(() => expect(getByRole('heading', { name: 'Permissions' })).toBeInTheDocument()); + + expect(getByRole('heading', { name: 'Advanced settings' })).toBeInTheDocument(); + + expect(getByRole('button', { name: 'Save' })).toBeInTheDocument(); + + expect(getByRole('textbox', { name: 'Name' })).toBeInTheDocument(); + expect(getByRole('textbox', { name: 'Description' })).toBeInTheDocument(); + + await user.click(getByRole('button', { name: 'Address' })); + + expect(getByRole('region', { name: 'Address' })).toBeInTheDocument(); + + expect(getByRole('checkbox', { name: 'Select all' })).toBeInTheDocument(); + expect(getByRole('checkbox', { name: 'create' })).toBeInTheDocument(); + }); + + it('will show an error if the user does not fill the name or description field', async () => { + const { getByRole, getAllByText } = render(); + + await waitFor(() => expect(getByRole('heading', { name: 'Permissions' })).toBeInTheDocument()); + + fireEvent.click(getByRole('button', { name: 'Save' })); + + await waitFor(() => + expect(getByRole('textbox', { name: 'Name' })).toHaveAttribute('aria-invalid', 'true') + ); + + expect(getByRole('textbox', { name: 'Description' })).toHaveAttribute('aria-invalid', 'true'); + + expect(getAllByText('Invalid value')).toHaveLength(2); + }); + + it('can create a new role and show a notification', async () => { + const { getByRole, getByText, user } = render(); + + await waitFor(() => expect(getByRole('heading', { name: 'Permissions' })).toBeInTheDocument()); + + await user.type(getByRole('textbox', { name: 'Name' }), 'Test role'); + await user.type(getByRole('textbox', { name: 'Description' }), 'This is a test role'); + + await user.click(getByRole('button', { name: 'Address' })); + await user.click(getByRole('checkbox', { name: 'create' })); + + fireEvent.click(getByRole('button', { name: 'Save' })); + + await waitFor(() => expect(getByText('Role created')).toBeInTheDocument()); + }); +}); diff --git a/packages/plugins/users-permissions/admin/src/pages/Roles/tests/EditPage.test.js b/packages/plugins/users-permissions/admin/src/pages/Roles/tests/EditPage.test.js new file mode 100644 index 0000000000..a0d2cf6846 --- /dev/null +++ b/packages/plugins/users-permissions/admin/src/pages/Roles/tests/EditPage.test.js @@ -0,0 +1,155 @@ +import React from 'react'; + +import { ThemeProvider, lightTheme } from '@strapi/design-system'; +import { NotificationsProvider } from '@strapi/helper-plugin'; +import { + fireEvent, + render as renderRTL, + waitFor, + waitForElementToBeRemoved, +} from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { IntlProvider } from 'react-intl'; +import { QueryClient, QueryClientProvider } from 'react-query'; +import { MemoryRouter, Switch, Route } from 'react-router-dom'; + +import pluginId from '../../../pluginId'; +import RolesEditPage from '../EditPage'; + +jest.mock('@strapi/helper-plugin', () => ({ + ...jest.requireActual('@strapi/helper-plugin'), + useOverlayBlocker: jest.fn(() => ({ lockApp: jest.fn(), unlockApp: jest.fn() })), +})); + +const render = () => ({ + ...renderRTL(, { + wrapper({ children }) { + const client = new QueryClient({ + defaultOptions: { + queries: { + retry: false, + }, + }, + }); + + return ( + + + + + + {children} + + + + + + ); + }, + }), + user: userEvent.setup(), +}); + +describe('Roles – EditPage', () => { + beforeEach(() => jest.clearAllMocks()); + + it('renders correctly', async () => { + const { getByTestId, getByRole, user } = render(); + + await waitForElementToBeRemoved(() => getByTestId('loader')); + + expect(getByRole('link', { name: 'Back' })).toBeInTheDocument(); + + expect(getByRole('heading', { name: 'Authenticated' })).toBeInTheDocument(); + expect(getByRole('heading', { name: 'Role details' })).toBeInTheDocument(); + expect(getByRole('heading', { name: 'Permissions' })).toBeInTheDocument(); + expect(getByRole('heading', { name: 'Advanced settings' })).toBeInTheDocument(); + + expect(getByRole('button', { name: 'Save' })).toBeInTheDocument(); + + expect(getByRole('textbox', { name: 'Name' })).toBeInTheDocument(); + expect(getByRole('textbox', { name: 'Description' })).toBeInTheDocument(); + + await user.click(getByRole('button', { name: 'Address' })); + + expect(getByRole('region', { name: 'Address' })).toBeInTheDocument(); + + expect(getByRole('checkbox', { name: 'Select all' })).toBeInTheDocument(); + expect(getByRole('checkbox', { name: 'create' })).toBeInTheDocument(); + }); + + it('will show an error if the user does not fill the name field', async () => { + const { getByRole, user, getByTestId, getByText } = render(); + + await waitForElementToBeRemoved(() => getByTestId('loader')); + + await user.clear(getByRole('textbox', { name: 'Name' })); + + await user.click(getByRole('button', { name: 'Save' })); + + expect(getByRole('textbox', { name: 'Name' })).toHaveAttribute('aria-invalid', 'true'); + expect(getByText('Invalid value')).toBeInTheDocument(); + }); + + it('will show an error if the user does not fill out the description field', async () => { + const { getByRole, user, getByTestId, getByText } = render(); + + await waitForElementToBeRemoved(() => getByTestId('loader')); + + await user.clear(getByRole('textbox', { name: 'Description' })); + + await user.click(getByRole('button', { name: 'Save' })); + + expect(getByRole('textbox', { name: 'Description' })).toHaveAttribute('aria-invalid', 'true'); + expect(getByText('Invalid value')).toBeInTheDocument(); + }); + + it("can update a role's name and description", async () => { + const { getByRole, user, getByTestId, getByText } = render(); + + await waitForElementToBeRemoved(() => getByTestId('loader')); + + await user.type(getByRole('textbox', { name: 'Name' }), 'test'); + await user.type(getByRole('textbox', { name: 'Description' }), 'testing'); + + /** + * @note user.click will not trigger the form. + */ + fireEvent.click(getByRole('button', { name: 'Save' })); + + await waitFor(() => expect(getByText('Role edited')).toBeInTheDocument()); + }); + + it("can update a role's permissions", async () => { + const { getByRole, user, getByText, getByTestId } = render(); + + await waitForElementToBeRemoved(() => getByTestId('loader')); + + await user.click(getByRole('button', { name: 'Address' })); + + await user.click(getByRole('checkbox', { name: 'create' })); + + /** + * @note user.click will not trigger the form. + */ + fireEvent.click(getByRole('button', { name: 'Save' })); + + await waitFor(() => expect(getByText('Role edited')).toBeInTheDocument()); + }); + + it('will update the Advanced Settings panel when you click on the cog icon of a specific permission', async () => { + const { getByRole, user, getByText, getByTestId } = render(); + + await waitForElementToBeRemoved(() => getByTestId('loader')); + + await user.click(getByRole('button', { name: 'Address' })); + + await user.hover(getByRole('checkbox', { name: 'create' })); + + await user.click(getByRole('button', { name: /Show bound route/i })); + + expect(getByRole('heading', { name: 'Bound route to address .create' })).toBeInTheDocument(); + expect(getByText('POST')).toBeInTheDocument(); + expect(getByText('/addresses')).toBeInTheDocument(); + }); +}); diff --git a/packages/plugins/users-permissions/jest.config.front.js b/packages/plugins/users-permissions/jest.config.front.js index c4f1adbda6..3e8054a997 100644 --- a/packages/plugins/users-permissions/jest.config.front.js +++ b/packages/plugins/users-permissions/jest.config.front.js @@ -3,4 +3,5 @@ module.exports = { preset: '../../../jest-preset.front.js', displayName: 'Users & Permissions plugin', + setupFilesAfterEnv: ['./tests/setup.js'], }; diff --git a/packages/plugins/users-permissions/package.json b/packages/plugins/users-permissions/package.json index 31643adacd..75f4d3d237 100644 --- a/packages/plugins/users-permissions/package.json +++ b/packages/plugins/users-permissions/package.json @@ -54,7 +54,6 @@ "@testing-library/dom": "9.2.0", "@testing-library/react": "14.0.0", "@testing-library/user-event": "14.4.3", - "history": "^4.9.0", "msw": "1.2.1", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/packages/plugins/users-permissions/tests/server.js b/packages/plugins/users-permissions/tests/server.js new file mode 100644 index 0000000000..bdc45ba202 --- /dev/null +++ b/packages/plugins/users-permissions/tests/server.js @@ -0,0 +1,191 @@ +'use strict'; + +const { setupServer } = require('msw/node'); +const { rest } = require('msw'); +const pluginId = require('../admin/src/pluginId').default; + +const handlers = [ + // Mock get role route + rest.get(`*/${pluginId}/roles/:roleId`, (req, res, ctx) => { + return res( + ctx.status(200), + ctx.json({ + role: { + id: req.params.roleId, + name: 'Authenticated', + description: 'Default role given to authenticated user.', + type: 'authenticated', + createdAt: '2021-09-08T16:26:18.061Z', + updatedAt: '2021-09-08T16:26:18.061Z', + permissions: { + 'api::address': { + controllers: { + address: { + create: { + enabled: false, + policy: '', + }, + }, + }, + }, + }, + }, + }) + ); + }), + + // Mock edit role route + rest.put(`*/${pluginId}/roles/:roleId`, (req, res, ctx) => { + return res(ctx.status(200), ctx.json({ ok: true })); + }), + + // Mock create role route + rest.post(`*/${pluginId}/roles`, (req, res, ctx) => { + return res(ctx.status(200), ctx.json({ ok: true })); + }), + + // Mock get all routes route + rest.get(`*/${pluginId}/routes`, (req, res, ctx) => { + return res( + ctx.status(200), + ctx.json({ + routes: { + 'api::address': [ + { + method: 'POST', + path: '/addresses', + handler: 'address.create', + config: { + policies: [], + auth: { + scope: 'api::address.address.create', + }, + }, + info: { + apiName: 'address', + type: 'content-api', + }, + }, + ], + }, + }) + ); + }), + + // Mock permissions route + rest.get(`*/${pluginId}/permissions`, (req, res, ctx) => { + return res( + ctx.status(200), + ctx.json({ + permissions: { + 'api::address': { + controllers: { + address: { + create: { + enabled: false, + policy: '', + }, + }, + }, + }, + }, + }) + ); + }), + + rest.get('*/roles', (req, res, ctx) => { + return res( + ctx.status(200), + ctx.json({ + roles: [ + { + id: 1, + name: 'Authenticated', + description: 'Default role given to authenticated user.', + type: 'authenticated', + nb_users: 0, + }, + { + id: 2, + name: 'Public', + description: 'Default role given to unauthenticated user.', + type: 'public', + nb_users: 0, + }, + ], + }) + ); + }), + + rest.get('*/providers', (req, res, ctx) => { + return res( + ctx.status(200), + ctx.json({ + email: { enabled: true, icon: 'envelope' }, + discord: { + callback: '/auth/discord/callback', + enabled: false, + icon: 'discord', + key: '', + scope: ['identify', 'email'], + secret: '', + }, + }) + ); + }), + + rest.get('*/email-templates', (req, res, ctx) => { + return res( + ctx.status(200), + ctx.json({ + email_confirmation: { + display: 'Email.template.email_confirmation', + options: { + from: { + email: 'mochoko@strapi.io', + name: 'Administration Panel', + }, + message: 'Thank you for registering. Please click on the link below.', + object: 'Account confirmation', + response_email: '', + }, + }, + reset_password: { + display: 'Email.template.reset_password', + options: { + from: { + email: 'mochoko@strapi.io', + name: 'Administration Panel', + }, + message: 'We heard that you lost your password. Sorry about that!', + object: 'Reset password', + response_email: '', + }, + }, + }) + ); + }), + + rest.get('*/advanced', (req, res, ctx) => { + return res( + ctx.status(200), + ctx.json({ + roles: [{ name: 'Authenticated', type: 'authenticated' }], + settings: { + allow_register: false, + default_role: 'authenticated', + email_confirmation: false, + email_confirmation_redirection: '', + email_reset_password: 'https://cat-bounce.com/', + unique_email: false, + }, + }) + ); + }), +]; + +const server = setupServer(...handlers); + +module.exports = { + server, +}; diff --git a/packages/plugins/users-permissions/tests/setup.js b/packages/plugins/users-permissions/tests/setup.js new file mode 100644 index 0000000000..2727d42e3a --- /dev/null +++ b/packages/plugins/users-permissions/tests/setup.js @@ -0,0 +1,15 @@ +'use strict'; + +const { server } = require('./server'); + +beforeAll(() => { + server.listen(); +}); + +afterEach(() => { + server.resetHandlers(); +}); + +afterAll(() => { + server.close(); +}); diff --git a/yarn.lock b/yarn.lock index e81ba5ce41..f5f8a4d1e4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8514,7 +8514,6 @@ __metadata: bcryptjs: 2.4.3 formik: 2.4.0 grant-koa: 5.4.8 - history: ^4.9.0 immer: 9.0.19 jsonwebtoken: 9.0.0 jwk-to-pem: 2.0.5 From 90694bdfbeaf56554a2dfb433f924c6373a6694d Mon Sep 17 00:00:00 2001 From: Christian Capeans Date: Mon, 19 Jun 2023 11:53:24 +0200 Subject: [PATCH 159/172] Remove didReceiveAPIRequest event --- packages/core/admin/server/strategies/api-token.js | 9 +-------- .../server/strategies/users-permissions.js | 9 +-------- 2 files changed, 2 insertions(+), 16 deletions(-) diff --git a/packages/core/admin/server/strategies/api-token.js b/packages/core/admin/server/strategies/api-token.js index 60cea02b8a..1c2c586be7 100644 --- a/packages/core/admin/server/strategies/api-token.js +++ b/packages/core/admin/server/strategies/api-token.js @@ -1,6 +1,6 @@ 'use strict'; -const { castArray, isNil, isEmpty } = require('lodash/fp'); +const { castArray, isNil } = require('lodash/fp'); const { UnauthorizedError, ForbiddenError } = require('@strapi/utils').errors; const constants = require('../services/constants'); const { getService } = require('../utils'); @@ -78,13 +78,6 @@ const authenticate = async (ctx) => { const verify = (auth, config) => { const { credentials: apiToken, ability } = auth; - strapi.telemetry.send('didReceiveAPIRequest', { - eventProperties: { - authenticationMethod: auth?.strategy?.name || 'api-token', - isAuthenticated: !isEmpty(apiToken), - }, - }); - if (!apiToken) { throw new UnauthorizedError('Token not found'); } diff --git a/packages/plugins/users-permissions/server/strategies/users-permissions.js b/packages/plugins/users-permissions/server/strategies/users-permissions.js index a303cc9a32..7ff3421c9a 100644 --- a/packages/plugins/users-permissions/server/strategies/users-permissions.js +++ b/packages/plugins/users-permissions/server/strategies/users-permissions.js @@ -1,6 +1,6 @@ 'use strict'; -const { castArray, map, every, pipe, isEmpty } = require('lodash/fp'); +const { castArray, map, every, pipe } = require('lodash/fp'); const { ForbiddenError, UnauthorizedError } = require('@strapi/utils').errors; const { getService } = require('../utils'); @@ -80,13 +80,6 @@ const authenticate = async (ctx) => { const verify = async (auth, config) => { const { credentials: user, ability } = auth; - strapi.telemetry.send('didReceiveAPIRequest', { - eventProperties: { - authenticationMethod: auth?.strategy?.name, - isAuthenticated: !isEmpty(user), - }, - }); - if (!config.scope) { if (!user) { // A non authenticated user cannot access routes that do not have a scope From 049059c800b9561ccc06a331aed0208db7259db5 Mon Sep 17 00:00:00 2001 From: Jamie Howard Date: Mon, 19 Jun 2023 11:23:09 +0100 Subject: [PATCH 160/172] chore: refactor how we get the previous stage --- .../entity-service-decorator.js | 34 ++++++++++++------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/packages/core/admin/ee/server/services/review-workflows/entity-service-decorator.js b/packages/core/admin/ee/server/services/review-workflows/entity-service-decorator.js index 82dc46ba5f..e15f7cf014 100644 --- a/packages/core/admin/ee/server/services/review-workflows/entity-service-decorator.js +++ b/packages/core/admin/ee/server/services/review-workflows/entity-service-decorator.js @@ -18,6 +18,19 @@ const getDataWithStage = async (data) => { return data; }; +const getEntityStage = async (uid, id) => { + const entity = await strapi.entityService.findOne(uid, id, { + populate: { + [ENTITY_STAGE_ATTRIBUTE]: { + populate: { + workflow: true, + }, + }, + }, + }); + return entity?.[ENTITY_STAGE_ATTRIBUTE] ?? null; +}; + /** * Decorates the entity service with RW business logic * @param {object} service - entity service @@ -47,25 +60,20 @@ const decorator = (service) => ({ return service.update.call(this, uid, entityId, { ...opts, data }); } - const entity = await service.findOne.call(this, uid, entityId, { - populate: { - [ENTITY_STAGE_ATTRIBUTE]: { - populate: { - workflow: true, - }, - }, - }, - }); - const previousStageId = entity?.[ENTITY_STAGE_ATTRIBUTE]?.id ?? null; + const previousStage = await getEntityStage(uid, entityId); const updatedEntity = await service.update.call(this, uid, entityId, { ...opts, data }); - if (previousStageId && previousStageId !== data[ENTITY_STAGE_ATTRIBUTE]) { + if ( + previousStage?.workflow?.id && + previousStage?.id && + previousStage.id !== data[ENTITY_STAGE_ATTRIBUTE] + ) { const webhookPayload = { entityId, workflow: { - id: entity[ENTITY_STAGE_ATTRIBUTE].workflow.id, + id: previousStage.workflow.id, stages: { - from: previousStageId, + from: previousStage.id, to: data[ENTITY_STAGE_ATTRIBUTE], }, }, From c3876eb9c174017c2b55ce2d142ea1b652383d1b Mon Sep 17 00:00:00 2001 From: Jamie Howard Date: Mon, 19 Jun 2023 11:27:45 +0100 Subject: [PATCH 161/172] chore: cleanup --- .../review-workflows/entity-service-decorator.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/core/admin/ee/server/services/review-workflows/entity-service-decorator.js b/packages/core/admin/ee/server/services/review-workflows/entity-service-decorator.js index e15f7cf014..9ec3f292f8 100644 --- a/packages/core/admin/ee/server/services/review-workflows/entity-service-decorator.js +++ b/packages/core/admin/ee/server/services/review-workflows/entity-service-decorator.js @@ -18,6 +18,12 @@ const getDataWithStage = async (data) => { return data; }; +/** + * Get the stage information of an entity + * @param {String} uid + * @param {Number} id + * @returns {Object} + */ const getEntityStage = async (uid, id) => { const entity = await strapi.entityService.findOne(uid, id, { populate: { @@ -28,7 +34,7 @@ const getEntityStage = async (uid, id) => { }, }, }); - return entity?.[ENTITY_STAGE_ATTRIBUTE] ?? null; + return entity?.[ENTITY_STAGE_ATTRIBUTE] ?? {}; }; /** @@ -60,9 +66,8 @@ const decorator = (service) => ({ return service.update.call(this, uid, entityId, { ...opts, data }); } - const previousStage = await getEntityStage(uid, entityId); - const updatedEntity = await service.update.call(this, uid, entityId, { ...opts, data }); + const previousStage = await getEntityStage(uid, entityId); if ( previousStage?.workflow?.id && previousStage?.id && From fceac49066c89d1135faa9cc08bebd375a750f71 Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Mon, 19 Jun 2023 12:34:24 +0200 Subject: [PATCH 162/172] fix: count relations when webhook populate is disabled --- packages/core/content-manager/server/services/entity-manager.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/content-manager/server/services/entity-manager.js b/packages/core/content-manager/server/services/entity-manager.js index 56d84373b6..327a24c2d8 100644 --- a/packages/core/content-manager/server/services/entity-manager.js +++ b/packages/core/content-manager/server/services/entity-manager.js @@ -36,7 +36,7 @@ const buildDeepPopulate = (uid) => { // They will be transformed into counts later if this is set to true. return getService('populate-builder')(uid) .populateDeep(Infinity) - .countRelationsIf(isWebhooksPopulateRelationsEnabled(uid)) + .countRelationsIf(!isWebhooksPopulateRelationsEnabled(uid)) .build(); }; From 6e01780a75a24b4614bdfc9526ded3422a9335e3 Mon Sep 17 00:00:00 2001 From: Gustav Hansen Date: Mon, 19 Jun 2023 12:57:14 +0200 Subject: [PATCH 163/172] Fix: Improve default value --- packages/core/admin/admin/src/pages/AuthPage/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/admin/admin/src/pages/AuthPage/index.js b/packages/core/admin/admin/src/pages/AuthPage/index.js index cdcc1e9618..a49c60ed87 100644 --- a/packages/core/admin/admin/src/pages/AuthPage/index.js +++ b/packages/core/admin/admin/src/pages/AuthPage/index.js @@ -40,7 +40,7 @@ const AuthPage = ({ hasAdmin, setHasAdmin }) => { }; }, - defaultValue: {}, + defaultValue: FORMS, } ); const [{ formErrors, modifiedData, requestError }, dispatch] = useReducer( From 02b50ff7300ed0848368f9451a981caaa404f792 Mon Sep 17 00:00:00 2001 From: Jamie Howard Date: Mon, 19 Jun 2023 14:47:44 +0100 Subject: [PATCH 164/172] chore: cleanup --- .../services/review-workflows/entity-service-decorator.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/core/admin/ee/server/services/review-workflows/entity-service-decorator.js b/packages/core/admin/ee/server/services/review-workflows/entity-service-decorator.js index 9ec3f292f8..3cde80f9cb 100644 --- a/packages/core/admin/ee/server/services/review-workflows/entity-service-decorator.js +++ b/packages/core/admin/ee/server/services/review-workflows/entity-service-decorator.js @@ -66,8 +66,9 @@ const decorator = (service) => ({ return service.update.call(this, uid, entityId, { ...opts, data }); } - const updatedEntity = await service.update.call(this, uid, entityId, { ...opts, data }); const previousStage = await getEntityStage(uid, entityId); + + const updatedEntity = await service.update.call(this, uid, entityId, { ...opts, data }); if ( previousStage?.workflow?.id && previousStage?.id && From 8d43691685e2cc9341ebec334137ee0a0f90df47 Mon Sep 17 00:00:00 2001 From: Jamie Howard Date: Mon, 19 Jun 2023 15:03:32 +0100 Subject: [PATCH 165/172] fix(Settings): detect is webhook form is dirty --- .../Webhooks/EditView/components/WebhookForm/index.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/WebhookForm/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/WebhookForm/index.js index 466dbba526..c55aeba1e5 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/WebhookForm/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/WebhookForm/index.js @@ -53,7 +53,12 @@ const WebhookForm = ({ headers: mapHeaders(data?.headers || {}), events: data?.events || [], }, - onSubmit: handleSubmit, + onSubmit(values, { resetForm, setSubmitting }) { + handleSubmit(values); + + resetForm({ values }); + setSubmitting(false); + }, validationSchema: makeWebhookValidationSchema({ formatMessage }), validateOnChange: false, validateOnBlur: false, From e6846cec3126700890f186315ecbe12456f6812e Mon Sep 17 00:00:00 2001 From: Jamie Howard Date: Mon, 19 Jun 2023 15:07:31 +0100 Subject: [PATCH 166/172] test(Settings): expect webhook save button to be disabled --- .../EditView/components/WebhookForm/tests/index.test.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/WebhookForm/tests/index.test.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/WebhookForm/tests/index.test.js index cf453e09b7..bbf569625d 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/WebhookForm/tests/index.test.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/WebhookForm/tests/index.test.js @@ -78,7 +78,8 @@ describe('Create Webhook', () => { fireEvent.change(screen.getByLabelText(/url/i), { target: { value: 'https://google.fr' } }); fireEvent.click(screen.getByRole('checkbox', { name: /entry.create/i })); - fireEvent.click(screen.getByRole('button', { name: /Save/i })); + const saveButton = screen.getByRole('button', { name: /Save/i }); + fireEvent.click(saveButton); await waitFor(() => { expect(handleSubmit).toHaveBeenCalledTimes(1); @@ -88,6 +89,7 @@ describe('Create Webhook', () => { events: ['entry.create'], headers: [{ key: '', value: '' }], }); + expect(saveButton).toHaveAttribute('aria-disabled', 'true'); }); }); }); From 34483f58ea181785b2a7453d8ec423ca0ad30105 Mon Sep 17 00:00:00 2001 From: Jamie Howard Date: Mon, 19 Jun 2023 15:15:05 +0100 Subject: [PATCH 167/172] test(ee): fix tests --- .../__tests__/entity-service-decorator.test.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/core/admin/ee/server/services/review-workflows/__tests__/entity-service-decorator.test.js b/packages/core/admin/ee/server/services/review-workflows/__tests__/entity-service-decorator.test.js index 82dab1b93d..3edf02f50e 100644 --- a/packages/core/admin/ee/server/services/review-workflows/__tests__/entity-service-decorator.test.js +++ b/packages/core/admin/ee/server/services/review-workflows/__tests__/entity-service-decorator.test.js @@ -108,12 +108,18 @@ describe('Entity service decorator', () => { const defaultService = { update: jest.fn(() => Promise.resolve(entry)), - findOne: jest.fn(() => { - return { strapi_reviewWorkflows_stage: { id: 2, workflow: { id: 1 } } }; - }), emitEvent: jest.fn(), }; + global.strapi = { + ...global.strapi, + entityService: { + findOne: jest.fn(() => { + return { strapi_reviewWorkflows_stage: { id: 2, workflow: { id: 1 } } }; + }), + }, + }; + const service = decorator(defaultService); const id = 1; From 8133fc4384903840ceea24e66a8b1f3b1bd5e5bc Mon Sep 17 00:00:00 2001 From: Jamie Howard Date: Mon, 19 Jun 2023 15:22:15 +0100 Subject: [PATCH 168/172] test(Webhooks/EditView) --- .../EditView/components/WebhookForm/tests/index.test.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/WebhookForm/tests/index.test.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/WebhookForm/tests/index.test.js index bbf569625d..8ccda0e3cb 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/WebhookForm/tests/index.test.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/WebhookForm/tests/index.test.js @@ -89,7 +89,8 @@ describe('Create Webhook', () => { events: ['entry.create'], headers: [{ key: '', value: '' }], }); - expect(saveButton).toHaveAttribute('aria-disabled', 'true'); }); + + expect(saveButton).toHaveAttribute('aria-disabled', 'true'); }); }); From b9a173fce811f8fb2b575e44586d94c7b4306442 Mon Sep 17 00:00:00 2001 From: Jamie Howard Date: Mon, 19 Jun 2023 16:37:20 +0100 Subject: [PATCH 169/172] fix(ee): use entity service directly for emit event calls --- .../entity-service-decorator.test.js | 24 +++++++++++-------- .../entity-service-decorator.js | 2 +- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/packages/core/admin/ee/server/services/review-workflows/__tests__/entity-service-decorator.test.js b/packages/core/admin/ee/server/services/review-workflows/__tests__/entity-service-decorator.test.js index 3edf02f50e..d431420a65 100644 --- a/packages/core/admin/ee/server/services/review-workflows/__tests__/entity-service-decorator.test.js +++ b/packages/core/admin/ee/server/services/review-workflows/__tests__/entity-service-decorator.test.js @@ -108,7 +108,6 @@ describe('Entity service decorator', () => { const defaultService = { update: jest.fn(() => Promise.resolve(entry)), - emitEvent: jest.fn(), }; global.strapi = { @@ -117,6 +116,7 @@ describe('Entity service decorator', () => { findOne: jest.fn(() => { return { strapi_reviewWorkflows_stage: { id: 2, workflow: { id: 1 } } }; }), + emitEvent: jest.fn(), }, }; @@ -126,16 +126,20 @@ describe('Entity service decorator', () => { const input = { data: { title: 'title ', strapi_reviewWorkflows_stage: 1 } }; await service.update(uid, id, input); - expect(defaultService.emitEvent).toHaveBeenCalledWith(uid, WORKFLOW_UPDATE_STAGE, { - entityId: 1, - workflow: { - id: 1, - stages: { - from: 2, - to: 1, + expect(global.strapi.entityService.emitEvent).toHaveBeenCalledWith( + uid, + WORKFLOW_UPDATE_STAGE, + { + entityId: 1, + workflow: { + id: 1, + stages: { + from: 2, + to: 1, + }, }, - }, - }); + } + ); expect(defaultService.update).toHaveBeenCalledWith(uid, id, { ...input, diff --git a/packages/core/admin/ee/server/services/review-workflows/entity-service-decorator.js b/packages/core/admin/ee/server/services/review-workflows/entity-service-decorator.js index 3cde80f9cb..4841f7b217 100644 --- a/packages/core/admin/ee/server/services/review-workflows/entity-service-decorator.js +++ b/packages/core/admin/ee/server/services/review-workflows/entity-service-decorator.js @@ -84,7 +84,7 @@ const decorator = (service) => ({ }, }, }; - await service.emitEvent.call(this, uid, WORKFLOW_UPDATE_STAGE, webhookPayload); + await strapi.entityService.emitEvent(uid, WORKFLOW_UPDATE_STAGE, webhookPayload); } return updatedEntity; From b5d4687c575aa13596fc257be84df04cd63ef04c Mon Sep 17 00:00:00 2001 From: Mark Kaylor Date: Mon, 19 Jun 2023 17:39:31 +0200 Subject: [PATCH 170/172] Maintain consistent backend validation for publish and bulk publish --- packages/core/content-manager/server/services/entity-manager.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/content-manager/server/services/entity-manager.js b/packages/core/content-manager/server/services/entity-manager.js index 327a24c2d8..6c45b16e30 100644 --- a/packages/core/content-manager/server/services/entity-manager.js +++ b/packages/core/content-manager/server/services/entity-manager.js @@ -186,7 +186,7 @@ module.exports = ({ strapi }) => ({ return strapi.entityValidator.validateEntityCreation( strapi.getModel(uid), entity, - { isDraft: true }, + undefined, entity ); }) From 528b45125771256234ff3ab51e91d62c0354a8d2 Mon Sep 17 00:00:00 2001 From: Gustav Hansen Date: Tue, 20 Jun 2023 13:15:59 +0200 Subject: [PATCH 171/172] Chore: Move plugin permissions into constants --- .../src/{permissions.js => constants.js} | 4 +- .../content-type-builder/admin/src/index.js | 4 +- .../admin/src/pages/App/index.js | 4 +- .../src/{permissions.js => constants.js} | 4 +- packages/core/email/admin/src/index.js | 4 +- .../email/admin/src/pages/Settings/index.js | 4 +- packages/core/upload/admin/src/constants.js | 40 ++++++++++++++++++ .../src/hooks/useMediaLibraryPermissions.js | 4 +- packages/core/upload/admin/src/index.js | 6 +-- .../admin/src/pages/App/MediaLibrary/index.js | 5 +-- .../admin/src/pages/SettingsPage/index.js | 4 +- packages/core/upload/admin/src/permissions.js | 41 ------------------- .../src/{permissions.js => constants.js} | 4 +- .../plugins/documentation/admin/src/index.js | 6 +-- .../admin/src/pages/PluginPage/index.js | 8 ++-- .../admin/src/pages/SettingsPage/index.js | 4 +- .../src/{permissions.js => constants.js} | 4 +- packages/plugins/i18n/admin/src/index.js | 4 +- .../admin/src/pages/SettingsPage/index.js | 4 +- .../src/{permissions.js => constants.js} | 4 +- .../users-permissions/admin/src/index.js | 10 ++--- .../admin/src/pages/AdvancedSettings/index.js | 9 ++-- .../admin/src/pages/EmailTemplates/index.js | 6 +-- .../admin/src/pages/Providers/index.js | 6 +-- .../admin/src/pages/Roles/ListPage/index.js | 14 +++---- .../src/pages/Roles/ProtectedCreatePage.js | 4 +- .../src/pages/Roles/ProtectedEditPage.js | 4 +- .../src/pages/Roles/ProtectedListPage.js | 4 +- .../admin/src/pages/Roles/index.js | 4 +- 29 files changed, 104 insertions(+), 119 deletions(-) rename packages/core/content-type-builder/admin/src/{permissions.js => constants.js} (84%) rename packages/core/email/admin/src/{permissions.js => constants.js} (84%) delete mode 100644 packages/core/upload/admin/src/permissions.js rename packages/plugins/documentation/admin/src/{permissions.js => constants.js} (92%) rename packages/plugins/i18n/admin/src/{permissions.js => constants.js} (85%) rename packages/plugins/users-permissions/admin/src/{permissions.js => constants.js} (95%) diff --git a/packages/core/content-type-builder/admin/src/permissions.js b/packages/core/content-type-builder/admin/src/constants.js similarity index 84% rename from packages/core/content-type-builder/admin/src/permissions.js rename to packages/core/content-type-builder/admin/src/constants.js index 5d5e1cc557..85e1759a16 100644 --- a/packages/core/content-type-builder/admin/src/permissions.js +++ b/packages/core/content-type-builder/admin/src/constants.js @@ -1,9 +1,7 @@ -const pluginPermissions = { +export const PERMISSIONS = { // This permission regards the main component (App) and is used to tell // If the plugin link should be displayed in the menu // And also if the plugin is accessible. This use case is found when a user types the url of the // plugin directly in the browser main: [{ action: 'plugin::content-type-builder.read', subject: null }], }; - -export default pluginPermissions; diff --git a/packages/core/content-type-builder/admin/src/index.js b/packages/core/content-type-builder/admin/src/index.js index b2bd0f173a..d48bc5f56d 100644 --- a/packages/core/content-type-builder/admin/src/index.js +++ b/packages/core/content-type-builder/admin/src/index.js @@ -3,7 +3,7 @@ import { prefixPluginTranslations } from '@strapi/helper-plugin'; import pluginPkg from '../../package.json'; import PluginIcon from './components/PluginIcon'; -import pluginPermissions from './permissions'; +import { PERMISSIONS } from './constants'; import pluginId from './pluginId'; import reducers from './reducers'; import formsAPI from './utils/formAPI'; @@ -21,7 +21,7 @@ export default { id: `${pluginId}.plugin.name`, defaultMessage: 'Content Types Builder', }, - permissions: pluginPermissions.main, + permissions: PERMISSIONS.main, async Component() { const component = await import( /* webpackChunkName: "content-type-builder" */ './pages/App' diff --git a/packages/core/content-type-builder/admin/src/pages/App/index.js b/packages/core/content-type-builder/admin/src/pages/App/index.js index d8289e205e..86cc549fb1 100644 --- a/packages/core/content-type-builder/admin/src/pages/App/index.js +++ b/packages/core/content-type-builder/admin/src/pages/App/index.js @@ -15,7 +15,7 @@ import { Route, Switch } from 'react-router-dom'; import ContentTypeBuilderNav from '../../components/ContentTypeBuilderNav'; import DataManagerProvider from '../../components/DataManagerProvider'; import FormModalNavigationProvider from '../../components/FormModalNavigationProvider'; -import pluginPermissions from '../../permissions'; +import { PERMISSIONS } from '../../constants'; import pluginId from '../../pluginId'; import RecursivePath from '../RecursivePath'; @@ -39,7 +39,7 @@ const App = () => { }, []); return ( - + diff --git a/packages/core/email/admin/src/permissions.js b/packages/core/email/admin/src/constants.js similarity index 84% rename from packages/core/email/admin/src/permissions.js rename to packages/core/email/admin/src/constants.js index 1ec296091b..a4b7e76629 100644 --- a/packages/core/email/admin/src/permissions.js +++ b/packages/core/email/admin/src/constants.js @@ -1,9 +1,7 @@ -const pluginPermissions = { +export const PERMISSIONS = { // This permission regards the main component (App) and is used to tell // If the plugin link should be displayed in the menu // And also if the plugin is accessible. This use case is found when a user types the url of the // plugin directly in the browser settings: [{ action: 'plugin::email.settings.read', subject: null }], }; - -export default pluginPermissions; diff --git a/packages/core/email/admin/src/index.js b/packages/core/email/admin/src/index.js index eac130f8a8..ca1537ae25 100644 --- a/packages/core/email/admin/src/index.js +++ b/packages/core/email/admin/src/index.js @@ -9,7 +9,7 @@ import { prefixPluginTranslations } from '@strapi/helper-plugin'; import pluginPkg from '../../package.json'; -import pluginPermissions from './permissions'; +import { PERMISSIONS } from './constants'; import pluginId from './pluginId'; import getTrad from './utils/getTrad'; @@ -38,7 +38,7 @@ export default { return component; }, - permissions: pluginPermissions.settings, + permissions: PERMISSIONS.settings, }, ] ); diff --git a/packages/core/email/admin/src/pages/Settings/index.js b/packages/core/email/admin/src/pages/Settings/index.js index d31b3e5391..cbcc205bc5 100644 --- a/packages/core/email/admin/src/pages/Settings/index.js +++ b/packages/core/email/admin/src/pages/Settings/index.js @@ -23,7 +23,7 @@ import { import { Envelop } from '@strapi/icons'; import { useIntl } from 'react-intl'; -import pluginPermissions from '../../permissions'; +import { PERMISSIONS } from '../../constants'; import getTrad from '../../utils/getTrad'; import schema from '../../utils/schema'; @@ -32,7 +32,7 @@ import EmailHeader from './components/EmailHeader'; import { fetchEmailSettings, postEmailTest } from './utils/api'; const ProtectedSettingsPage = () => ( - + ); diff --git a/packages/core/upload/admin/src/constants.js b/packages/core/upload/admin/src/constants.js index d281ac9a74..0143624087 100644 --- a/packages/core/upload/admin/src/constants.js +++ b/packages/core/upload/admin/src/constants.js @@ -174,3 +174,43 @@ export const localStorageKeys = { modalView: `STRAPI_UPLOAD_MODAL_VIEW`, view: `STRAPI_UPLOAD_LIBRARY_VIEW`, }; + +export const PERMISSIONS = { + // This permission regards the main component (App) and is used to tell + // If the plugin link should be displayed in the menu + // And also if the plugin is accessible. This use case is found when a user types the url of the + // plugin directly in the browser + main: [ + { action: 'plugin::upload.read', subject: null }, + { + action: 'plugin::upload.assets.create', + subject: null, + }, + { + action: 'plugin::upload.assets.update', + subject: null, + }, + ], + copyLink: [ + { + action: 'plugin::upload.assets.copy-link', + subject: null, + }, + ], + create: [ + { + action: 'plugin::upload.assets.create', + subject: null, + }, + ], + download: [ + { + action: 'plugin::upload.assets.download', + subject: null, + }, + ], + read: [{ action: 'plugin::upload.read', subject: null }], + configureView: [{ action: 'plugin::upload.configure-view', subject: null }], + settings: [{ action: 'plugin::upload.settings.read', subject: null }], + update: [{ action: 'plugin::upload.assets.update', subject: null, fields: null }], +}; diff --git a/packages/core/upload/admin/src/hooks/useMediaLibraryPermissions.js b/packages/core/upload/admin/src/hooks/useMediaLibraryPermissions.js index 8a3acb2e24..1b17e4205b 100644 --- a/packages/core/upload/admin/src/hooks/useMediaLibraryPermissions.js +++ b/packages/core/upload/admin/src/hooks/useMediaLibraryPermissions.js @@ -3,10 +3,10 @@ import { useMemo } from 'react'; import { useRBAC } from '@strapi/helper-plugin'; import omit from 'lodash/omit'; -import pluginPermissions from '../permissions'; +import { PERMISSIONS } from '../constants'; export const useMediaLibraryPermissions = () => { - const permissions = useMemo(() => omit(pluginPermissions, 'main'), []); + const permissions = useMemo(() => omit(PERMISSIONS, 'main'), []); const { allowedActions, isLoading } = useRBAC(permissions); return { ...allowedActions, isLoading }; diff --git a/packages/core/upload/admin/src/index.js b/packages/core/upload/admin/src/index.js index 38de6efbb3..5c54a2b8ff 100644 --- a/packages/core/upload/admin/src/index.js +++ b/packages/core/upload/admin/src/index.js @@ -11,7 +11,7 @@ import pluginPkg from '../../package.json'; import { MediaLibraryDialog } from './components/MediaLibraryDialog'; import { MediaLibraryInput } from './components/MediaLibraryInput'; import PluginIcon from './components/PluginIcon'; -import pluginPermissions from './permissions'; +import { PERMISSIONS } from './constants'; import pluginId from './pluginId'; import getTrad from './utils/getTrad'; @@ -26,7 +26,7 @@ export default { id: `${pluginId}.plugin.name`, defaultMessage: 'Media Library', }, - permissions: pluginPermissions.main, + permissions: PERMISSIONS.main, async Component() { const component = await import(/* webpackChunkName: "upload" */ './pages/App'); @@ -57,7 +57,7 @@ export default { return component; }, - permissions: pluginPermissions.settings, + permissions: PERMISSIONS.settings, }); }, async registerTrads({ locales }) { diff --git a/packages/core/upload/admin/src/pages/App/MediaLibrary/index.js b/packages/core/upload/admin/src/pages/App/MediaLibrary/index.js index 857ecd6d00..001b937efe 100644 --- a/packages/core/upload/admin/src/pages/App/MediaLibrary/index.js +++ b/packages/core/upload/admin/src/pages/App/MediaLibrary/index.js @@ -45,12 +45,11 @@ import { PaginationFooter } from '../../../components/PaginationFooter'; import SortPicker from '../../../components/SortPicker'; import { TableList } from '../../../components/TableList'; import { UploadAssetDialog } from '../../../components/UploadAssetDialog/UploadAssetDialog'; -import { localStorageKeys, viewOptions } from '../../../constants'; +import { localStorageKeys, PERMISSIONS, viewOptions } from '../../../constants'; import { useAssets } from '../../../hooks/useAssets'; import { useFolder } from '../../../hooks/useFolder'; import { useFolders } from '../../../hooks/useFolders'; import { useMediaLibraryPermissions } from '../../../hooks/useMediaLibraryPermissions'; -import pluginPermissions from '../../../permissions'; import { containsAssetFilter, getBreadcrumbDataML, getFolderURL, getTrad } from '../../../utils'; import { BulkActions } from './components/BulkActions'; @@ -257,7 +256,7 @@ export const MediaLibrary = () => { } endActions={ <> - + { }; const ProtectedSettingsPage = () => ( - + ); diff --git a/packages/core/upload/admin/src/permissions.js b/packages/core/upload/admin/src/permissions.js deleted file mode 100644 index 535a032e1d..0000000000 --- a/packages/core/upload/admin/src/permissions.js +++ /dev/null @@ -1,41 +0,0 @@ -const pluginPermissions = { - // This permission regards the main component (App) and is used to tell - // If the plugin link should be displayed in the menu - // And also if the plugin is accessible. This use case is found when a user types the url of the - // plugin directly in the browser - main: [ - { action: 'plugin::upload.read', subject: null }, - { - action: 'plugin::upload.assets.create', - subject: null, - }, - { - action: 'plugin::upload.assets.update', - subject: null, - }, - ], - copyLink: [ - { - action: 'plugin::upload.assets.copy-link', - subject: null, - }, - ], - create: [ - { - action: 'plugin::upload.assets.create', - subject: null, - }, - ], - download: [ - { - action: 'plugin::upload.assets.download', - subject: null, - }, - ], - read: [{ action: 'plugin::upload.read', subject: null }], - configureView: [{ action: 'plugin::upload.configure-view', subject: null }], - settings: [{ action: 'plugin::upload.settings.read', subject: null }], - update: [{ action: 'plugin::upload.assets.update', subject: null, fields: null }], -}; - -export default pluginPermissions; diff --git a/packages/plugins/documentation/admin/src/permissions.js b/packages/plugins/documentation/admin/src/constants.js similarity index 92% rename from packages/plugins/documentation/admin/src/permissions.js rename to packages/plugins/documentation/admin/src/constants.js index ee866d8503..fb07ff7067 100644 --- a/packages/plugins/documentation/admin/src/permissions.js +++ b/packages/plugins/documentation/admin/src/constants.js @@ -1,4 +1,4 @@ -const pluginPermissions = { +export const PERMISSIONS = { // This permission regards the main component (App) and is used to tell // If the plugin link should be displayed in the menu // And also if the plugin is accessible. This use case is found when a user types the url of the @@ -15,5 +15,3 @@ const pluginPermissions = { regenerate: [{ action: 'plugin::documentation.settings.regenerate', subject: null }], update: [{ action: 'plugin::documentation.settings.update', subject: null }], }; - -export default pluginPermissions; diff --git a/packages/plugins/documentation/admin/src/index.js b/packages/plugins/documentation/admin/src/index.js index c2f6680ec8..3219922a1a 100644 --- a/packages/plugins/documentation/admin/src/index.js +++ b/packages/plugins/documentation/admin/src/index.js @@ -9,7 +9,7 @@ import { prefixPluginTranslations } from '@strapi/helper-plugin'; import pluginPkg from '../../package.json'; import PluginIcon from './components/PluginIcon'; -import pluginPermissions from './permissions'; +import { PERMISSIONS } from './constants'; import pluginId from './pluginId'; const name = pluginPkg.strapi.name; @@ -23,7 +23,7 @@ export default { id: `${pluginId}.plugin.name`, defaultMessage: 'Documentation', }, - permissions: pluginPermissions.main, + permissions: PERMISSIONS.main, async Component() { const component = await import( /* webpackChunkName: "documentation-page" */ './pages/PluginPage' @@ -53,7 +53,7 @@ export default { return component; }, - permissions: pluginPermissions.main, + permissions: PERMISSIONS.main, }); }, async registerTrads({ locales }) { diff --git a/packages/plugins/documentation/admin/src/pages/PluginPage/index.js b/packages/plugins/documentation/admin/src/pages/PluginPage/index.js index 82cdd17e83..4c1068af48 100755 --- a/packages/plugins/documentation/admin/src/pages/PluginPage/index.js +++ b/packages/plugins/documentation/admin/src/pages/PluginPage/index.js @@ -37,7 +37,7 @@ import { Eye as Show, Refresh as Reload, Trash } from '@strapi/icons'; import { Helmet } from 'react-helmet'; import { useIntl } from 'react-intl'; -import permissions from '../../permissions'; +import { PERMISSIONS } from '../../constants'; import { getTrad } from '../../utils'; import openWithNewTab from '../../utils/openWithNewTab'; import useReactQuery from '../utils/useReactQuery'; @@ -107,7 +107,7 @@ const PluginPage = () => { })} primaryAction={ // eslint-disable-next-line - +

& { __component: P } : never diff --git a/packages/core/strapi/lib/types/core/attributes/enumeration.d.ts b/packages/core/strapi/lib/types/core/attributes/enumeration.d.ts index 94c55e3500..ddcd236efb 100644 --- a/packages/core/strapi/lib/types/core/attributes/enumeration.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/enumeration.d.ts @@ -12,7 +12,7 @@ export type Enumeration = Attribute.Attribute<'enumerat Attribute.PrivateOption & Attribute.RequiredOption; -export type EnumerationValue = Utils.GetArrayValues; +export type EnumerationValue = Utils.Array.Values; export type GetEnumerationValue = T extends Enumeration ? EnumerationValue diff --git a/packages/core/strapi/lib/types/core/attributes/relation.d.ts b/packages/core/strapi/lib/types/core/attributes/relation.d.ts index 48a8ba4a9a..9b6a072b76 100644 --- a/packages/core/strapi/lib/types/core/attributes/relation.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/relation.d.ts @@ -19,7 +19,7 @@ export type BasicRelationProperties< target: T; } & R extends `morph${string}` ? { - morphBy?: Utils.KeysBy< + morphBy?: Utils.Object.KeysBy< Common.Schemas[T]['attributes'], Attribute.Relation >; @@ -41,7 +41,9 @@ export type Relation< // Properties (R extends BasicRelationsType ? BasicRelationProperties - : PolymorphicRelationProperties) & + : R extends PolymorphicRelationsType + ? PolymorphicRelationProperties + : {}) & // Options Attribute.ConfigurableOption & Attribute.PrivateOption; diff --git a/packages/core/strapi/lib/types/core/attributes/uid.d.ts b/packages/core/strapi/lib/types/core/attributes/uid.d.ts index 7536321777..b923ec14fc 100644 --- a/packages/core/strapi/lib/types/core/attributes/uid.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/uid.d.ts @@ -1,4 +1,4 @@ -import type { Attribute, Common } from '@strapi/strapi'; +import type { Attribute, Common, Utils } from '@strapi/strapi'; export interface UIDOptions { separator?: string; @@ -10,13 +10,18 @@ export interface UIDOptions { export interface UIDProperties< // Own Schema Reference - T extends Common.UID.Schema | undefined, + T extends Common.UID.Schema, // Target attribute - U extends T extends Common.UID.Schema ? Attribute.GetKeysByType : undefined, + U extends TargetAttributeByUID, // UID options S extends UIDOptions = UIDOptions > { - targetField: U extends undefined ? string | undefined : U; + targetField: U; + options: UIDOptions & S; +} + +export interface GenericUIDProperties { + targetField?: string; options: UIDOptions & S; } @@ -29,7 +34,7 @@ export type UID< S extends UIDOptions = UIDOptions > = Attribute.Attribute<'uid'> & // Properties - UIDProperties & + (T extends Common.UID.Schema ? UIDProperties : GenericUIDProperties) & // Options Attribute.ConfigurableOption & Attribute.DefaultOption & @@ -38,8 +43,8 @@ export type UID< Attribute.RequiredOption; type TargetAttributeByUID = T extends Common.UID.Schema - ? Attribute.GetKeysByType - : undefined; + ? Utils.Guard.Never, string> + : never; export type UIDValue = string; diff --git a/packages/core/strapi/lib/types/core/attributes/utils.d.ts b/packages/core/strapi/lib/types/core/attributes/utils.d.ts index 9184381ddf..2fe6a68851 100644 --- a/packages/core/strapi/lib/types/core/attributes/utils.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/utils.d.ts @@ -6,13 +6,13 @@ export type GetKeysByType< T extends Common.UID.Schema, U extends Attribute.Type, P = never -> = Utils.KeysBy, Attribute.Attribute & Utils.NeverGuard>; +> = Utils.Object.KeysBy, Attribute.Attribute & Utils.Guard.Never>; export type GetByType< T extends Common.UID.Schema, U extends Attribute.Type, P = never -> = Utils.PickBy, Attribute.Attribute & Utils.NeverGuard>; +> = Utils.Object.PickBy, Attribute.Attribute & Utils.Guard.Never>; export type Get> = Utils.Get, U>; @@ -60,7 +60,7 @@ export type GetValues = GetKey [key in GetOptionalKeys as key extends U ? key : never]?: GetValueByKey; }; -export type GetRequiredKeys = Utils.KeysBy< +export type GetRequiredKeys = Utils.Object.KeysBy< GetAll, { required: true } >; diff --git a/packages/core/strapi/lib/types/core/common/controller.d.ts b/packages/core/strapi/lib/types/core/common/controller.d.ts index 24b55beaf1..1fcdc96b2f 100644 --- a/packages/core/strapi/lib/types/core/common/controller.d.ts +++ b/packages/core/strapi/lib/types/core/common/controller.d.ts @@ -1,8 +1,8 @@ -import type koa from 'koa'; +import type { ExtendableContext, Next } from 'koa'; export type ControllerHandler = ( - context: koa.ExtendableContext, - next: koa.Next + context: ExtendableContext, + next: Next ) => Promise | T | void; export type Controller = Record; diff --git a/packages/core/strapi/lib/types/core/common/uid.d.ts b/packages/core/strapi/lib/types/core/common/uid.d.ts index adec2a2cb8..5ef444cc1b 100644 --- a/packages/core/strapi/lib/types/core/common/uid.d.ts +++ b/packages/core/strapi/lib/types/core/common/uid.d.ts @@ -17,11 +17,11 @@ export type Middleware = Registry.Keys; export type ContentType = Registry.Keys; export type CollectionType = Extract< - Utils.KeysBy, + Utils.Object.KeysBy, ContentType >; export type SingleType = Extract< - Utils.KeysBy, + Utils.Object.KeysBy, ContentType >; diff --git a/packages/core/strapi/lib/types/core/namespace.d.ts b/packages/core/strapi/lib/types/core/namespace.d.ts index 1f633ef262..c506eac2f7 100644 --- a/packages/core/strapi/lib/types/core/namespace.d.ts +++ b/packages/core/strapi/lib/types/core/namespace.d.ts @@ -67,7 +67,7 @@ export type GetSeparator = T extends Scoped * type T = WithSeparator | WithSeparator * // ^ 'admin::' | 'api::{string}.' */ -export type WithSeparator = Utils.Suffix>; +export type WithSeparator = Utils.String.Suffix>; /** * Represents namespaces composed of an origin and a name, separated by colons diff --git a/packages/core/strapi/lib/types/core/schemas/index.d.ts b/packages/core/strapi/lib/types/core/schemas/index.d.ts index c23e4cebf4..8e24b09065 100644 --- a/packages/core/strapi/lib/types/core/schemas/index.d.ts +++ b/packages/core/strapi/lib/types/core/schemas/index.d.ts @@ -78,7 +78,9 @@ export interface Info { /** * Low level data structure referencing every schema attribute and its name */ -export interface Attributes extends Utils.StringRecord {} +export interface Attributes { + [key: string]: Attribute.Any; +} /** * Structure containing every core schema options and their associated value diff --git a/packages/core/strapi/lib/types/core/strapi/index.d.ts b/packages/core/strapi/lib/types/core/strapi/index.d.ts index 2fc6e04aa8..6904ae16a2 100644 --- a/packages/core/strapi/lib/types/core/strapi/index.d.ts +++ b/packages/core/strapi/lib/types/core/strapi/index.d.ts @@ -1,7 +1,6 @@ -import type Koa from 'koa'; import { Database } from '@strapi/database'; -import type { StringMap } from './utils'; +import type { Shared } from '@strapi/strapi'; import type { GenericController } from '../../../core-api/controller'; import type { GenericService } from '../../../core-api/service'; @@ -21,7 +20,7 @@ interface CustomFieldServerOptions { * The existing Strapi data type the custom field uses */ type: string; - + /** * Settings for the input size in the Admin UI */ @@ -69,7 +68,7 @@ export interface Strapi { * * It returns all the registered services */ - readonly services: StringMap; + readonly services: Shared.Services; /** * Find a service using its unique identifier @@ -81,7 +80,7 @@ export interface Strapi { * * It returns all the registered controllers */ - readonly controllers: StringMap; + readonly controllers: Shared.Controllers; /** * Find a controller using its unique identifier diff --git a/packages/core/strapi/lib/types/core/uid.d.ts b/packages/core/strapi/lib/types/core/uid.d.ts index 9b308aaca9..ef4fe25823 100644 --- a/packages/core/strapi/lib/types/core/uid.d.ts +++ b/packages/core/strapi/lib/types/core/uid.d.ts @@ -1,7 +1,7 @@ import type * as Namespace from './namespace'; import type * as Utils from '../utils'; -type StringSuffix = Utils.Suffix; +type StringSuffix = Utils.String.Suffix; /** * Template for services' unique identifier diff --git a/packages/core/strapi/lib/types/utils.d.ts b/packages/core/strapi/lib/types/utils.d.ts deleted file mode 100644 index 44afa53f49..0000000000 --- a/packages/core/strapi/lib/types/utils.d.ts +++ /dev/null @@ -1,121 +0,0 @@ -/** - * - * Common utilities used across Strapi typings - * - * */ - -/** - * Alias for any literal type (useful for template string parameters) - */ -export type Literal = string | number | bigint | boolean; - -/** - * Used to check if a string includes a given literal - */ -export type Includes = `${string}${S}${string}`; - -/** - * Used to make sure the given string is not empty - */ -export type NonEmpty = T extends '' ? never : T; - -/** - * Split the given string into a tuple using the given `S` literal - */ -export type Split = T extends `${infer A}${S}${infer B}` - ? [A, ...Split] - : T extends '' - ? [] - : [T]; - -/** - * Aggregate the given tuple into a string, separated by the given `S` literal - */ -export type Join = T extends [ - infer F extends Literal, - ...infer R -] - ? R['length'] extends 0 - ? F - : `${F}${S}${Join}` - : never; - -/** - * Add a literal suffix (`S`) at the end of the given string - */ -export type Suffix = `${T}${S}`; - -/** - * Add a literal prefix (`S`) at the beginning of the given string - */ -export type Prefix = `${S}${T}`; - -/** - * - * Extract the array values into an union type - * - **/ -export type GetArrayValues> = T extends Array ? U : never; - -/** - * Creates a record where every key is a string and every value is `T` - */ -export type StringRecord = Record; - -/** - * Retrieve object's (`T`) keys if they extends the given `U` type. - * - * @example - * type X = KeysBy<{ foo: 'bar', bar: 'foo', foobar: 2 }, string> - * // 'foo' | 'bar' - * - * type Base = { x: 'foo' | 'bar' }; - * type Obj = { foo: { x: 'foo' }, bar: { x: 'bar' }, other: { x: '42' } }; - * type X = KeysBy - * // 'foo' | 'bar' - */ -export type KeysBy = { - [key in keyof T]: T[key] extends U ? key : never; -}[keyof T]; - -/** - * Retrieve object's (`T`) properties if their value extends the given `U` type. - * - * @example - * type X = KeysBy<{ foo: 'bar', bar: 'foo', foobar: 2 }, string> - * // { foo: 'bar', bar: 'foo' } - * - * type Base = { x: 'foo' | 'bar' }; - * type Obj = { foo: { x: 'foo' }, bar: { x: 'bar' }, other: { x: '42' } }; - * type X = KeysBy - * // { foo: { x: 'foo' }, bar: { x: 'bar' } } - */ -export type PickBy = Pick>; - -/** - * Assign a default value `U` to `T` if `T` is of type `never` - * - * @example - * type X = NeverGuard<{ foo: 'bar' }, string> - * // { foo: 'bar' } - * - * type X = NeverGuard - * // unknown - * - * type X = NeverGuard - * // string - */ -export type NeverGuard = [T] extends [never] ? U : T; - -/** - * Get the type of a specific key `U` in `T` - * - * @example - * - * type X = Get<{ foo: 'bar', 'bar': 'foo' }, 'foo'> - * // 'bar' - * - * type X = Get<{ foo: 'bar', 'bar': 'foo' }, 'bar'> - * // 'foo' - */ -export type Get = T[U]; diff --git a/packages/core/strapi/lib/types/utils/array.d.ts b/packages/core/strapi/lib/types/utils/array.d.ts new file mode 100644 index 0000000000..05227aac62 --- /dev/null +++ b/packages/core/strapi/lib/types/utils/array.d.ts @@ -0,0 +1,6 @@ +/** + * + * Extract the array values into an union type + * + **/ +export type Values> = T extends Array ? U : never; diff --git a/packages/core/strapi/lib/types/utils/guard.d.ts b/packages/core/strapi/lib/types/utils/guard.d.ts new file mode 100644 index 0000000000..a2440defee --- /dev/null +++ b/packages/core/strapi/lib/types/utils/guard.d.ts @@ -0,0 +1,14 @@ +/** + * Assign a default value `U` to `T` if `T` is of type `never` + * + * @example + * type X = Never<{ foo: 'bar' }, string> + * // { foo: 'bar' } + * + * type X = Never + * // unknown + * + * type X = Never + * // string + */ +export type Never = [T] extends [never] ? U : T; diff --git a/packages/core/strapi/lib/types/utils/index.d.ts b/packages/core/strapi/lib/types/utils/index.d.ts new file mode 100644 index 0000000000..c98b194ada --- /dev/null +++ b/packages/core/strapi/lib/types/utils/index.d.ts @@ -0,0 +1,18 @@ +export * as Array from './array'; +export * as Guard from './guard'; +export * as Object from './object'; +export * as String from './string'; +export * as Tuple from './tuple'; + +/** + * Get the type of a specific key `U` in `T` + * + * @example + * + * type X = Get<{ foo: 'bar', 'bar': 'foo' }, 'foo'> + * // 'bar' + * + * type X = Get<{ foo: 'bar', 'bar': 'foo' }, 'bar'> + * // 'foo' + */ +export type Get = T[U]; diff --git a/packages/core/strapi/lib/types/utils/object.d.ts b/packages/core/strapi/lib/types/utils/object.d.ts new file mode 100644 index 0000000000..a1c43664d2 --- /dev/null +++ b/packages/core/strapi/lib/types/utils/object.d.ts @@ -0,0 +1,29 @@ +/** + * Retrieve object's (`T`) keys if they extends the given `U` type. + * + * @example + * type X = KeysBy<{ foo: 'bar', bar: 'foo', foobar: 2 }, string> + * // 'foo' | 'bar' + * + * type Base = { x: 'foo' | 'bar' }; + * type Obj = { foo: { x: 'foo' }, bar: { x: 'bar' }, other: { x: '42' } }; + * type X = KeysBy + * // 'foo' | 'bar' + */ +export type KeysBy = { + [key in keyof T]: T[key] extends U ? key : never; +}[keyof T]; + +/** + * Retrieve object's (`T`) properties if their value extends the given `U` type. + * + * @example + * type X = KeysBy<{ foo: 'bar', bar: 'foo', foobar: 2 }, string> + * // { foo: 'bar', bar: 'foo' } + * + * type Base = { x: 'foo' | 'bar' }; + * type Obj = { foo: { x: 'foo' }, bar: { x: 'bar' }, other: { x: '42' } }; + * type X = KeysBy + * // { foo: { x: 'foo' }, bar: { x: 'bar' } } + */ +export type PickBy = Pick>; diff --git a/packages/core/strapi/lib/types/utils/string.d.ts b/packages/core/strapi/lib/types/utils/string.d.ts new file mode 100644 index 0000000000..3b17f57139 --- /dev/null +++ b/packages/core/strapi/lib/types/utils/string.d.ts @@ -0,0 +1,38 @@ +/** + * Alias for any literal type (useful for template string parameters) + */ +export type Literal = string | number | bigint | boolean; + +/** + * Used to check if a string includes a given literal + */ +export type Includes = `${string}${S}${string}`; + +/** + * Used to make sure the given string is not empty + */ +export type NonEmpty = T extends '' ? never : T; + +/** + * Split the given string into a tuple using the given `S` literal + */ +export type Split = T extends `${infer A}${S}${infer B}` + ? [A, ...Split] + : T extends '' + ? [] + : [T]; + +/** + * Add a literal suffix (`S`) at the end of the given string + */ +export type Suffix = `${T}${S}`; + +/** + * Add a literal prefix (`S`) at the beginning of the given string + */ +export type Prefix = `${S}${T}`; + +/** + * Creates a record where every key is a string and every value is `T` + */ +export type Dict = Record; diff --git a/packages/core/strapi/lib/types/utils/tuple.d.ts b/packages/core/strapi/lib/types/utils/tuple.d.ts new file mode 100644 index 0000000000..8fdf356b2e --- /dev/null +++ b/packages/core/strapi/lib/types/utils/tuple.d.ts @@ -0,0 +1,13 @@ +import type { Literal } from './string'; + +/** + * Aggregate the given tuple into a string, separated by the given `S` literal + */ +export type Join = T extends [ + infer F extends Literal, + ...infer R +] + ? R['length'] extends 0 + ? F + : `${F}${S}${Join}` + : never; From 9a7bef24bf16d1d51fd4162266dc97f931145839 Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Fri, 26 May 2023 17:26:55 +0200 Subject: [PATCH 064/172] chore: PR proposed changes --- .../server/controllers/collection-types.js | 25 ++++--- .../server/controllers/relations.js | 9 ++- .../server/controllers/single-types.js | 3 +- .../server/services/entity-manager.js | 18 ++--- .../content-manager/server/services/index.js | 2 + .../builder.js => populate-builder.js} | 34 +++++----- .../utils/__tests__/query-populate.test.js | 68 +++++++++---------- .../utils/{populate/index.js => populate.js} | 8 ++- 8 files changed, 90 insertions(+), 77 deletions(-) rename packages/core/content-manager/server/services/{utils/populate/builder.js => populate-builder.js} (69%) rename packages/core/content-manager/server/services/utils/{populate/index.js => populate.js} (97%) diff --git a/packages/core/content-manager/server/controllers/collection-types.js b/packages/core/content-manager/server/controllers/collection-types.js index 0969482429..6fe522856e 100644 --- a/packages/core/content-manager/server/controllers/collection-types.js +++ b/packages/core/content-manager/server/controllers/collection-types.js @@ -4,7 +4,6 @@ const { setCreatorFields, pipeAsync } = require('@strapi/utils'); const { getService, pickWritableAttributes } = require('../utils'); const { validateBulkDeleteInput } = require('./validation'); -const { populateBuilder } = require('../services/utils/populate/builder'); module.exports = { async find(ctx) { @@ -21,7 +20,7 @@ module.exports = { const permissionQuery = await permissionChecker.sanitizedQuery.read(query); - const populate = await populateBuilder(model) + const populate = await getService('populate-builder')(model) .populateDeep(1) .countRelations({ toOne: false, toMany: true }) .build(); @@ -53,7 +52,7 @@ module.exports = { } const permissionQuery = await permissionChecker.sanitizedQuery.read(ctx.query); - const populate = await populateBuilder(model) + const populate = await getService('populate-builder')(model) .populateFromQuery(permissionQuery) .populateDeep(Infinity) .countRelations() @@ -121,7 +120,9 @@ module.exports = { } const permissionQuery = await permissionChecker.sanitizedQuery.update(ctx.query); - const populate = await populateBuilder(model).populateFromQuery(permissionQuery).build(); + const populate = await getService('populate-builder')(model) + .populateFromQuery(permissionQuery) + .build(); const entity = await entityManager.findOne(id, model, { populate }); @@ -156,7 +157,9 @@ module.exports = { } const permissionQuery = await permissionChecker.sanitizedQuery.delete(ctx.query); - const populate = await populateBuilder(model).populateFromQuery(permissionQuery).build(); + const populate = await getService('populate-builder')(model) + .populateFromQuery(permissionQuery) + .build(); const entity = await entityManager.findOne(id, model, { populate }); @@ -185,7 +188,9 @@ module.exports = { } const permissionQuery = await permissionChecker.sanitizedQuery.publish(ctx.query); - const populate = await populateBuilder(model).populateFromQuery(permissionQuery).build(); + const populate = await getService('populate-builder')(model) + .populateFromQuery(permissionQuery) + .build(); const entity = await entityManager.findOne(id, model, { populate }); @@ -218,7 +223,9 @@ module.exports = { } const permissionQuery = await permissionChecker.sanitizedQuery.unpublish(ctx.query); - const populate = await populateBuilder(model).populateFromQuery(permissionQuery).build(); + const populate = await getService('populate-builder')(model) + .populateFromQuery(permissionQuery) + .build(); const entity = await entityManager.findOne(id, model, { populate }); @@ -282,7 +289,9 @@ module.exports = { } const permissionQuery = await permissionChecker.sanitizedQuery.read(ctx.query); - const populate = await populateBuilder(model).populateFromQuery(permissionQuery).build(); + const populate = await getService('populate-builder')(model) + .populateFromQuery(permissionQuery) + .build(); const entity = await entityManager.findOne(id, model, { populate }); diff --git a/packages/core/content-manager/server/controllers/relations.js b/packages/core/content-manager/server/controllers/relations.js index d4044280ab..629e7ce5d9 100644 --- a/packages/core/content-manager/server/controllers/relations.js +++ b/packages/core/content-manager/server/controllers/relations.js @@ -4,7 +4,6 @@ const { prop, isEmpty } = require('lodash/fp'); const { hasDraftAndPublish } = require('@strapi/utils').contentTypes; const { isAnyToMany } = require('@strapi/utils').relations; const { PUBLISHED_AT_ATTRIBUTE } = require('@strapi/utils').contentTypes.constants; -const { populateBuilder } = require('../services/utils/populate/builder'); const { getService } = require('../utils'); const { validateFindAvailable, validateFindExisting } = require('./validation/relations'); @@ -57,7 +56,9 @@ module.exports = { const entityManager = getService('entity-manager'); const permissionQuery = await permissionChecker.sanitizedQuery.read(ctx.query); - const populate = await populateBuilder(model).populateFromQuery(permissionQuery).build(); + const populate = await getService('populate-builder')(model) + .populateFromQuery(permissionQuery) + .build(); const entity = await entityManager.findOne(entityId, model, { populate }); @@ -166,7 +167,9 @@ module.exports = { } const permissionQuery = await permissionChecker.sanitizedQuery.read(ctx.query); - const populate = await populateBuilder(model).populateFromQuery(permissionQuery).build(); + const populate = await getService('populate-builder')(model) + .populateFromQuery(permissionQuery) + .build(); const entity = await entityManager.findOne(id, model, { populate }); diff --git a/packages/core/content-manager/server/controllers/single-types.js b/packages/core/content-manager/server/controllers/single-types.js index 6653d36390..bdb2e48fc6 100644 --- a/packages/core/content-manager/server/controllers/single-types.js +++ b/packages/core/content-manager/server/controllers/single-types.js @@ -3,12 +3,11 @@ const { setCreatorFields, pipeAsync } = require('@strapi/utils'); const { getService, pickWritableAttributes } = require('../utils'); -const { populateBuilder } = require('../services/utils/populate/builder'); const findEntity = async (query, model) => { const entityManager = getService('entity-manager'); - const populate = await populateBuilder(model) + const populate = await getService('populate-builder')(model) .populateFromQuery(query) .populateDeep(Infinity) .countRelations() diff --git a/packages/core/content-manager/server/services/entity-manager.js b/packages/core/content-manager/server/services/entity-manager.js index 33d5f5b744..0beaea7070 100644 --- a/packages/core/content-manager/server/services/entity-manager.js +++ b/packages/core/content-manager/server/services/entity-manager.js @@ -4,11 +4,11 @@ const { omit } = require('lodash/fp'); const strapiUtils = require('@strapi/utils'); const { mapAsync } = require('@strapi/utils'); const { ApplicationError } = require('@strapi/utils').errors; +const { getService } = require('../utils'); const { getDeepPopulate, getDeepPopulateDraftCount } = require('./utils/populate'); const { getDeepRelationsCount } = require('./utils/count'); const { sumDraftCounts } = require('./utils/draft'); -const { isPopulateRelationsEnabled } = require('./utils/populate'); -const { populateBuilder } = require('./utils/populate/builder'); +const { isWebhooksPopulateRelationsEnabled } = require('./utils/populate'); const { hasDraftAndPublish } = strapiUtils.contentTypes; const { PUBLISHED_AT_ATTRIBUTE } = strapiUtils.contentTypes.constants; @@ -32,9 +32,9 @@ const emitEvent = async (event, entity, modelUid) => { const buildCreateOrUpdatePopulate = (uid) => { // User can configure to populate relations, so downstream services can use them. // They will be transformed into counts later if this is set to true. - return populateBuilder(uid) + return getService('populate-builder')(uid) .populateDeep(Infinity) - .countRelationsIf(isPopulateRelationsEnabled(uid)) + .countRelationsIf(isWebhooksPopulateRelationsEnabled(uid)) .build(); }; @@ -101,7 +101,7 @@ module.exports = ({ strapi }) => ({ .create(uid, params) .then((entity) => this.mapEntity(entity, uid)); - if (isPopulateRelationsEnabled(uid)) { + if (isWebhooksPopulateRelationsEnabled(uid)) { return getDeepRelationsCount(entity, uid); } @@ -117,7 +117,7 @@ module.exports = ({ strapi }) => ({ .update(uid, entity.id, params) .then((entity) => this.mapEntity(entity, uid)); - if (isPopulateRelationsEnabled(uid)) { + if (isWebhooksPopulateRelationsEnabled(uid)) { return getDeepRelationsCount(updatedEntity, uid); } @@ -128,7 +128,7 @@ module.exports = ({ strapi }) => ({ const deletedEntity = await strapi.entityService.delete(uid, entity.id, opts); // If relations were populated, relations count will be returned instead of the array of relations. - if (isPopulateRelationsEnabled(uid)) { + if (isWebhooksPopulateRelationsEnabled(uid)) { return getDeepRelationsCount(deletedEntity, uid); } @@ -165,7 +165,7 @@ module.exports = ({ strapi }) => ({ const mappedEntity = await this.mapEntity(updatedEntity, uid); // If relations were populated, relations count will be returned instead of the array of relations. - if (isPopulateRelationsEnabled(uid)) { + if (isWebhooksPopulateRelationsEnabled(uid)) { return getDeepRelationsCount(mappedEntity, uid); } @@ -189,7 +189,7 @@ module.exports = ({ strapi }) => ({ const mappedEntity = await this.mapEntity(updatedEntity, uid); // If relations were populated, relations count will be returned instead of the array of relations. - if (isPopulateRelationsEnabled(uid)) { + if (isWebhooksPopulateRelationsEnabled(uid)) { return getDeepRelationsCount(mappedEntity, uid); } diff --git a/packages/core/content-manager/server/services/index.js b/packages/core/content-manager/server/services/index.js index 7a416e428b..7b114df80f 100644 --- a/packages/core/content-manager/server/services/index.js +++ b/packages/core/content-manager/server/services/index.js @@ -8,6 +8,7 @@ const fieldSizes = require('./field-sizes'); const metrics = require('./metrics'); const permissionChecker = require('./permission-checker'); const permission = require('./permission'); +const populateBuilder = require('./populate-builder'); const uid = require('./uid'); module.exports = { @@ -19,5 +20,6 @@ module.exports = { metrics, 'permission-checker': permissionChecker, permission, + 'populate-builder': populateBuilder, uid, }; diff --git a/packages/core/content-manager/server/services/utils/populate/builder.js b/packages/core/content-manager/server/services/populate-builder.js similarity index 69% rename from packages/core/content-manager/server/services/utils/populate/builder.js rename to packages/core/content-manager/server/services/populate-builder.js index 29e5c8fdcc..15c5ddf301 100644 --- a/packages/core/content-manager/server/services/utils/populate/builder.js +++ b/packages/core/content-manager/server/services/populate-builder.js @@ -1,6 +1,6 @@ 'use strict'; -const { getDeepPopulate, getQueryPopulate } = require('.'); +const { getDeepPopulate, getQueryPopulate } = require('./utils/populate'); /** * Builder to create a Strapi populate object. @@ -12,7 +12,7 @@ const { getDeepPopulate, getQueryPopulate } = require('.'); * // populate = { article: { populate: { count: true } } } * */ -function populateBuilder(uid) { +const populateBuilder = (uid) => { let getInitialPopulate = async () => {}; const deepPopulateOptions = { countMany: false, @@ -33,12 +33,12 @@ function populateBuilder(uid) { /** * Populate relations as count if condition is true. * @param {Boolean} condition - * @param {Object} options - * @param {Boolean} options.toMany - Populate XtoMany relations as count if true. - * @param {Boolean} options.toOne - Populate XtoOne relations as count if true. + * @param {Object} [options] + * @param {Boolean} [options.toMany] - Populate XtoMany relations as count if true. + * @param {Boolean} [options.toOne] - Populate XtoOne relations as count if true. * @returns {typeof builder} - Builder */ - countRelationsIf(condition, { toMany = true, toOne = true } = {}) { + countRelationsIf(condition, { toMany, toOne } = { toMany: true, toOne: true }) { if (condition) { return this.countRelations({ toMany, toOne }); } @@ -46,14 +46,18 @@ function populateBuilder(uid) { }, /** * Populate relations as count. - * @param {Object} options - * @param {Boolean} options.toMany - Populate XtoMany relations as count if true. - * @param {Boolean} options.toOne - Populate XtoOne relations as count if true. + * @param {Object} [options] + * @param {Boolean } [options.toMany] - Populate XtoMany relations as count if true. + * @param {Boolean} [options.toOne] - Populate XtoOne relations as count if true. * @returns {typeof builder} - Builder */ - countRelations({ toMany = true, toOne = true } = {}) { - deepPopulateOptions.countMany = toMany; - deepPopulateOptions.countOne = toOne; + countRelations({ toMany, toOne } = { toMany: true, toOne: true }) { + if (toMany) { + deepPopulateOptions.countMany = toMany; + } + if (toOne) { + deepPopulateOptions.countOne = toOne; + } return builder; }, /** @@ -81,8 +85,6 @@ function populateBuilder(uid) { }; return builder; -} - -module.exports = { - populateBuilder, }; + +module.exports = () => populateBuilder; diff --git a/packages/core/content-manager/server/services/utils/__tests__/query-populate.test.js b/packages/core/content-manager/server/services/utils/__tests__/query-populate.test.js index 6a5952485e..38e07831ac 100644 --- a/packages/core/content-manager/server/services/utils/__tests__/query-populate.test.js +++ b/packages/core/content-manager/server/services/utils/__tests__/query-populate.test.js @@ -4,15 +4,19 @@ const { getQueryPopulate } = require('../populate'); const getFilterQuery = (conditions) => ({ filters: { - $or: [{ - $and: [{ - $or: conditions - }] - }] - } -}) + $or: [ + { + $and: [ + { + $or: conditions, + }, + ], + }, + ], + }, +}); -const uid = 'model'; +const uid = 'api::model.model'; describe('Populate', () => { const fakeModels = { @@ -20,8 +24,8 @@ describe('Populate', () => { uid: 'empty', attributes: {}, }, - model: { - uid: 'model', + [uid]: { + uid: 'api::model.model', attributes: { field: { type: 'string', @@ -29,7 +33,7 @@ describe('Populate', () => { relation: { type: 'relation', relation: 'oneToMany', - target: 'model', + target: 'api::model.model', }, component: { type: 'component', @@ -42,7 +46,7 @@ describe('Populate', () => { }, media: { type: 'media', - } + }, }, }, component: { @@ -54,8 +58,8 @@ describe('Populate', () => { compoRelation: { type: 'relation', relation: 'oneToMany', - target: 'model', - } + target: 'api::model.model', + }, }, }, }; @@ -68,8 +72,8 @@ describe('Populate', () => { db: { metadata: { get: jest.fn((uid) => ({ ...fakeModels[uid], columnToAttribute: {} })), - } - } + }, + }, }; }); @@ -78,7 +82,6 @@ describe('Populate', () => { }); test('top level field should not be populated', async () => { - const query = getFilterQuery([{ field: { $exists: true } }]); const result = await getQueryPopulate(uid, query); @@ -86,54 +89,47 @@ describe('Populate', () => { }); test('one relational field should be populated', async () => { - - const query = getFilterQuery([{ relation: { field: "value" } }]); + const query = getFilterQuery([{ relation: { field: 'value' } }]); const result = await getQueryPopulate(uid, query); expect(result).toEqual({ - relation: { fields: ['field'] } + relation: { fields: ['field'] }, }); - }); test('relation in component should be populated', async () => { - - const query = getFilterQuery([{ component: { compoRelation: { field: "value" } } }]); + const query = getFilterQuery([{ component: { compoRelation: { field: 'value' } } }]); const result = await getQueryPopulate(uid, query); expect(result).toEqual({ - component: { populate: { compoRelation: { fields: ['field'] } }, fields: [] } + component: { populate: { compoRelation: { fields: ['field'] } }, fields: [] }, }); - }); test('relation in repeatable component should be populated', async () => { - - const query = getFilterQuery([{ repeatableComponent: { compoRelation: { field: "value" } } }]); + const query = getFilterQuery([ + { repeatableComponent: { compoRelation: { field: 'value' } } }, + ]); const result = await getQueryPopulate(uid, query); expect(result).toEqual({ - repeatableComponent: { populate: { compoRelation: { fields: ['field'] } }, fields: [] } + repeatableComponent: { populate: { compoRelation: { fields: ['field'] } }, fields: [] }, }); - }); test('populate multiple fields at once', async () => { - const query = getFilterQuery([ - { relation: { component: { field: { $eq: "value" } } } }, - { relation: { field: "value" } }, - { repeatableComponent: { $elemMatch: { compoRelation: { field: "value" } } } } + { relation: { component: { field: { $eq: 'value' } } } }, + { relation: { field: 'value' } }, + { repeatableComponent: { $elemMatch: { compoRelation: { field: 'value' } } } }, ]); const result = await getQueryPopulate(uid, query); expect(result).toEqual({ relation: { fields: ['field'], populate: { component: { fields: ['field'] } } }, - repeatableComponent: { populate: { compoRelation: { fields: ['field'] } }, fields: [] } + repeatableComponent: { populate: { compoRelation: { fields: ['field'] } }, fields: [] }, }); }); - }); - }); diff --git a/packages/core/content-manager/server/services/utils/populate/index.js b/packages/core/content-manager/server/services/utils/populate.js similarity index 97% rename from packages/core/content-manager/server/services/utils/populate/index.js rename to packages/core/content-manager/server/services/utils/populate.js index cf85de517b..34f12fd263 100644 --- a/packages/core/content-manager/server/services/utils/populate/index.js +++ b/packages/core/content-manager/server/services/utils/populate.js @@ -256,7 +256,7 @@ const getQueryPopulate = async (uid, query) => { const populatePath = pathToPopulate(pathWithoutKey); get(populatePath, populateQuery).fields.push(key); }, - { schema: strapi.contentType(uid) }, + { schema: strapi.getModel(uid) }, query ); @@ -269,10 +269,12 @@ const getQueryPopulate = async (uid, query) => { * The entity-manager response will not have the populated relations though. * For performance reasons, it is recommended to set it to false, * + * See docs: https://docs.strapi.io/dev-docs/configurations/server + * * TODO V5: Set to false by default. * TODO V5: Make webhooks always send the same entity data. */ -const isPopulateRelationsEnabled = () => { +const isWebhooksPopulateRelationsEnabled = () => { return strapi.config.get('server.webhooks.populateRelations', true); }; @@ -280,5 +282,5 @@ module.exports = { getDeepPopulate, getDeepPopulateDraftCount, getQueryPopulate, - isPopulateRelationsEnabled, + isWebhooksPopulateRelationsEnabled, }; From 810efff6da1c9096b2d6562a6c8661dbe5de6fa6 Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Fri, 26 May 2023 17:37:33 +0200 Subject: [PATCH 065/172] fix: use is nil for countRelations --- .../core/content-manager/server/services/populate-builder.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/core/content-manager/server/services/populate-builder.js b/packages/core/content-manager/server/services/populate-builder.js index 15c5ddf301..a52c85ba24 100644 --- a/packages/core/content-manager/server/services/populate-builder.js +++ b/packages/core/content-manager/server/services/populate-builder.js @@ -1,5 +1,6 @@ 'use strict'; +const { isNil } = require('lodash/fp'); const { getDeepPopulate, getQueryPopulate } = require('./utils/populate'); /** @@ -52,10 +53,10 @@ const populateBuilder = (uid) => { * @returns {typeof builder} - Builder */ countRelations({ toMany, toOne } = { toMany: true, toOne: true }) { - if (toMany) { + if (!isNil(toMany)) { deepPopulateOptions.countMany = toMany; } - if (toOne) { + if (!isNil(toOne)) { deepPopulateOptions.countOne = toOne; } return builder; From e73a41ecde6982fd4aeb547d60184a5c2f8477ac Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Fri, 26 May 2023 17:47:59 +0200 Subject: [PATCH 066/172] todo: handle dz and morph relations in getQueryPopulate --- packages/core/content-manager/server/services/utils/populate.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/content-manager/server/services/utils/populate.js b/packages/core/content-manager/server/services/utils/populate.js index 34f12fd263..1cd3c64c36 100644 --- a/packages/core/content-manager/server/services/utils/populate.js +++ b/packages/core/content-manager/server/services/utils/populate.js @@ -234,7 +234,7 @@ const getQueryPopulate = async (uid, query) => { * @returns */ ({ key, attribute, path }) => { - // Ignore dynamic zones and morph relations + // TODO: handle dynamic zones and morph relations if (!attribute || isDynamicZone(attribute) || isMorphRelation(attribute)) { return; } From 31afc24ee5009f6621abfa39756f0ab553890cdb Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Fri, 26 May 2023 17:57:23 +0200 Subject: [PATCH 067/172] fix: unit tests --- .../controllers/__tests__/single-types.test.js | 5 +++++ .../services/__tests__/entity-manager.test.js | 14 ++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/packages/core/content-manager/server/controllers/__tests__/single-types.test.js b/packages/core/content-manager/server/controllers/__tests__/single-types.test.js index 9629c3d8e7..8bf7f6e2d5 100644 --- a/packages/core/content-manager/server/controllers/__tests__/single-types.test.js +++ b/packages/core/content-manager/server/controllers/__tests__/single-types.test.js @@ -60,6 +60,7 @@ describe('Single Types', () => { return permissionChecker; }, }, + 'populate-builder': require('../../services/populate-builder')(), }, }, }, @@ -157,6 +158,7 @@ describe('Single Types', () => { return permissionChecker; }, }, + 'populate-builder': require('../../services/populate-builder')(), }, }, }, @@ -273,6 +275,7 @@ describe('Single Types', () => { return permissionChecker; }, }, + 'populate-builder': require('../../services/populate-builder')(), }, }, }, @@ -370,6 +373,7 @@ describe('Single Types', () => { return permissionChecker; }, }, + 'populate-builder': require('../../services/populate-builder')(), }, }, }, @@ -467,6 +471,7 @@ describe('Single Types', () => { return permissionChecker; }, }, + 'populate-builder': require('../../services/populate-builder')(), }, }, }, diff --git a/packages/core/content-manager/server/services/__tests__/entity-manager.test.js b/packages/core/content-manager/server/services/__tests__/entity-manager.test.js index 8b4b00b1a4..a815720d6d 100644 --- a/packages/core/content-manager/server/services/__tests__/entity-manager.test.js +++ b/packages/core/content-manager/server/services/__tests__/entity-manager.test.js @@ -26,6 +26,13 @@ describe('Content-Manager', () => { config: { get: (path, defaultValue) => _.get(defaultConfig, path, defaultValue), }, + plugins: { + 'content-manager': { + services: { + 'populate-builder': require('../populate-builder')(), + }, + }, + }, }; entityManager = entityManagerLoader({ strapi }); }); @@ -58,6 +65,13 @@ describe('Content-Manager', () => { config: { get: (path, defaultValue) => _.get(defaultConfig, path, defaultValue), }, + plugins: { + 'content-manager': { + services: { + 'populate-builder': require('../populate-builder')(), + }, + }, + }, }; entityManager = entityManagerLoader({ strapi }); }); From 489e422f60fac25b346e270b8eeab5e4c3c19e46 Mon Sep 17 00:00:00 2001 From: Convly Date: Fri, 26 May 2023 18:15:55 +0200 Subject: [PATCH 068/172] Revert breaking change & adapt the feature behavior --- .../lib/commands/actions/ts/generate-types/action.js | 11 ++++++++--- .../lib/commands/actions/ts/generate-types/command.js | 5 +++++ packages/utils/typescript/lib/generators/constants.js | 5 +++-- packages/utils/typescript/lib/generators/index.js | 6 +++--- 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/packages/core/strapi/lib/commands/actions/ts/generate-types/action.js b/packages/core/strapi/lib/commands/actions/ts/generate-types/action.js index cb641b5325..a893a51077 100644 --- a/packages/core/strapi/lib/commands/actions/ts/generate-types/action.js +++ b/packages/core/strapi/lib/commands/actions/ts/generate-types/action.js @@ -4,8 +4,8 @@ const tsUtils = require('@strapi/typescript-utils'); const strapi = require('../../../../index'); -module.exports = async ({ debug, silent }) => { - if (debug && silent) { +module.exports = async ({ debug, silent, verbose, outDir }) => { + if ((debug || verbose) && silent) { console.error('Flags conflict: both silent and debug mode are enabled, exiting...'); process.exit(1); } @@ -16,7 +16,12 @@ module.exports = async ({ debug, silent }) => { await tsUtils.generators.generate({ strapi: app, pwd: appContext.appDir, - logger: { silent, debug }, + rootDir: outDir ?? undefined, + logger: { + silent, + // TODO V5: verbose is deprecated and should be removed + debug: debug || verbose, + }, artefacts: { contentTypes: true, components: true }, }); diff --git a/packages/core/strapi/lib/commands/actions/ts/generate-types/command.js b/packages/core/strapi/lib/commands/actions/ts/generate-types/command.js index 2527087bcd..32384244e5 100644 --- a/packages/core/strapi/lib/commands/actions/ts/generate-types/command.js +++ b/packages/core/strapi/lib/commands/actions/ts/generate-types/command.js @@ -10,7 +10,12 @@ module.exports = ({ command }) => { command .command('ts:generate-types') .description(`Generate TypeScript typings for your schemas`) + .option('--verbose', `[DEPRECATED] The verbose option has been replaced by debug`, false) .option('-d, --debug', `Run the generation with debug messages`, false) .option('-s, --silent', `Run the generation silently, without any output`, false) + .option( + '-o, --out-dir ', + 'Specify a relative root directory in which the definitions will be generated. Changing this value might break types exposed by Strapi that relies on generated types.' + ) .action(getLocalScript('ts/generate-types')); }; diff --git a/packages/utils/typescript/lib/generators/constants.js b/packages/utils/typescript/lib/generators/constants.js index beaebf8776..ef5897b7f9 100644 --- a/packages/utils/typescript/lib/generators/constants.js +++ b/packages/utils/typescript/lib/generators/constants.js @@ -2,6 +2,7 @@ const path = require('path'); -const REGISTRIES_OUT_DIR = path.join('types', 'shared', 'registries'); +const TYPES_ROOT_DIR = 'types'; +const REGISTRIES_OUT_DIR = path.join('shared', 'registries'); -module.exports = { REGISTRIES_OUT_DIR }; +module.exports = { REGISTRIES_OUT_DIR, TYPES_ROOT_DIR }; diff --git a/packages/utils/typescript/lib/generators/index.js b/packages/utils/typescript/lib/generators/index.js index a52062251a..7cc7801269 100644 --- a/packages/utils/typescript/lib/generators/index.js +++ b/packages/utils/typescript/lib/generators/index.js @@ -3,7 +3,7 @@ const path = require('path'); const chalk = require('chalk'); -const { REGISTRIES_OUT_DIR } = require('./constants'); +const { TYPES_ROOT_DIR, REGISTRIES_OUT_DIR } = require('./constants'); const { saveDefinitionToFileSystem, createLogger, timer } = require('./utils'); const generateContentTypesDefinitions = require('./content-types'); const generateComponentsDefinitions = require('./components'); @@ -37,12 +37,12 @@ const GENERATORS = { * @param {GenerateConfig} [config] */ const generate = async (config = {}) => { - const { pwd, strapi, artefacts = {}, logger: loggerConfig } = config; + const { pwd, rootDir = TYPES_ROOT_DIR, strapi, artefacts = {}, logger: loggerConfig } = config; const reports = {}; const logger = createLogger(loggerConfig); const psTimer = timer().start(); - const registryPwd = path.join(pwd, REGISTRIES_OUT_DIR); + const registryPwd = path.join(pwd, rootDir, REGISTRIES_OUT_DIR); const generatorConfig = { strapi, pwd: registryPwd, logger }; const returnWithMessage = () => { From b571f2f511747ce74aa4677c3a90edf5435e6aba Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Mon, 29 May 2023 08:43:00 +0200 Subject: [PATCH 069/172] feat: exclude morphTo relations --- .../core/content-manager/server/services/utils/populate.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/core/content-manager/server/services/utils/populate.js b/packages/core/content-manager/server/services/utils/populate.js index 1cd3c64c36..e7d5416a3e 100644 --- a/packages/core/content-manager/server/services/utils/populate.js +++ b/packages/core/content-manager/server/services/utils/populate.js @@ -7,8 +7,8 @@ const { hasDraftAndPublish, isVisibleAttribute } = strapiUtils.contentTypes; const { isAnyToMany } = strapiUtils.relations; const { PUBLISHED_AT_ATTRIBUTE } = strapiUtils.contentTypes.constants; -const isMorphRelation = (attribute) => - isRelation(attribute) && attribute.relation.includes('morph'); +const isMorphToRelation = (attribute) => + isRelation(attribute) && attribute.relation.includes('morphTo'); const isMedia = propEq('type', 'media'); const isRelation = propEq('type', 'relation'); const isComponent = propEq('type', 'component'); @@ -235,7 +235,7 @@ const getQueryPopulate = async (uid, query) => { */ ({ key, attribute, path }) => { // TODO: handle dynamic zones and morph relations - if (!attribute || isDynamicZone(attribute) || isMorphRelation(attribute)) { + if (!attribute || isDynamicZone(attribute) || isMorphToRelation(attribute)) { return; } From 296aa4b53c9affc4875b0c1922de88f6c1f2314c Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Mon, 29 May 2023 09:12:07 +0200 Subject: [PATCH 070/172] fix: replace all for node14 --- packages/core/content-manager/server/services/utils/populate.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/content-manager/server/services/utils/populate.js b/packages/core/content-manager/server/services/utils/populate.js index e7d5416a3e..561437ecad 100644 --- a/packages/core/content-manager/server/services/utils/populate.js +++ b/packages/core/content-manager/server/services/utils/populate.js @@ -221,7 +221,7 @@ const getDeepPopulateDraftCount = (uid) => { * @returns {Object} populate object */ const getQueryPopulate = async (uid, query) => { - const pathToPopulate = (path) => path.replaceAll('.', '.populate.'); + const pathToPopulate = (path) => path.replace(/\./g, '.populate.'); let populateQuery = {}; await strapiUtils.traverse.traverseQueryFilters( From 304f32d56b190fcfe889ea3afc788a10df8cf39e Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Mon, 29 May 2023 09:34:45 +0200 Subject: [PATCH 071/172] fix: populate attributes in delete --- .../server/services/entity-manager.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/packages/core/content-manager/server/services/entity-manager.js b/packages/core/content-manager/server/services/entity-manager.js index 0beaea7070..95a206f964 100644 --- a/packages/core/content-manager/server/services/entity-manager.js +++ b/packages/core/content-manager/server/services/entity-manager.js @@ -29,7 +29,7 @@ const emitEvent = async (event, entity, modelUid) => { }); }; -const buildCreateOrUpdatePopulate = (uid) => { +const buildDeepPopulate = (uid) => { // User can configure to populate relations, so downstream services can use them. // They will be transformed into counts later if this is set to true. return getService('populate-builder')(uid) @@ -89,7 +89,7 @@ module.exports = ({ strapi }) => ({ async create(body, uid) { const modelDef = strapi.getModel(uid); const publishData = { ...body }; - const populate = await buildCreateOrUpdatePopulate(uid); + const populate = await buildDeepPopulate(uid); if (hasDraftAndPublish(modelDef)) { publishData[PUBLISHED_AT_ATTRIBUTE] = null; @@ -110,7 +110,7 @@ module.exports = ({ strapi }) => ({ async update(entity, body, uid) { const publishData = omitPublishedAtField(body); - const populate = await buildCreateOrUpdatePopulate(uid); + const populate = await buildDeepPopulate(uid); const params = { data: publishData, populate }; const updatedEntity = await strapi.entityService @@ -124,8 +124,9 @@ module.exports = ({ strapi }) => ({ return updatedEntity; }, - async delete(entity, uid, opts = {}) { - const deletedEntity = await strapi.entityService.delete(uid, entity.id, opts); + async delete(entity, uid) { + const populate = await buildDeepPopulate(uid); + const deletedEntity = await strapi.entityService.delete(uid, entity.id, { populate }); // If relations were populated, relations count will be returned instead of the array of relations. if (isWebhooksPopulateRelationsEnabled(uid)) { @@ -154,7 +155,7 @@ module.exports = ({ strapi }) => ({ ); const data = { ...body, [PUBLISHED_AT_ATTRIBUTE]: new Date() }; - const populate = await buildCreateOrUpdatePopulate(uid); + const populate = await buildDeepPopulate(uid); const params = { data, populate }; @@ -178,7 +179,7 @@ module.exports = ({ strapi }) => ({ } const data = { ...body, [PUBLISHED_AT_ATTRIBUTE]: null }; - const populate = await buildCreateOrUpdatePopulate(uid); + const populate = await buildDeepPopulate(uid); const params = { data, populate }; From 1bdf9afa6b525d683ea67994336d85f5d8ca1174 Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Mon, 29 May 2023 10:45:47 +0200 Subject: [PATCH 072/172] fix: populate al top level attributes --- .../server/services/utils/populate.js | 20 ++++--------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/packages/core/content-manager/server/services/utils/populate.js b/packages/core/content-manager/server/services/utils/populate.js index 561437ecad..b2b2d45154 100644 --- a/packages/core/content-manager/server/services/utils/populate.js +++ b/packages/core/content-manager/server/services/utils/populate.js @@ -1,6 +1,6 @@ 'use strict'; -const { merge, isEmpty, get, set, propEq } = require('lodash/fp'); +const { merge, isEmpty, set, propEq } = require('lodash/fp'); const strapiUtils = require('@strapi/utils'); const { hasDraftAndPublish, isVisibleAttribute } = strapiUtils.contentTypes; @@ -221,7 +221,6 @@ const getDeepPopulateDraftCount = (uid) => { * @returns {Object} populate object */ const getQueryPopulate = async (uid, query) => { - const pathToPopulate = (path) => path.replace(/\./g, '.populate.'); let populateQuery = {}; await strapiUtils.traverse.traverseQueryFilters( @@ -233,7 +232,7 @@ const getQueryPopulate = async (uid, query) => { * @param {string} param0.path - Content Type path to the attribute * @returns */ - ({ key, attribute, path }) => { + ({ attribute, path }) => { // TODO: handle dynamic zones and morph relations if (!attribute || isDynamicZone(attribute) || isMorphToRelation(attribute)) { return; @@ -241,20 +240,9 @@ const getQueryPopulate = async (uid, query) => { // Populate all relations, components and media if (isRelation(attribute) || isMedia(attribute) || isComponent(attribute)) { - const populatePath = pathToPopulate(path.attribute); - populateQuery = set(populatePath, { fields: [] }, populateQuery); - return; + const populatePath = path.attribute.replace(/\./g, '.populate.'); + populateQuery = set(populatePath, {}, populateQuery); } - - // Top level attributes are not populated - if (key === path.attribute) { - return; - } - - // Can only get here if attribute is a field from a relation / compo - const pathWithoutKey = path.attribute.slice(0, path.attribute.lastIndexOf('.')); - const populatePath = pathToPopulate(pathWithoutKey); - get(populatePath, populateQuery).fields.push(key); }, { schema: strapi.getModel(uid) }, query From 91d47594337d193ad1c837d2eaffd752ed645eb7 Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Mon, 29 May 2023 11:13:29 +0200 Subject: [PATCH 073/172] fix: unit test --- .../services/utils/__tests__/query-populate.test.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/core/content-manager/server/services/utils/__tests__/query-populate.test.js b/packages/core/content-manager/server/services/utils/__tests__/query-populate.test.js index 38e07831ac..efa2c9ae14 100644 --- a/packages/core/content-manager/server/services/utils/__tests__/query-populate.test.js +++ b/packages/core/content-manager/server/services/utils/__tests__/query-populate.test.js @@ -93,7 +93,7 @@ describe('Populate', () => { const result = await getQueryPopulate(uid, query); expect(result).toEqual({ - relation: { fields: ['field'] }, + relation: {}, }); }); @@ -102,7 +102,7 @@ describe('Populate', () => { const result = await getQueryPopulate(uid, query); expect(result).toEqual({ - component: { populate: { compoRelation: { fields: ['field'] } }, fields: [] }, + component: { populate: { compoRelation: {} } }, }); }); @@ -113,7 +113,7 @@ describe('Populate', () => { const result = await getQueryPopulate(uid, query); expect(result).toEqual({ - repeatableComponent: { populate: { compoRelation: { fields: ['field'] } }, fields: [] }, + repeatableComponent: { populate: { compoRelation: {} } }, }); }); @@ -127,8 +127,8 @@ describe('Populate', () => { const result = await getQueryPopulate(uid, query); expect(result).toEqual({ - relation: { fields: ['field'], populate: { component: { fields: ['field'] } } }, - repeatableComponent: { populate: { compoRelation: { fields: ['field'] } }, fields: [] }, + relation: { populate: { component: {} } }, + repeatableComponent: { populate: { compoRelation: {} } }, }); }); }); From 7bd2079fabdd585fcf4c0b422a81d0f42b6c3cab Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Mon, 29 May 2023 15:36:40 +0200 Subject: [PATCH 074/172] test: custom conditions --- ...-permissions-custom-conditions.test.api.js | 306 ++++++++++++++++++ packages/utils/api-tests/strapi.js | 12 + 2 files changed, 318 insertions(+) create mode 100644 api-tests/core/admin/admin-permissions-custom-conditions.test.api.js diff --git a/api-tests/core/admin/admin-permissions-custom-conditions.test.api.js b/api-tests/core/admin/admin-permissions-custom-conditions.test.api.js new file mode 100644 index 0000000000..a52867e941 --- /dev/null +++ b/api-tests/core/admin/admin-permissions-custom-conditions.test.api.js @@ -0,0 +1,306 @@ +'use strict'; + +const { prop } = require('lodash/fp'); +const { createTestBuilder } = require('api-tests/builder'); +const { createStrapiInstance } = require('api-tests/strapi'); +const { createRequest, createAuthRequest } = require('api-tests/request'); +const { createUtils } = require('api-tests/utils'); + +describe('Admin Permissions - Conditions', () => { + let strapi; + let utils; + const builder = createTestBuilder(); + const requests = { + public: null, + admin: null, + }; + + const localTestData = { + models: { + article: { + singularName: 'article', + pluralName: 'articles', + displayName: 'Article', + draftAndPublish: true, + attributes: { + title: { + type: 'string', + }, + price: { + type: 'integer', + }, + category: { + type: 'relation', + relation: 'manyToOne', + target: 'api::category.category', + }, + }, + }, + category: { + singularName: 'category', + pluralName: 'categories', + displayName: 'Category', + draftAndPublish: true, + attributes: { + name: { + type: 'string', + }, + }, + }, + }, + cheapArticle: { + title: 'Cheap Article', + price: 999, + }, + expensiveArticle: { + title: 'Expensive Article', + price: 1001, + }, + categories: [{ name: 'Cheap' }, { name: 'Expensive' }], + role: { + name: 'foobar', + description: 'A dummy test role', + }, + permissions: [ + { + action: 'plugin::content-manager.explorer.create', + subject: 'api::article.article', + fields: null, + conditions: [], + }, + { + action: 'plugin::content-manager.explorer.update', + subject: 'api::article.article', + fields: null, + conditions: ['plugin::test.cheap-article'], + }, + { + action: 'plugin::content-manager.explorer.read', + subject: 'api::article.article', + fields: null, + conditions: ['plugin::test.cheap-article'], + }, + { + action: 'plugin::content-manager.explorer.delete', + subject: 'api::article.article', + fields: null, + conditions: ['plugin::test.cheap-article'], + }, + { + action: 'plugin::content-manager.explorer.publish', + subject: 'api::article.article', + fields: null, + conditions: ['plugin::test.cheap-article'], + }, + ], + customConditions: [ + { + displayName: 'Custom Condition', + name: 'cheap-article', + plugin: 'test', + handler: () => ({ + 'category.name': { $eq: 'Cheap' }, + }), + }, + ], + userPassword: 'fooBar42', + users: [{ firstname: 'Alice', lastname: 'Foo', email: 'alice.foo@test.com' }], + }; + + const createFixtures = async () => { + // Login with admin and init admin tools + requests.admin = await createAuthRequest({ strapi }); + requests.public = createRequest({ strapi }); + + // Create the foobar role + const role = await utils.createRole(localTestData.role); + + // Assign permissions to the foobar role + const permissions = await utils.assignPermissionsToRole(role.id, localTestData.permissions); + Object.assign(role, { permissions }); + + // Create users with the new role & create associated auth requests + const users = []; + + for (let i = 0; i < localTestData.users.length; i += 1) { + const userFixture = localTestData.users[i]; + const userAttributes = { + ...userFixture, + password: localTestData.userPassword, + roles: [role.id], + }; + + const createdUser = await utils.createUser(userAttributes); + + requests[createdUser.id] = await createAuthRequest({ strapi, userInfo: createdUser }); + + users.push(createdUser); + } + + // Create categories + for (const category of localTestData.categories) { + const { body } = await requests.admin({ + method: 'POST', + url: `/content-manager/collection-types/api::category.category`, + body: category, + }); + category.id = body.id; + } + + // Update the local data store + Object.assign(localTestData, { role, permissions, users }); + }; + + const getUserRequest = (idx) => requests[localTestData.users[idx].id]; + + const deleteFixtures = async () => { + // Delete users + const usersId = localTestData.users.map(prop('id')); + await utils.deleteUsersById(usersId); + + // Delete the foobar role + await utils.deleteRolesById([localTestData.role.id]); + }; + + beforeAll(async () => { + await builder + .addContentType(localTestData.models.category) + .addContentType(localTestData.models.article) + .build(); + + strapi = await createStrapiInstance({ + bootstrap: ({ strapi }) => { + // Create custom conditions + return strapi.admin.services.permission.conditionProvider.registerMany( + localTestData.customConditions + ); + }, + }); + utils = createUtils(strapi); + + await createFixtures(); + }); + + afterAll(async () => { + await deleteFixtures(); + + await strapi.destroy(); + await builder.cleanup(); + }); + + test('User can create articles', async () => { + const rq = getUserRequest(0); + + const res = await rq({ + method: 'POST', + url: `/content-manager/collection-types/api::article.article`, + body: { ...localTestData.cheapArticle, category: localTestData.categories[0].id }, + }); + + const resExpensive = await rq({ + method: 'POST', + url: `/content-manager/collection-types/api::article.article`, + body: { ...localTestData.expensiveArticle, category: localTestData.categories[1].id }, + }); + + expect(res.statusCode).toBe(200); + expect(resExpensive.statusCode).toBe(200); + + localTestData.cheapArticle.id = res.body.id; + localTestData.expensiveArticle.id = resExpensive.body.id; + }); + + test('User can read cheap articles', async () => { + const { id } = localTestData.cheapArticle; + const rq = getUserRequest(0); + const res = await rq({ + method: 'GET', + url: `/content-manager/collection-types/api::article.article/${id}`, + }); + + expect(res.statusCode).toBe(200); + expect(res.body).toMatchObject(localTestData.cheapArticle); + }); + + test('User cannot read expensive articles', async () => { + const { id } = localTestData.expensiveArticle; + const rq = getUserRequest(0); + const res = await rq({ + method: 'GET', + url: `/content-manager/collection-types/api::article.article/${id}`, + }); + + expect(res.statusCode).toBe(403); + }); + + test('User can update cheap articles', async () => { + const { id } = localTestData.cheapArticle; + const rq = getUserRequest(0); + const res = await rq({ + method: 'PUT', + url: `/content-manager/collection-types/api::article.article/${id}`, + body: { ...localTestData.cheapArticle, title: 'New title' }, + }); + + expect(res.statusCode).toBe(200); + expect(res.body).toMatchObject({ ...localTestData.cheapArticle, title: 'New title' }); + localTestData.cheapArticle.title = 'New title'; + }); + + test('User cannot update expensive articles', async () => { + const { id } = localTestData.expensiveArticle; + const rq = getUserRequest(0); + const res = await rq({ + method: 'PUT', + url: `/content-manager/collection-types/api::article.article/${id}`, + body: { ...localTestData.expensiveArticle, title: 'New title' }, + }); + + expect(res.statusCode).toBe(403); + }); + + test('User can publish cheap articles', async () => { + const { id } = localTestData.cheapArticle; + const rq = getUserRequest(0); + const res = await rq({ + method: 'POST', + url: `/content-manager/collection-types/api::article.article/${id}/actions/publish`, + }); + + expect(res.statusCode).toBe(200); + expect(res.body).toMatchObject(localTestData.cheapArticle); + }); + + test('User cannot publish expensive articles', async () => { + const { id } = localTestData.expensiveArticle; + const rq = getUserRequest(0); + const res = await rq({ + method: 'POST', + url: `/content-manager/collection-types/api::article.article/${id}/actions/publish`, + }); + + expect(res.statusCode).toBe(403); + }); + + test('User can delete cheap articles', async () => { + const { id } = localTestData.cheapArticle; + const rq = getUserRequest(0); + const res = await rq({ + method: 'DELETE', + url: `/content-manager/collection-types/api::article.article/${id}`, + }); + + expect(res.statusCode).toBe(200); + }); + + test('User cannot delete expensive articles', async () => { + const { id } = localTestData.expensiveArticle; + const rq = getUserRequest(0); + const res = await rq({ + method: 'DELETE', + url: `/content-manager/collection-types/api::article.article/${id}`, + }); + + expect(res.statusCode).toBe(403); + }); +}); diff --git a/packages/utils/api-tests/strapi.js b/packages/utils/api-tests/strapi.js index 5d39816312..65a6d43aca 100644 --- a/packages/utils/api-tests/strapi.js +++ b/packages/utils/api-tests/strapi.js @@ -21,6 +21,7 @@ const createStrapiInstance = async ({ ensureSuperAdmin = true, logLevel = 'error', bypassAuth = true, + bootstrap, } = {}) => { // read .env file as it could have been updated dotenv.config({ path: process.env.ENV_PATH }); @@ -39,6 +40,17 @@ const createStrapiInstance = async ({ verify() {}, }); } + + if (bootstrap) { + const modules = instance.container.get('modules'); + const originalBootstrap = modules.bootstrap; + // decorate modules bootstrap + modules.bootstrap = async () => { + await originalBootstrap(); + await bootstrap({ strapi: instance }); + }; + } + await instance.load(); instance.log.level = logLevel; From 74023ce4190e1b0f000b6c864c616be316975fb4 Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Mon, 29 May 2023 15:42:36 +0200 Subject: [PATCH 075/172] todo: revert create if custom condition does not allow it --- .../content-manager/server/controllers/collection-types.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/core/content-manager/server/controllers/collection-types.js b/packages/core/content-manager/server/controllers/collection-types.js index 6fe522856e..4309966cdc 100644 --- a/packages/core/content-manager/server/controllers/collection-types.js +++ b/packages/core/content-manager/server/controllers/collection-types.js @@ -98,6 +98,11 @@ module.exports = { const entity = await entityManager.create(sanitizedBody, model); + // TODO: Revert the creation if create permission conditions are not met + // if (permissionChecker.cannot.create(entity)) { + // return ctx.forbidden(); + // } + ctx.body = await permissionChecker.sanitizeOutput(entity); if (totalEntries === 0) { From 7738d67dcaf0acf56842a12c5f39f158cb6aad9f Mon Sep 17 00:00:00 2001 From: Convly Date: Tue, 30 May 2023 11:15:32 +0200 Subject: [PATCH 076/172] Fix the autogenerate experimental features to match the new generate signature --- .../core/strapi/lib/commands/actions/develop/action.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/core/strapi/lib/commands/actions/develop/action.js b/packages/core/strapi/lib/commands/actions/develop/action.js index f9133858ef..415285459a 100644 --- a/packages/core/strapi/lib/commands/actions/develop/action.js +++ b/packages/core/strapi/lib/commands/actions/develop/action.js @@ -123,11 +123,12 @@ const workerProcess = async ({ appDir, distDir, watchAdmin, polling, isTSProject if (shouldGenerateTypeScriptTypes) { // This is run in an uncaught promise on purpose so that it doesn't block Strapi startup // NOTE: We should probably add some configuration options to manage the file structure output or the verbosity level - tsUtils.generators.generateSchemasDefinitions({ + await tsUtils.generators.generate({ strapi: strapiInstance, - outDir: appDir, - verbose: false, - silent: true, + pwd: appDir, + rootDir: undefined, + logger: { silent: true, debug: false }, + artefacts: { contentTypes: true, components: true }, }); } From 12c767c002c4b9a4a5b9e1b1bfe84a21545e8805 Mon Sep 17 00:00:00 2001 From: Convly Date: Fri, 12 May 2023 15:51:24 +0200 Subject: [PATCH 077/172] Init type system basis --- .../type-system/core/common/controller.d.ts | 8 + .../lib/type-system/core/common/index.d.ts | 5 + .../type-system/core/common/namespace.d.ts | 88 ++++++++++ .../lib/type-system/core/common/registry.d.ts | 59 +++++++ .../lib/type-system/core/common/service.d.ts | 1 + .../lib/type-system/core/common/uid.d.ts | 153 ++++++++++++++++++ .../strapi/lib/type-system/core/index.d.ts | 1 + .../core/strapi/lib/type-system/index.d.ts | 3 + .../core/strapi/lib/type-system/playground.ts | 82 ++++++++++ .../strapi/lib/type-system/shared/index.d.ts | 1 + .../lib/type-system/shared/registries.d.ts | 29 ++++ .../core/strapi/lib/type-system/utils.d.ts | 7 + packages/core/strapi/lib/types/index.d.ts | 3 + 13 files changed, 440 insertions(+) create mode 100644 packages/core/strapi/lib/type-system/core/common/controller.d.ts create mode 100644 packages/core/strapi/lib/type-system/core/common/index.d.ts create mode 100644 packages/core/strapi/lib/type-system/core/common/namespace.d.ts create mode 100644 packages/core/strapi/lib/type-system/core/common/registry.d.ts create mode 100644 packages/core/strapi/lib/type-system/core/common/service.d.ts create mode 100644 packages/core/strapi/lib/type-system/core/common/uid.d.ts create mode 100644 packages/core/strapi/lib/type-system/core/index.d.ts create mode 100644 packages/core/strapi/lib/type-system/index.d.ts create mode 100644 packages/core/strapi/lib/type-system/playground.ts create mode 100644 packages/core/strapi/lib/type-system/shared/index.d.ts create mode 100644 packages/core/strapi/lib/type-system/shared/registries.d.ts create mode 100644 packages/core/strapi/lib/type-system/utils.d.ts diff --git a/packages/core/strapi/lib/type-system/core/common/controller.d.ts b/packages/core/strapi/lib/type-system/core/common/controller.d.ts new file mode 100644 index 0000000000..1e045aafc3 --- /dev/null +++ b/packages/core/strapi/lib/type-system/core/common/controller.d.ts @@ -0,0 +1,8 @@ +import type koa from 'koa'; + +export type ControllerHandler = ( + context: koa.ExtendableContext, + next: koa.Next +) => Promise | void | Promise | unknown; + +export type Controller = Record; diff --git a/packages/core/strapi/lib/type-system/core/common/index.d.ts b/packages/core/strapi/lib/type-system/core/common/index.d.ts new file mode 100644 index 0000000000..4689628ab9 --- /dev/null +++ b/packages/core/strapi/lib/type-system/core/common/index.d.ts @@ -0,0 +1,5 @@ +export * from './controller'; +export * from './service'; +export * from './namespace'; +export * from './uid'; +export * from './registry'; diff --git a/packages/core/strapi/lib/type-system/core/common/namespace.d.ts b/packages/core/strapi/lib/type-system/core/common/namespace.d.ts new file mode 100644 index 0000000000..7c2553e430 --- /dev/null +++ b/packages/core/strapi/lib/type-system/core/common/namespace.d.ts @@ -0,0 +1,88 @@ +import type { AddSuffix, NonEmpty } from '../../utils'; + +/** + * Namespace for admin resources + */ +export type AdminNamespace = 'admin'; + +/** + * Namespace for strapi internal resources + */ +export type StrapiNamespace = 'strapi'; + +/** + * Namespace for scoped APIs resources + */ +export type ApiNamespace = `api::${T}`; + +/** + * Namespace for scoped plugins resources + */ +export type PluginNamespace = `plugin::${T}`; + +/** + * Namespace for global resources + */ +export type GlobalNamespace = 'global'; + +/** + * Represents any namespace + */ +export type Namespace = + | ApiNamespace + | PluginNamespace + | AdminNamespace + | StrapiNamespace + | GlobalNamespace; + +/** + * Return a {@link Separator} based on the given {@link Namespace} ({@link DotSeparator} for {@link ScopedNamespace} and {@link ColonsSeparator} for regular ones) + * + * @example + * type S = GetNamespaceSeparator + * // ^ '::' + * + * type S = GetNamespaceSeparator + * // ^ '.' + * + * type S = GetNamespaceSeparator + * // ^ '.' | '::' + */ +export type GetNamespaceSeparator = T extends ScopedNamespace + ? // 'api::foo' | 'plugin::bar' => '.' + DotSeparator + : // 'admin' | 'strapi' | 'global' => '::' + ColonsSeparator; + +/** + * Adds the corresponding separator (using {@link GetNamespaceSeparator}) at the end of a namespace + * + * Warning: Using WithSeparator with a union type might produce undesired results as it'll distribute every matching suffix to every union members + * + * @example + * type T = WithSeparator + * // ^ 'admin::' + * + * type T = WithSeparator + * // ^ 'api::{string}.' + * + * type T = WithSeparator + * // ^ 'admin::' | 'admin.' | 'api::{string}.' | 'api::{string}::' + * + * type T = WithSeparator | WithSeparator + * // ^ 'admin::' | 'api::{string}.' + */ +export type WithSeparator = AddSuffix>; + +/** + * Represents namespaces composed of an origin and a name, separated by colons + */ +export type ScopedNamespace = `${string}${ColonsSeparator}${string}`; + +/** + * Separators used to join the different parts of a namespace (e.g. building a uid) + */ +export type Separator = ColonsSeparator | DotSeparator; + +type ColonsSeparator = '::'; +type DotSeparator = '.'; diff --git a/packages/core/strapi/lib/type-system/core/common/registry.d.ts b/packages/core/strapi/lib/type-system/core/common/registry.d.ts new file mode 100644 index 0000000000..6bfb1f3628 --- /dev/null +++ b/packages/core/strapi/lib/type-system/core/common/registry.d.ts @@ -0,0 +1,59 @@ +import { UID, ParsedUID, ParseUID } from './uid'; + +/** + * Extract valid keys from a given registry. + * + * It looks for {@link UID} by default but the search can be narrowed to any UID subset using the `U` generic. + * + * @example + * interface Registry { + * 'foo': unknown; + * 'default.foo': 'unknown'; + * 'global::foo': unknown; + * 'api::foo.bar': unknown; + * } + * + * type T = RegistryKeysBy; + * // ^ 'default.foo' | 'global::foo' | 'api::foo.bar' + * type T = RegistryKeysBy; + * // ^ 'global::foo' | 'api::foo.bar' + * type T = RegistryKeysBy + * // ^ 'api::foo.bar' + */ +export type RegistryKeysBy = Extract; + +/** + * Performs a `Q` filtering operation on the given `T` registry. + * + * `Q` needs to be a partial representation of a {@link ParsedUID} + * + * Note: For additional filtering, the registry keys' type can be passed as the third generic. + * + * @example + * interface Registry { + * 'admin::foo': unknown; + * 'admin::bar': unknown; + * 'api::foo.bar': unknown; + * 'api::foo.baz': unknown; + * 'api::bar.foo': unknown; + * 'plugin::foo.bar': unknown; + * } + * + * type T = keyof Query; + * // ^ "api::foo.bar" | "api::foo.baz" | "api::bar.foo" + * + * type T = keyof Query; + * // ^ "admin::bar" | "api::foo.bar" | "plugin::foo.bar" + * + * type T = keyof Query; + * // ^ "api::foo.bar" | "api::foo.baz" | "api::bar.foo" | 'plugin::foo.bar" + * + * type T = keyof Query; + * // ^ "plugin::foo.bar" | "admin::foo" | "admin::bar" + * + * type T = keyof Query }>; + * // ^ "api::foo.bar" | "api::foo.baz" + */ +export type RegistryQuery, U extends UID = UID> = { + [uid in RegistryKeysBy as ParseUID extends Q ? uid : never]: T[uid]; +}; diff --git a/packages/core/strapi/lib/type-system/core/common/service.d.ts b/packages/core/strapi/lib/type-system/core/common/service.d.ts new file mode 100644 index 0000000000..88cc9a9a5a --- /dev/null +++ b/packages/core/strapi/lib/type-system/core/common/service.d.ts @@ -0,0 +1 @@ +export type Service = Record; diff --git a/packages/core/strapi/lib/type-system/core/common/uid.d.ts b/packages/core/strapi/lib/type-system/core/common/uid.d.ts new file mode 100644 index 0000000000..4c00ccd9f4 --- /dev/null +++ b/packages/core/strapi/lib/type-system/core/common/uid.d.ts @@ -0,0 +1,153 @@ +import type { + AdminNamespace, + ApiNamespace, + WithSeparator, + PluginNamespace, + StrapiNamespace, + GetNamespaceSeparator, + Namespace, + Separator, + GlobalNamespace, +} from './namespace'; +import type { AddSuffix, Literal } from '../../utils'; + +type AddStringSuffix = AddSuffix; + +/** + * Template for services' unique identifier + */ +export type BaseServiceUID = AddStringSuffix< + WithSeparator | WithSeparator | WithSeparator +>; + +/** + * Template for controllers' unique identifier + */ +export type BaseControllerUID = AddStringSuffix< + WithSeparator | WithSeparator | WithSeparator +>; + +/** + * Template for policies' unique identifier + */ +export type BasePolicyUID = AddStringSuffix< + | WithSeparator + | WithSeparator + | WithSeparator + | WithSeparator + | WithSeparator +>; + +/** + * Template for middlewares' unique identifier + */ +export type BaseMiddlewareUID = AddStringSuffix< + | WithSeparator + | WithSeparator + | WithSeparator + | WithSeparator + | WithSeparator +>; + +/** + * Template for content-types' unique identifier + */ +export type BaseContentTypeUID = AddStringSuffix< + | WithSeparator + | WithSeparator + | WithSeparator + | WithSeparator +>; + +/** + * Template for components' unique identifier + * + * Warning: Can cause overlap with other UID formats. + */ +export type BaseComponentUID = `${string}.${string}`; + +/** + * Represents any UID + */ +export type UID = + | BaseServiceUID + | BaseControllerUID + | BasePolicyUID + | BaseMiddlewareUID + | BaseContentTypeUID + | BaseComponentUID; + +/** + * Type representation of every UID component. + * + * The separator type is automatically inferred from the given namespace + */ +export interface ParsedUID { + namespace: N; + separator: GetNamespaceSeparator; + name: E; + raw: `${N}${GetNamespaceSeparator}${E}`; +} + +/** + * Parse an UID literal and returns a {@link ParsedUID} type. + * + * Warning: Using ParseUID with a union type might produce undesired results as it'll distribute every matching namespace parsing to every union members + * + * @example + * type T = ParseUID<'admin::foo'> + * // ^ { namespace: 'admin'; separator: '::'; name: 'foo'; } + * + * type T = ParseUID<'api::foo.bar'> + * // ^ { namespace: 'api::foo'; separator: '.'; name: 'bar'; } + * + * type T = ParseUID<'admin::foo' | 'api::foo.bar'> + * // ^ { namespace: 'admin' | 'api::foo' ; separator: '.' | '::'; name: 'foo' | 'bar' | 'foo.bar'; } + */ +export type ParseUID = ResolveUIDNamespace extends infer B extends Namespace + ? GetNamespaceSeparator extends infer S extends Separator + ? U extends `${infer N extends B}${S}${infer E extends string}` + ? ParsedUID + : never + : never + : never; + +/** + * Determines if the UID's namespace matches the given one. + * + * It returns N (the {@link Namespace} literal) if there is a match, never otherwise. + * + * @example + * type T = AssertUIDNamespace<'admin::foo', AdminNamespace> + * // ^ AdminNamespace + * @example + * type T = AssertUIDNamespace<'foo.bar', ApiNamespace> + * // ^ never + * @example + * type T = AssertUIDNamespace<'api::foo.bar', PluginNamespace> + * // ^ never + */ +export type AssertUIDNamespace = U extends AddStringSuffix< + WithSeparator +> + ? N + : never; + +/** + * Extract the namespace literal from a given UID. + * + * @example + * type T = ResolveUIDNamespace<'admin::foo'> + * // ^ AdminNamespace + * @example + * type T = ResolveUIDNamespace<'api::foo.bar'> + * // ^ ApiNamespace + * @example + * type T = ResolveUIDNamespace<'admin::foo' | 'api::foo.bar'> + * // ^ AdminNamespace | ApiNamespace + */ +export type ResolveUIDNamespace = + | AssertUIDNamespace + | AssertUIDNamespace + | AssertUIDNamespace + | AssertUIDNamespace; diff --git a/packages/core/strapi/lib/type-system/core/index.d.ts b/packages/core/strapi/lib/type-system/core/index.d.ts new file mode 100644 index 0000000000..d0b9323665 --- /dev/null +++ b/packages/core/strapi/lib/type-system/core/index.d.ts @@ -0,0 +1 @@ +export * from './common'; diff --git a/packages/core/strapi/lib/type-system/index.d.ts b/packages/core/strapi/lib/type-system/index.d.ts new file mode 100644 index 0000000000..9c61c6034d --- /dev/null +++ b/packages/core/strapi/lib/type-system/index.d.ts @@ -0,0 +1,3 @@ +export * as core from './core'; +export * as shared from './shared'; +export * as utils from './utils'; diff --git a/packages/core/strapi/lib/type-system/playground.ts b/packages/core/strapi/lib/type-system/playground.ts new file mode 100644 index 0000000000..80a452f416 --- /dev/null +++ b/packages/core/strapi/lib/type-system/playground.ts @@ -0,0 +1,82 @@ +import { shared } from '.'; +import { AdminNamespace, ApiNamespace, ParseUID, RegistryKeysBy, RegistryQuery } from './core'; + +declare module '@strapi/strapi' { + export module shared { + export interface Services { + 'api::foo.bar': { + foo: () => {}; + }; + 'api::foo.baz': { + baz: () => {}; + }; + 'api::bar.foo': { + fn(): number; + }; + 'api::bar.baz': { + fn2(): number; + }; + 'strapi::bar': { + method(): string; + }; + 'foo::bar': {}; + 'plugin::bar.foo': {}; + 'admin::permissions': {}; + 'admin::user': { + create(): void; + delete(): Promise; + }; + } + } +} + +type AdminServices = RemoveNamespace>; + +type RemoveNamespace = { [uid in RegistryKeysBy as ParseUID['name']]: T[uid] }; + +declare const adminServices: AdminServices; + +type FooServices = RemoveNamespace< + RegistryQuery }> +>; +declare const fooServices: FooServices; + +type ParseAPI = RegistryQuery< + T, + { namespace: ApiNamespace } +> extends infer S + ? { + [uid in RegistryKeysBy as ParseUID['name']]: S[uid]; + } + : never; + +// declare const services: BuildRegistryTree; +// services.bar.foo(); +// services.baz.baz(); + +type MapParse = { [uid in RegistryKeysBy]: ParseUID }; + +// // Pick uid:value pairs based on the given query (following the ParsedUID format) +// type PickByQuery> = { +// [uid in RegistryKeysBy as ParseUID extends Q ? uid : never]: T[uid]; +// }; + +// type GroupByApiName = { +// [name in A]: PickByQuery extends infer G +// ? { [uid in RegistryKeysBy as ParseUID['name']]: G[uid] } +// : never; +// }; + +// interface API { +// services: PickByQuery; +// } + +// type TrimNamespaces = { [uid in RegistryKeysBy as ParseUID['name']]: T[uid] }; + +// type P = { [uid in RegistryKeysBy]: ParseUID }; +// type AdminServices = TrimNamespaces>; +// declare const adminServices: AdminServices; + +// // Extract internal service for the main Services registry (uid -> service) +// type InternalServices = PickByQuery; +// const internalServices = {} as InternalServices; diff --git a/packages/core/strapi/lib/type-system/shared/index.d.ts b/packages/core/strapi/lib/type-system/shared/index.d.ts new file mode 100644 index 0000000000..62ba4caa69 --- /dev/null +++ b/packages/core/strapi/lib/type-system/shared/index.d.ts @@ -0,0 +1 @@ +export * from './registries'; diff --git a/packages/core/strapi/lib/type-system/shared/registries.d.ts b/packages/core/strapi/lib/type-system/shared/registries.d.ts new file mode 100644 index 0000000000..0a0301d6b6 --- /dev/null +++ b/packages/core/strapi/lib/type-system/shared/registries.d.ts @@ -0,0 +1,29 @@ +/** + * Shared service registry + */ +export interface Services {} + +/** + * Shared controller registry + */ +export interface Controllers {} + +/** + * Shared policy registry + */ +export interface Policies {} + +/** + * Shared middleware registry + */ +export interface Middlewares {} + +/** + * Shared content-types registry + */ +export interface ContentTypes {} + +/** + * Shared component registry + */ +export interface Components {} diff --git a/packages/core/strapi/lib/type-system/utils.d.ts b/packages/core/strapi/lib/type-system/utils.d.ts new file mode 100644 index 0000000000..2bf51c314d --- /dev/null +++ b/packages/core/strapi/lib/type-system/utils.d.ts @@ -0,0 +1,7 @@ +export type Literal = string | number | bigint | boolean; + +export type Contains = `${string}${S}${string}`; +export type NonEmpty = T extends '' ? never : T; + +export type AddSuffix = `${T}${S}`; +export type AddPrefix = `${S}${T}`; diff --git a/packages/core/strapi/lib/types/index.d.ts b/packages/core/strapi/lib/types/index.d.ts index ada06e2723..322c1f4703 100644 --- a/packages/core/strapi/lib/types/index.d.ts +++ b/packages/core/strapi/lib/types/index.d.ts @@ -2,3 +2,6 @@ export * from './core'; export * as utils from './utils'; export * as factories from './factories'; + +export * as registries from './registry'; +export * as shared from '../type-system/shared'; From 976b098ece048f91b9eb08ba6240621440b34549 Mon Sep 17 00:00:00 2001 From: Convly Date: Mon, 15 May 2023 14:33:50 +0200 Subject: [PATCH 078/172] Implement the type system from within strapi/strapi --- .../strapi/lib/type-system/core/index.d.ts | 1 - .../core/strapi/lib/type-system/index.d.ts | 3 - .../core/strapi/lib/type-system/playground.ts | 82 ------------------- .../core/strapi/lib/type-system/utils.d.ts | 7 -- .../core/common/controller.d.ts | 0 .../core/common/index.d.ts | 0 .../core/common/namespace.d.ts | 17 +++- .../core/common/registry.d.ts | 10 +-- .../core/common/service.d.ts | 0 .../core/common/uid.d.ts | 14 +++- .../core/strapi/lib/types/core/index.d.ts | 1 + packages/core/strapi/lib/types/index.d.ts | 2 +- .../{type-system => types}/shared/index.d.ts | 0 .../shared/registries.d.ts | 0 packages/core/strapi/lib/types/utils.d.ts | 23 ++++++ 15 files changed, 58 insertions(+), 102 deletions(-) delete mode 100644 packages/core/strapi/lib/type-system/core/index.d.ts delete mode 100644 packages/core/strapi/lib/type-system/index.d.ts delete mode 100644 packages/core/strapi/lib/type-system/playground.ts delete mode 100644 packages/core/strapi/lib/type-system/utils.d.ts rename packages/core/strapi/lib/{type-system => types}/core/common/controller.d.ts (100%) rename packages/core/strapi/lib/{type-system => types}/core/common/index.d.ts (100%) rename packages/core/strapi/lib/{type-system => types}/core/common/namespace.d.ts (83%) rename packages/core/strapi/lib/{type-system => types}/core/common/registry.d.ts (81%) rename packages/core/strapi/lib/{type-system => types}/core/common/service.d.ts (100%) rename packages/core/strapi/lib/{type-system => types}/core/common/uid.d.ts (91%) rename packages/core/strapi/lib/{type-system => types}/shared/index.d.ts (100%) rename packages/core/strapi/lib/{type-system => types}/shared/registries.d.ts (100%) diff --git a/packages/core/strapi/lib/type-system/core/index.d.ts b/packages/core/strapi/lib/type-system/core/index.d.ts deleted file mode 100644 index d0b9323665..0000000000 --- a/packages/core/strapi/lib/type-system/core/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './common'; diff --git a/packages/core/strapi/lib/type-system/index.d.ts b/packages/core/strapi/lib/type-system/index.d.ts deleted file mode 100644 index 9c61c6034d..0000000000 --- a/packages/core/strapi/lib/type-system/index.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * as core from './core'; -export * as shared from './shared'; -export * as utils from './utils'; diff --git a/packages/core/strapi/lib/type-system/playground.ts b/packages/core/strapi/lib/type-system/playground.ts deleted file mode 100644 index 80a452f416..0000000000 --- a/packages/core/strapi/lib/type-system/playground.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { shared } from '.'; -import { AdminNamespace, ApiNamespace, ParseUID, RegistryKeysBy, RegistryQuery } from './core'; - -declare module '@strapi/strapi' { - export module shared { - export interface Services { - 'api::foo.bar': { - foo: () => {}; - }; - 'api::foo.baz': { - baz: () => {}; - }; - 'api::bar.foo': { - fn(): number; - }; - 'api::bar.baz': { - fn2(): number; - }; - 'strapi::bar': { - method(): string; - }; - 'foo::bar': {}; - 'plugin::bar.foo': {}; - 'admin::permissions': {}; - 'admin::user': { - create(): void; - delete(): Promise; - }; - } - } -} - -type AdminServices = RemoveNamespace>; - -type RemoveNamespace = { [uid in RegistryKeysBy as ParseUID['name']]: T[uid] }; - -declare const adminServices: AdminServices; - -type FooServices = RemoveNamespace< - RegistryQuery }> ->; -declare const fooServices: FooServices; - -type ParseAPI = RegistryQuery< - T, - { namespace: ApiNamespace } -> extends infer S - ? { - [uid in RegistryKeysBy as ParseUID['name']]: S[uid]; - } - : never; - -// declare const services: BuildRegistryTree; -// services.bar.foo(); -// services.baz.baz(); - -type MapParse = { [uid in RegistryKeysBy]: ParseUID }; - -// // Pick uid:value pairs based on the given query (following the ParsedUID format) -// type PickByQuery> = { -// [uid in RegistryKeysBy as ParseUID extends Q ? uid : never]: T[uid]; -// }; - -// type GroupByApiName = { -// [name in A]: PickByQuery extends infer G -// ? { [uid in RegistryKeysBy as ParseUID['name']]: G[uid] } -// : never; -// }; - -// interface API { -// services: PickByQuery; -// } - -// type TrimNamespaces = { [uid in RegistryKeysBy as ParseUID['name']]: T[uid] }; - -// type P = { [uid in RegistryKeysBy]: ParseUID }; -// type AdminServices = TrimNamespaces>; -// declare const adminServices: AdminServices; - -// // Extract internal service for the main Services registry (uid -> service) -// type InternalServices = PickByQuery; -// const internalServices = {} as InternalServices; diff --git a/packages/core/strapi/lib/type-system/utils.d.ts b/packages/core/strapi/lib/type-system/utils.d.ts deleted file mode 100644 index 2bf51c314d..0000000000 --- a/packages/core/strapi/lib/type-system/utils.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -export type Literal = string | number | bigint | boolean; - -export type Contains = `${string}${S}${string}`; -export type NonEmpty = T extends '' ? never : T; - -export type AddSuffix = `${T}${S}`; -export type AddPrefix = `${S}${T}`; diff --git a/packages/core/strapi/lib/type-system/core/common/controller.d.ts b/packages/core/strapi/lib/types/core/common/controller.d.ts similarity index 100% rename from packages/core/strapi/lib/type-system/core/common/controller.d.ts rename to packages/core/strapi/lib/types/core/common/controller.d.ts diff --git a/packages/core/strapi/lib/type-system/core/common/index.d.ts b/packages/core/strapi/lib/types/core/common/index.d.ts similarity index 100% rename from packages/core/strapi/lib/type-system/core/common/index.d.ts rename to packages/core/strapi/lib/types/core/common/index.d.ts diff --git a/packages/core/strapi/lib/type-system/core/common/namespace.d.ts b/packages/core/strapi/lib/types/core/common/namespace.d.ts similarity index 83% rename from packages/core/strapi/lib/type-system/core/common/namespace.d.ts rename to packages/core/strapi/lib/types/core/common/namespace.d.ts index 7c2553e430..975275c77a 100644 --- a/packages/core/strapi/lib/type-system/core/common/namespace.d.ts +++ b/packages/core/strapi/lib/types/core/common/namespace.d.ts @@ -77,7 +77,22 @@ export type WithSeparator = AddSuffix = Namespace & + `${O}${ColonsSeparator}${S}`; + +/** + * Extract the scope from the given scoped namespace + */ +export type ExtractNamespaceScope = T extends `${string}${ColonsSeparator}${infer S}` + ? S + : never; + +/** + * Extract the origin from the given scoped namespace + */ +export type ExtractNamespaceOrigin = T extends `${infer S}${ColonsSeparator}${string}` + ? S + : never; /** * Separators used to join the different parts of a namespace (e.g. building a uid) diff --git a/packages/core/strapi/lib/type-system/core/common/registry.d.ts b/packages/core/strapi/lib/types/core/common/registry.d.ts similarity index 81% rename from packages/core/strapi/lib/type-system/core/common/registry.d.ts rename to packages/core/strapi/lib/types/core/common/registry.d.ts index 6bfb1f3628..8b4f10cbcc 100644 --- a/packages/core/strapi/lib/type-system/core/common/registry.d.ts +++ b/packages/core/strapi/lib/types/core/common/registry.d.ts @@ -39,19 +39,19 @@ export type RegistryKeysBy = Extract; * 'plugin::foo.bar': unknown; * } * - * type T = keyof Query; + * type T = keyof RegistryQuery; * // ^ "api::foo.bar" | "api::foo.baz" | "api::bar.foo" * - * type T = keyof Query; + * type T = keyof RegistryQuery; * // ^ "admin::bar" | "api::foo.bar" | "plugin::foo.bar" * - * type T = keyof Query; + * type T = keyof RegistryQuery; * // ^ "api::foo.bar" | "api::foo.baz" | "api::bar.foo" | 'plugin::foo.bar" * - * type T = keyof Query; + * type T = keyof RegistryQuery; * // ^ "plugin::foo.bar" | "admin::foo" | "admin::bar" * - * type T = keyof Query }>; + * type T = keyof RegistryQuery }>; * // ^ "api::foo.bar" | "api::foo.baz" */ export type RegistryQuery, U extends UID = UID> = { diff --git a/packages/core/strapi/lib/type-system/core/common/service.d.ts b/packages/core/strapi/lib/types/core/common/service.d.ts similarity index 100% rename from packages/core/strapi/lib/type-system/core/common/service.d.ts rename to packages/core/strapi/lib/types/core/common/service.d.ts diff --git a/packages/core/strapi/lib/type-system/core/common/uid.d.ts b/packages/core/strapi/lib/types/core/common/uid.d.ts similarity index 91% rename from packages/core/strapi/lib/type-system/core/common/uid.d.ts rename to packages/core/strapi/lib/types/core/common/uid.d.ts index 4c00ccd9f4..b9ad57483c 100644 --- a/packages/core/strapi/lib/type-system/core/common/uid.d.ts +++ b/packages/core/strapi/lib/types/core/common/uid.d.ts @@ -8,8 +8,11 @@ import type { Namespace, Separator, GlobalNamespace, + ScopedNamespace, + ExtractNamespaceScope, + ExtractNamespaceOrigin, } from './namespace'; -import type { AddSuffix, Literal } from '../../utils'; +import type { AddSuffix } from '../../utils'; type AddStringSuffix = AddSuffix; @@ -83,10 +86,12 @@ export type UID = * The separator type is automatically inferred from the given namespace */ export interface ParsedUID { + raw: `${N}${GetNamespaceSeparator}${E}`; namespace: N; + origin: N extends ScopedNamespace ? ExtractNamespaceOrigin : N; + scope: N extends ScopedNamespace ? ExtractNamespaceScope : never; separator: GetNamespaceSeparator; name: E; - raw: `${N}${GetNamespaceSeparator}${E}`; } /** @@ -133,6 +138,11 @@ export type AssertUIDNamespace = U extends A ? N : never; +/** + * Get parsed properties from a given raw UID + */ +export type ExtractFromUID = ParseUID[P]; + /** * Extract the namespace literal from a given UID. * diff --git a/packages/core/strapi/lib/types/core/index.d.ts b/packages/core/strapi/lib/types/core/index.d.ts index e9c0460970..4979b8495a 100644 --- a/packages/core/strapi/lib/types/core/index.d.ts +++ b/packages/core/strapi/lib/types/core/index.d.ts @@ -1,3 +1,4 @@ export * from './attributes'; export * from './schemas'; export * from './strapi'; +export * from './common'; diff --git a/packages/core/strapi/lib/types/index.d.ts b/packages/core/strapi/lib/types/index.d.ts index 322c1f4703..5aaa05be63 100644 --- a/packages/core/strapi/lib/types/index.d.ts +++ b/packages/core/strapi/lib/types/index.d.ts @@ -4,4 +4,4 @@ export * as utils from './utils'; export * as factories from './factories'; export * as registries from './registry'; -export * as shared from '../type-system/shared'; +export * as shared from './shared'; diff --git a/packages/core/strapi/lib/type-system/shared/index.d.ts b/packages/core/strapi/lib/types/shared/index.d.ts similarity index 100% rename from packages/core/strapi/lib/type-system/shared/index.d.ts rename to packages/core/strapi/lib/types/shared/index.d.ts diff --git a/packages/core/strapi/lib/type-system/shared/registries.d.ts b/packages/core/strapi/lib/types/shared/registries.d.ts similarity index 100% rename from packages/core/strapi/lib/type-system/shared/registries.d.ts rename to packages/core/strapi/lib/types/shared/registries.d.ts diff --git a/packages/core/strapi/lib/types/utils.d.ts b/packages/core/strapi/lib/types/utils.d.ts index b1360c377b..c5430474e4 100644 --- a/packages/core/strapi/lib/types/utils.d.ts +++ b/packages/core/strapi/lib/types/utils.d.ts @@ -4,6 +4,29 @@ * * */ +export type Literal = string | number | bigint | boolean; + +export type Contains = `${string}${S}${string}`; +export type NonEmpty = T extends '' ? never : T; + +export type Split = T extends `${infer A}${S}${infer B}` + ? [A, ...Split] + : T extends '' + ? [] + : [T]; + +export type Join = T extends [ + infer F extends Literal, + ...infer R +] + ? R['length'] extends 0 + ? F + : `${F}${S}${Join}` + : never; + +export type AddSuffix = `${T}${S}`; +export type AddPrefix = `${S}${T}`; + /** * * Extract the array values into an union type From cf0fa4e22a85bca12a1a2c9ef7b556acf9571063 Mon Sep 17 00:00:00 2001 From: Convly Date: Mon, 15 May 2023 15:09:36 +0200 Subject: [PATCH 079/172] Add missing assert test for the global namespace --- packages/core/strapi/lib/types/core/common/uid.d.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/core/strapi/lib/types/core/common/uid.d.ts b/packages/core/strapi/lib/types/core/common/uid.d.ts index b9ad57483c..6b0cbea9ad 100644 --- a/packages/core/strapi/lib/types/core/common/uid.d.ts +++ b/packages/core/strapi/lib/types/core/common/uid.d.ts @@ -160,4 +160,5 @@ export type ResolveUIDNamespace = | AssertUIDNamespace | AssertUIDNamespace | AssertUIDNamespace - | AssertUIDNamespace; + | AssertUIDNamespace + | AssertUIDNamespace; From 39c2ffa08fd36a924148e8b4e06d551b8461af9f Mon Sep 17 00:00:00 2001 From: Convly Date: Mon, 15 May 2023 15:10:34 +0200 Subject: [PATCH 080/172] Remove invalid import --- packages/core/strapi/lib/types/index.d.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/core/strapi/lib/types/index.d.ts b/packages/core/strapi/lib/types/index.d.ts index 5aaa05be63..540ddd64db 100644 --- a/packages/core/strapi/lib/types/index.d.ts +++ b/packages/core/strapi/lib/types/index.d.ts @@ -3,5 +3,4 @@ export * from './core'; export * as utils from './utils'; export * as factories from './factories'; -export * as registries from './registry'; export * as shared from './shared'; From 03910de1200ca6eda4511b0571c7633dd00d3283 Mon Sep 17 00:00:00 2001 From: Convly Date: Mon, 15 May 2023 15:14:29 +0200 Subject: [PATCH 081/172] Add comments & rename some utilities --- .../lib/types/core/common/namespace.d.ts | 4 +-- .../strapi/lib/types/core/common/uid.d.ts | 16 +++++------ packages/core/strapi/lib/types/utils.d.ts | 27 +++++++++++++++++-- 3 files changed, 35 insertions(+), 12 deletions(-) diff --git a/packages/core/strapi/lib/types/core/common/namespace.d.ts b/packages/core/strapi/lib/types/core/common/namespace.d.ts index 975275c77a..b31d679564 100644 --- a/packages/core/strapi/lib/types/core/common/namespace.d.ts +++ b/packages/core/strapi/lib/types/core/common/namespace.d.ts @@ -1,4 +1,4 @@ -import type { AddSuffix, NonEmpty } from '../../utils'; +import type { Suffix, NonEmpty } from '../../utils'; /** * Namespace for admin resources @@ -72,7 +72,7 @@ export type GetNamespaceSeparator = T extends S * type T = WithSeparator | WithSeparator * // ^ 'admin::' | 'api::{string}.' */ -export type WithSeparator = AddSuffix>; +export type WithSeparator = Suffix>; /** * Represents namespaces composed of an origin and a name, separated by colons diff --git a/packages/core/strapi/lib/types/core/common/uid.d.ts b/packages/core/strapi/lib/types/core/common/uid.d.ts index 6b0cbea9ad..66295e7af0 100644 --- a/packages/core/strapi/lib/types/core/common/uid.d.ts +++ b/packages/core/strapi/lib/types/core/common/uid.d.ts @@ -12,28 +12,28 @@ import type { ExtractNamespaceScope, ExtractNamespaceOrigin, } from './namespace'; -import type { AddSuffix } from '../../utils'; +import type { Suffix } from '../../utils'; -type AddStringSuffix = AddSuffix; +type StringSuffix = Suffix; /** * Template for services' unique identifier */ -export type BaseServiceUID = AddStringSuffix< +export type BaseServiceUID = StringSuffix< WithSeparator | WithSeparator | WithSeparator >; /** * Template for controllers' unique identifier */ -export type BaseControllerUID = AddStringSuffix< +export type BaseControllerUID = StringSuffix< WithSeparator | WithSeparator | WithSeparator >; /** * Template for policies' unique identifier */ -export type BasePolicyUID = AddStringSuffix< +export type BasePolicyUID = StringSuffix< | WithSeparator | WithSeparator | WithSeparator @@ -44,7 +44,7 @@ export type BasePolicyUID = AddStringSuffix< /** * Template for middlewares' unique identifier */ -export type BaseMiddlewareUID = AddStringSuffix< +export type BaseMiddlewareUID = StringSuffix< | WithSeparator | WithSeparator | WithSeparator @@ -55,7 +55,7 @@ export type BaseMiddlewareUID = AddStringSuffix< /** * Template for content-types' unique identifier */ -export type BaseContentTypeUID = AddStringSuffix< +export type BaseContentTypeUID = StringSuffix< | WithSeparator | WithSeparator | WithSeparator @@ -132,7 +132,7 @@ export type ParseUID = ResolveUIDNamespace extends infer B ext * type T = AssertUIDNamespace<'api::foo.bar', PluginNamespace> * // ^ never */ -export type AssertUIDNamespace = U extends AddStringSuffix< +export type AssertUIDNamespace = U extends StringSuffix< WithSeparator > ? N diff --git a/packages/core/strapi/lib/types/utils.d.ts b/packages/core/strapi/lib/types/utils.d.ts index c5430474e4..10f2534bd5 100644 --- a/packages/core/strapi/lib/types/utils.d.ts +++ b/packages/core/strapi/lib/types/utils.d.ts @@ -4,17 +4,33 @@ * * */ +/** + * Alias for any literal type (useful for template string parameters) + */ export type Literal = string | number | bigint | boolean; +/** + * Used to check if a string contains a given literal + */ export type Contains = `${string}${S}${string}`; + +/** + * Used to make sure the given string is not empty + */ export type NonEmpty = T extends '' ? never : T; +/** + * Split the given string into a tuple using the given `S` literal + */ export type Split = T extends `${infer A}${S}${infer B}` ? [A, ...Split] : T extends '' ? [] : [T]; +/** + * Aggregate the given typle into a string, separated by the given `S` literal + */ export type Join = T extends [ infer F extends Literal, ...infer R @@ -24,8 +40,15 @@ export type Join = T extends [ : `${F}${S}${Join}` : never; -export type AddSuffix = `${T}${S}`; -export type AddPrefix = `${S}${T}`; +/** + * Add a literal suffix (`S`) at the end of the given string + */ +export type Suffix = `${T}${S}`; + +/** + * Add a literal prefix (`S`) at the beginning of the given string + */ +export type Prefix = `${S}${T}`; /** * From 4761d9c6228756c4cd010a67f9e8c48c6af10bca Mon Sep 17 00:00:00 2001 From: Convly Date: Mon, 15 May 2023 15:16:12 +0200 Subject: [PATCH 082/172] Fix typo --- packages/core/strapi/lib/types/utils.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/strapi/lib/types/utils.d.ts b/packages/core/strapi/lib/types/utils.d.ts index 10f2534bd5..d09cffd5f7 100644 --- a/packages/core/strapi/lib/types/utils.d.ts +++ b/packages/core/strapi/lib/types/utils.d.ts @@ -29,7 +29,7 @@ export type Split = T extends `${infer A}${ : [T]; /** - * Aggregate the given typle into a string, separated by the given `S` literal + * Aggregate the given tuple into a string, separated by the given `S` literal */ export type Join = T extends [ infer F extends Literal, From b585434412575461e1758ac6288f0f529c656ebb Mon Sep 17 00:00:00 2001 From: Convly Date: Mon, 15 May 2023 15:50:44 +0200 Subject: [PATCH 083/172] Update the controller type to make it more generic --- packages/core/strapi/lib/types/core/common/controller.d.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/strapi/lib/types/core/common/controller.d.ts b/packages/core/strapi/lib/types/core/common/controller.d.ts index 1e045aafc3..971a4c8d15 100644 --- a/packages/core/strapi/lib/types/core/common/controller.d.ts +++ b/packages/core/strapi/lib/types/core/common/controller.d.ts @@ -1,8 +1,8 @@ import type koa from 'koa'; -export type ControllerHandler = ( +export type ControllerHandler = ( context: koa.ExtendableContext, next: koa.Next -) => Promise | void | Promise | unknown; +) => Promise | T; export type Controller = Record; From 47e48cc304fe6d1bfb8e9448524b3d88ae474dfd Mon Sep 17 00:00:00 2001 From: Convly Date: Mon, 15 May 2023 17:22:21 +0200 Subject: [PATCH 084/172] Scope types with modules --- .../strapi/lib/types/core/common/index.d.ts | 3 - .../lib/types/core/common/namespace.d.ts | 103 ----------- .../strapi/lib/types/core/common/uid.d.ts | 164 ------------------ .../core/strapi/lib/types/core/index.d.ts | 6 +- .../core/strapi/lib/types/core/namespace.d.ts | 94 ++++++++++ .../lib/types/core/{common => }/registry.d.ts | 28 +-- packages/core/strapi/lib/types/core/uid.d.ts | 154 ++++++++++++++++ packages/core/strapi/lib/types/index.d.ts | 3 +- 8 files changed, 269 insertions(+), 286 deletions(-) delete mode 100644 packages/core/strapi/lib/types/core/common/namespace.d.ts delete mode 100644 packages/core/strapi/lib/types/core/common/uid.d.ts create mode 100644 packages/core/strapi/lib/types/core/namespace.d.ts rename packages/core/strapi/lib/types/core/{common => }/registry.d.ts (51%) create mode 100644 packages/core/strapi/lib/types/core/uid.d.ts diff --git a/packages/core/strapi/lib/types/core/common/index.d.ts b/packages/core/strapi/lib/types/core/common/index.d.ts index 4689628ab9..4c83565edb 100644 --- a/packages/core/strapi/lib/types/core/common/index.d.ts +++ b/packages/core/strapi/lib/types/core/common/index.d.ts @@ -1,5 +1,2 @@ export * from './controller'; export * from './service'; -export * from './namespace'; -export * from './uid'; -export * from './registry'; diff --git a/packages/core/strapi/lib/types/core/common/namespace.d.ts b/packages/core/strapi/lib/types/core/common/namespace.d.ts deleted file mode 100644 index b31d679564..0000000000 --- a/packages/core/strapi/lib/types/core/common/namespace.d.ts +++ /dev/null @@ -1,103 +0,0 @@ -import type { Suffix, NonEmpty } from '../../utils'; - -/** - * Namespace for admin resources - */ -export type AdminNamespace = 'admin'; - -/** - * Namespace for strapi internal resources - */ -export type StrapiNamespace = 'strapi'; - -/** - * Namespace for scoped APIs resources - */ -export type ApiNamespace = `api::${T}`; - -/** - * Namespace for scoped plugins resources - */ -export type PluginNamespace = `plugin::${T}`; - -/** - * Namespace for global resources - */ -export type GlobalNamespace = 'global'; - -/** - * Represents any namespace - */ -export type Namespace = - | ApiNamespace - | PluginNamespace - | AdminNamespace - | StrapiNamespace - | GlobalNamespace; - -/** - * Return a {@link Separator} based on the given {@link Namespace} ({@link DotSeparator} for {@link ScopedNamespace} and {@link ColonsSeparator} for regular ones) - * - * @example - * type S = GetNamespaceSeparator - * // ^ '::' - * - * type S = GetNamespaceSeparator - * // ^ '.' - * - * type S = GetNamespaceSeparator - * // ^ '.' | '::' - */ -export type GetNamespaceSeparator = T extends ScopedNamespace - ? // 'api::foo' | 'plugin::bar' => '.' - DotSeparator - : // 'admin' | 'strapi' | 'global' => '::' - ColonsSeparator; - -/** - * Adds the corresponding separator (using {@link GetNamespaceSeparator}) at the end of a namespace - * - * Warning: Using WithSeparator with a union type might produce undesired results as it'll distribute every matching suffix to every union members - * - * @example - * type T = WithSeparator - * // ^ 'admin::' - * - * type T = WithSeparator - * // ^ 'api::{string}.' - * - * type T = WithSeparator - * // ^ 'admin::' | 'admin.' | 'api::{string}.' | 'api::{string}::' - * - * type T = WithSeparator | WithSeparator - * // ^ 'admin::' | 'api::{string}.' - */ -export type WithSeparator = Suffix>; - -/** - * Represents namespaces composed of an origin and a name, separated by colons - */ -export type ScopedNamespace = Namespace & - `${O}${ColonsSeparator}${S}`; - -/** - * Extract the scope from the given scoped namespace - */ -export type ExtractNamespaceScope = T extends `${string}${ColonsSeparator}${infer S}` - ? S - : never; - -/** - * Extract the origin from the given scoped namespace - */ -export type ExtractNamespaceOrigin = T extends `${infer S}${ColonsSeparator}${string}` - ? S - : never; - -/** - * Separators used to join the different parts of a namespace (e.g. building a uid) - */ -export type Separator = ColonsSeparator | DotSeparator; - -type ColonsSeparator = '::'; -type DotSeparator = '.'; diff --git a/packages/core/strapi/lib/types/core/common/uid.d.ts b/packages/core/strapi/lib/types/core/common/uid.d.ts deleted file mode 100644 index 66295e7af0..0000000000 --- a/packages/core/strapi/lib/types/core/common/uid.d.ts +++ /dev/null @@ -1,164 +0,0 @@ -import type { - AdminNamespace, - ApiNamespace, - WithSeparator, - PluginNamespace, - StrapiNamespace, - GetNamespaceSeparator, - Namespace, - Separator, - GlobalNamespace, - ScopedNamespace, - ExtractNamespaceScope, - ExtractNamespaceOrigin, -} from './namespace'; -import type { Suffix } from '../../utils'; - -type StringSuffix = Suffix; - -/** - * Template for services' unique identifier - */ -export type BaseServiceUID = StringSuffix< - WithSeparator | WithSeparator | WithSeparator ->; - -/** - * Template for controllers' unique identifier - */ -export type BaseControllerUID = StringSuffix< - WithSeparator | WithSeparator | WithSeparator ->; - -/** - * Template for policies' unique identifier - */ -export type BasePolicyUID = StringSuffix< - | WithSeparator - | WithSeparator - | WithSeparator - | WithSeparator - | WithSeparator ->; - -/** - * Template for middlewares' unique identifier - */ -export type BaseMiddlewareUID = StringSuffix< - | WithSeparator - | WithSeparator - | WithSeparator - | WithSeparator - | WithSeparator ->; - -/** - * Template for content-types' unique identifier - */ -export type BaseContentTypeUID = StringSuffix< - | WithSeparator - | WithSeparator - | WithSeparator - | WithSeparator ->; - -/** - * Template for components' unique identifier - * - * Warning: Can cause overlap with other UID formats. - */ -export type BaseComponentUID = `${string}.${string}`; - -/** - * Represents any UID - */ -export type UID = - | BaseServiceUID - | BaseControllerUID - | BasePolicyUID - | BaseMiddlewareUID - | BaseContentTypeUID - | BaseComponentUID; - -/** - * Type representation of every UID component. - * - * The separator type is automatically inferred from the given namespace - */ -export interface ParsedUID { - raw: `${N}${GetNamespaceSeparator}${E}`; - namespace: N; - origin: N extends ScopedNamespace ? ExtractNamespaceOrigin : N; - scope: N extends ScopedNamespace ? ExtractNamespaceScope : never; - separator: GetNamespaceSeparator; - name: E; -} - -/** - * Parse an UID literal and returns a {@link ParsedUID} type. - * - * Warning: Using ParseUID with a union type might produce undesired results as it'll distribute every matching namespace parsing to every union members - * - * @example - * type T = ParseUID<'admin::foo'> - * // ^ { namespace: 'admin'; separator: '::'; name: 'foo'; } - * - * type T = ParseUID<'api::foo.bar'> - * // ^ { namespace: 'api::foo'; separator: '.'; name: 'bar'; } - * - * type T = ParseUID<'admin::foo' | 'api::foo.bar'> - * // ^ { namespace: 'admin' | 'api::foo' ; separator: '.' | '::'; name: 'foo' | 'bar' | 'foo.bar'; } - */ -export type ParseUID = ResolveUIDNamespace extends infer B extends Namespace - ? GetNamespaceSeparator extends infer S extends Separator - ? U extends `${infer N extends B}${S}${infer E extends string}` - ? ParsedUID - : never - : never - : never; - -/** - * Determines if the UID's namespace matches the given one. - * - * It returns N (the {@link Namespace} literal) if there is a match, never otherwise. - * - * @example - * type T = AssertUIDNamespace<'admin::foo', AdminNamespace> - * // ^ AdminNamespace - * @example - * type T = AssertUIDNamespace<'foo.bar', ApiNamespace> - * // ^ never - * @example - * type T = AssertUIDNamespace<'api::foo.bar', PluginNamespace> - * // ^ never - */ -export type AssertUIDNamespace = U extends StringSuffix< - WithSeparator -> - ? N - : never; - -/** - * Get parsed properties from a given raw UID - */ -export type ExtractFromUID = ParseUID[P]; - -/** - * Extract the namespace literal from a given UID. - * - * @example - * type T = ResolveUIDNamespace<'admin::foo'> - * // ^ AdminNamespace - * @example - * type T = ResolveUIDNamespace<'api::foo.bar'> - * // ^ ApiNamespace - * @example - * type T = ResolveUIDNamespace<'admin::foo' | 'api::foo.bar'> - * // ^ AdminNamespace | ApiNamespace - */ -export type ResolveUIDNamespace = - | AssertUIDNamespace - | AssertUIDNamespace - | AssertUIDNamespace - | AssertUIDNamespace - | AssertUIDNamespace; diff --git a/packages/core/strapi/lib/types/core/index.d.ts b/packages/core/strapi/lib/types/core/index.d.ts index 4979b8495a..f6337f06f1 100644 --- a/packages/core/strapi/lib/types/core/index.d.ts +++ b/packages/core/strapi/lib/types/core/index.d.ts @@ -1,4 +1,8 @@ export * from './attributes'; export * from './schemas'; export * from './strapi'; -export * from './common'; + +export * as Common from './common'; +export * as Namespace from './namespace'; +export * as UID from './uid'; +export * as Registry from './registry'; diff --git a/packages/core/strapi/lib/types/core/namespace.d.ts b/packages/core/strapi/lib/types/core/namespace.d.ts new file mode 100644 index 0000000000..5b99513826 --- /dev/null +++ b/packages/core/strapi/lib/types/core/namespace.d.ts @@ -0,0 +1,94 @@ +import type * as Utils from '../utils'; + +/** + * Namespace for admin resources + */ +export type Admin = 'admin'; + +/** + * Namespace for strapi internal resources + */ +export type Strapi = 'strapi'; + +/** + * Namespace for scoped APIs resources + */ +export type API = `api::${T}`; + +/** + * Namespace for scoped plugins resources + */ +export type Plugin = `plugin::${T}`; + +/** + * Namespace for global resources + */ +export type Global = 'global'; + +/** + * Represents any namespace + */ +export type Any = API | Plugin | Admin | Strapi | Global; + +/** + * Return a {@link Separator} based on the given {@link Any} ({@link DotSeparator} for {@link Scoped} and {@link ColonsSeparator} for regular ones) + * + * @example + * type S = GetSeparator + * // ^ '::' + * + * type S = GetSeparator + * // ^ '.' + * + * type S = GetSeparator + * // ^ '.' | '::' + */ +export type GetSeparator = T extends Scoped + ? // 'api::foo' | 'plugin::bar' => '.' + DotSeparator + : // 'admin' | 'strapi' | 'global' => '::' + ColonsSeparator; + +/** + * Adds the corresponding separator (using {@link GetSeparator}) at the end of a namespace + * + * Warning: Using WithSeparator with a union type might produce undesired results as it'll distribute every matching suffix to every union members + * + * @example + * type T = WithSeparator + * // ^ 'admin::' + * + * type T = WithSeparator + * // ^ 'api::{string}.' + * + * type T = WithSeparator + * // ^ 'admin::' | 'admin.' | 'api::{string}.' | 'api::{string}::' + * + * type T = WithSeparator | WithSeparator + * // ^ 'admin::' | 'api::{string}.' + */ +export type WithSeparator = Utils.Suffix>; + +/** + * Represents namespaces composed of an origin and a name, separated by colons + */ +export type Scoped = Any & + `${O}${ColonsSeparator}${S}`; + +/** + * Extract the scope from the given scoped namespace + */ +export type ExtractScope = T extends `${string}${ColonsSeparator}${infer S}` ? S : never; + +/** + * Extract the origin from the given scoped namespace + */ +export type ExtractOrigin = T extends `${infer S}${ColonsSeparator}${string}` ? S : never; + +/** + * Separators used to join the different parts of a namespace (e.g. building a uid) + */ +export type Separator = ColonsSeparator | DotSeparator; + +type ColonsSeparator = '::'; +type DotSeparator = '.'; diff --git a/packages/core/strapi/lib/types/core/common/registry.d.ts b/packages/core/strapi/lib/types/core/registry.d.ts similarity index 51% rename from packages/core/strapi/lib/types/core/common/registry.d.ts rename to packages/core/strapi/lib/types/core/registry.d.ts index 8b4f10cbcc..c204bb2a20 100644 --- a/packages/core/strapi/lib/types/core/common/registry.d.ts +++ b/packages/core/strapi/lib/types/core/registry.d.ts @@ -1,9 +1,9 @@ -import { UID, ParsedUID, ParseUID } from './uid'; +import type * as UID from './uid'; /** * Extract valid keys from a given registry. * - * It looks for {@link UID} by default but the search can be narrowed to any UID subset using the `U` generic. + * It looks for {@link UID.Any} by default but the search can be narrowed to any UID subset using the `U` generic. * * @example * interface Registry { @@ -13,19 +13,19 @@ import { UID, ParsedUID, ParseUID } from './uid'; * 'api::foo.bar': unknown; * } * - * type T = RegistryKeysBy; + * type T = Keys; * // ^ 'default.foo' | 'global::foo' | 'api::foo.bar' - * type T = RegistryKeysBy; + * type T = Keys; * // ^ 'global::foo' | 'api::foo.bar' - * type T = RegistryKeysBy + * type T = Keys * // ^ 'api::foo.bar' */ -export type RegistryKeysBy = Extract; +export type Keys = Extract; /** * Performs a `Q` filtering operation on the given `T` registry. * - * `Q` needs to be a partial representation of a {@link ParsedUID} + * `Q` needs to be a partial representation of a {@link UID.Parsed} * * Note: For additional filtering, the registry keys' type can be passed as the third generic. * @@ -39,21 +39,21 @@ export type RegistryKeysBy = Extract; * 'plugin::foo.bar': unknown; * } * - * type T = keyof RegistryQuery; + * type T = keyof WhereKeys; * // ^ "api::foo.bar" | "api::foo.baz" | "api::bar.foo" * - * type T = keyof RegistryQuery; + * type T = keyof WhereKeys; * // ^ "admin::bar" | "api::foo.bar" | "plugin::foo.bar" * - * type T = keyof RegistryQuery; + * type T = keyof WhereKeys; * // ^ "api::foo.bar" | "api::foo.baz" | "api::bar.foo" | 'plugin::foo.bar" * - * type T = keyof RegistryQuery; + * type T = keyof WhereKeys; * // ^ "plugin::foo.bar" | "admin::foo" | "admin::bar" * - * type T = keyof RegistryQuery }>; + * type T = keyof WhereKeys }>; * // ^ "api::foo.bar" | "api::foo.baz" */ -export type RegistryQuery, U extends UID = UID> = { - [uid in RegistryKeysBy as ParseUID extends Q ? uid : never]: T[uid]; +export type WhereKeys, U extends UID.Any = UID.Any> = { + [uid in Keys as UID.Parse extends Q ? uid : never]: T[uid]; }; diff --git a/packages/core/strapi/lib/types/core/uid.d.ts b/packages/core/strapi/lib/types/core/uid.d.ts new file mode 100644 index 0000000000..9c132eec0e --- /dev/null +++ b/packages/core/strapi/lib/types/core/uid.d.ts @@ -0,0 +1,154 @@ +import type * as Namespace from './namespace'; +import type * as Utils from '../utils'; + +type StringSuffix = Utils.Suffix; + +/** + * Template for services' unique identifier + */ +export type Service = StringSuffix< + | Namespace.WithSeparator + | Namespace.WithSeparator + | Namespace.WithSeparator +>; + +/** + * Template for controllers' unique identifier + */ +export type Controller = StringSuffix< + | Namespace.WithSeparator + | Namespace.WithSeparator + | Namespace.WithSeparator +>; + +/** + * Template for policies' unique identifier + */ +export type Policy = StringSuffix< + | Namespace.WithSeparator + | Namespace.WithSeparator + | Namespace.WithSeparator + | Namespace.WithSeparator + | Namespace.WithSeparator +>; + +/** + * Template for middlewares' unique identifier + */ +export type Middleware = StringSuffix< + | Namespace.WithSeparator + | Namespace.WithSeparator + | Namespace.WithSeparator + | Namespace.WithSeparator + | Namespace.WithSeparator +>; + +/** + * Template for content-types' unique identifier + */ +export type ContentType = StringSuffix< + | Namespace.WithSeparator + | Namespace.WithSeparator + | Namespace.WithSeparator + | Namespace.WithSeparator +>; + +/** + * Template for components' unique identifier + * + * Warning: Can cause overlap with other UID formats. + */ +export type Component = `${string}.${string}`; + +/** + * Represents any UID + */ +export type Any = Service | Controller | Policy | Middleware | ContentType | Component; + +/** + * Type representation of every UID component. + * + * The separator type is automatically inferred from the given namespace + */ +export interface Parsed { + raw: `${N}${Namespace.GetSeparator}${E}`; + namespace: N; + origin: N extends Namespace.Scoped ? Namespace.ExtractOrigin : N; + scope: N extends Namespace.Scoped ? Namespace.ExtractScope : never; + separator: Namespace.GetSeparator; + name: E; +} + +/** + * Parse an UID literal and returns a {@link Parsed} type. + * + * Warning: Using ParseUID with a union type might produce undesired results as it'll distribute every matching namespace parsing to every union members + * + * @example + * type T = Parse<'admin::foo'> + * // ^ { namespace: 'admin'; separator: '::'; name: 'foo'; } + * + * type T = Parse<'api::foo.bar'> + * // ^ { namespace: 'api::foo'; separator: '.'; name: 'bar'; } + * + * type T = Parse<'admin::foo' | 'api::foo.bar'> + * // ^ { namespace: 'admin' | 'api::foo' ; separator: '.' | '::'; name: 'foo' | 'bar' | 'foo.bar'; } + */ +export type Parse = ExtractNamespace extends infer B extends Namespace.Any + ? Namespace.GetSeparator extends infer S extends Namespace.Separator + ? U extends `${infer N extends B}${S}${infer E extends string}` + ? Parsed + : never + : never + : never; + +/** + * Determines if the UID's namespace matches the given one. + * + * It returns N (the {@link Namespace.Any} literal) if there is a match, never otherwise. + * + * @example + * type T = AssertNamespaceIs<'admin::foo', Namespace.Admin> + * // ^ Namespace.Admin + * @example + * type T = AssertNamespaceIs<'foo.bar', Namespace.API> + * // ^ never + * @example + * type T = AssertNamespaceIs<'api::foo.bar', Namespace.Plugin> + * // ^ never + */ +export type AssertNamespaceIs = U extends StringSuffix< + Namespace.WithSeparator +> + ? N + : never; + +/** + * Get parsed properties from a given raw UID + */ +export type Get = Parse[P]; + +/** + * Pick parsed properties from a given raw UID + */ +export type Select> = Pick, P>; + +/** + * Extract the namespace literal from a given UID. + * + * @example + * type T = ResolveUIDNamespace<'admin::foo'> + * // ^ AdminNamespace + * @example + * type T = ResolveUIDNamespace<'api::foo.bar'> + * // ^ ApiNamespace + * @example + * type T = ResolveUIDNamespace<'admin::foo' | 'api::foo.bar'> + * // ^ AdminNamespace | ApiNamespace + */ +export type ExtractNamespace = + | AssertNamespaceIs + | AssertNamespaceIs + | AssertNamespaceIs + | AssertNamespaceIs + | AssertNamespaceIs; diff --git a/packages/core/strapi/lib/types/index.d.ts b/packages/core/strapi/lib/types/index.d.ts index 540ddd64db..502bee2dff 100644 --- a/packages/core/strapi/lib/types/index.d.ts +++ b/packages/core/strapi/lib/types/index.d.ts @@ -1,6 +1,7 @@ +// Exports from core should already be modules export * from './core'; export * as utils from './utils'; export * as factories from './factories'; -export * as shared from './shared'; +export * as Shared from './shared'; From 88efe3cb3e567198170d69d18e037b5b05c87484 Mon Sep 17 00:00:00 2001 From: Convly Date: Mon, 15 May 2023 17:25:34 +0200 Subject: [PATCH 085/172] Fix typo in jsdoc --- packages/core/strapi/lib/types/core/uid.d.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/core/strapi/lib/types/core/uid.d.ts b/packages/core/strapi/lib/types/core/uid.d.ts index 9c132eec0e..6b82294bbb 100644 --- a/packages/core/strapi/lib/types/core/uid.d.ts +++ b/packages/core/strapi/lib/types/core/uid.d.ts @@ -137,14 +137,14 @@ export type Select> = Pick, P>; * Extract the namespace literal from a given UID. * * @example - * type T = ResolveUIDNamespace<'admin::foo'> - * // ^ AdminNamespace + * type T = AssertNamespaceIs<'admin::foo'> + * // ^ Namespace.Admin * @example - * type T = ResolveUIDNamespace<'api::foo.bar'> - * // ^ ApiNamespace + * type T = AssertNamespaceIs<'api::foo.bar'> + * // ^ Namespace.API * @example - * type T = ResolveUIDNamespace<'admin::foo' | 'api::foo.bar'> - * // ^ AdminNamespace | ApiNamespace + * type T = AssertNamespaceIs<'admin::foo' | 'api::foo.bar'> + * // ^ Namespace.Admin | Namespace.API */ export type ExtractNamespace = | AssertNamespaceIs From a3052b6b0656ae2c52c9871de4aabeb59b0af2f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-S=C3=A9bastien=20Herbaux?= Date: Thu, 25 May 2023 16:30:08 +0200 Subject: [PATCH 086/172] Update packages/core/strapi/lib/types/core/namespace.d.ts Co-authored-by: Ben Irvin --- packages/core/strapi/lib/types/core/namespace.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/strapi/lib/types/core/namespace.d.ts b/packages/core/strapi/lib/types/core/namespace.d.ts index 5b99513826..595be540d6 100644 --- a/packages/core/strapi/lib/types/core/namespace.d.ts +++ b/packages/core/strapi/lib/types/core/namespace.d.ts @@ -52,7 +52,7 @@ export type GetSeparator = T extends Scoped /** * Adds the corresponding separator (using {@link GetSeparator}) at the end of a namespace * - * Warning: Using WithSeparator with a union type might produce undesired results as it'll distribute every matching suffix to every union members + * Warning: Using WithSeparator with a union type might produce undesired results as it'll distribute every matching suffix to every union member * * @example * type T = WithSeparator From 4f76e65e520fa965f87ca5c03c32e1e954a361b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-S=C3=A9bastien=20Herbaux?= Date: Thu, 25 May 2023 16:30:15 +0200 Subject: [PATCH 087/172] Update packages/core/strapi/lib/types/core/uid.d.ts Co-authored-by: Ben Irvin --- packages/core/strapi/lib/types/core/uid.d.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/strapi/lib/types/core/uid.d.ts b/packages/core/strapi/lib/types/core/uid.d.ts index 6b82294bbb..4a46b75431 100644 --- a/packages/core/strapi/lib/types/core/uid.d.ts +++ b/packages/core/strapi/lib/types/core/uid.d.ts @@ -80,9 +80,9 @@ export interface Parsed From 2f653854741f560ff392744ab7ee74ef5fec5ce9 Mon Sep 17 00:00:00 2001 From: Convly Date: Fri, 26 May 2023 15:26:36 +0200 Subject: [PATCH 088/172] Update ControllerHandler return type to accept void --- packages/core/strapi/lib/types/core/common/controller.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/strapi/lib/types/core/common/controller.d.ts b/packages/core/strapi/lib/types/core/common/controller.d.ts index 971a4c8d15..24b55beaf1 100644 --- a/packages/core/strapi/lib/types/core/common/controller.d.ts +++ b/packages/core/strapi/lib/types/core/common/controller.d.ts @@ -3,6 +3,6 @@ import type koa from 'koa'; export type ControllerHandler = ( context: koa.ExtendableContext, next: koa.Next -) => Promise | T; +) => Promise | T | void; export type Controller = Record; From a13398e0d24791625c0a54974ad0725b43fbe67d Mon Sep 17 00:00:00 2001 From: Convly Date: Fri, 26 May 2023 15:27:45 +0200 Subject: [PATCH 089/172] Use ColonsSeparator for api & plugin namespace (origin <> scope) --- packages/core/strapi/lib/types/core/namespace.d.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/strapi/lib/types/core/namespace.d.ts b/packages/core/strapi/lib/types/core/namespace.d.ts index 595be540d6..1f633ef262 100644 --- a/packages/core/strapi/lib/types/core/namespace.d.ts +++ b/packages/core/strapi/lib/types/core/namespace.d.ts @@ -13,12 +13,12 @@ export type Strapi = 'strapi'; /** * Namespace for scoped APIs resources */ -export type API = `api::${T}`; +export type API = `api${ColonsSeparator}${T}`; /** * Namespace for scoped plugins resources */ -export type Plugin = `plugin::${T}`; +export type Plugin = `plugin${ColonsSeparator}${T}`; /** * Namespace for global resources From fef81ec2611d06909d9643c20bb5810a0c683b99 Mon Sep 17 00:00:00 2001 From: Convly Date: Fri, 26 May 2023 15:30:42 +0200 Subject: [PATCH 090/172] Rename AssertNamespaceIs to EnsureNamespaceMatches for uids --- packages/core/strapi/lib/types/core/uid.d.ts | 24 ++++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/core/strapi/lib/types/core/uid.d.ts b/packages/core/strapi/lib/types/core/uid.d.ts index 4a46b75431..46f64c9309 100644 --- a/packages/core/strapi/lib/types/core/uid.d.ts +++ b/packages/core/strapi/lib/types/core/uid.d.ts @@ -108,16 +108,16 @@ export type Parse = ExtractNamespace extends infer B extends N * It returns N (the {@link Namespace.Any} literal) if there is a match, never otherwise. * * @example - * type T = AssertNamespaceIs<'admin::foo', Namespace.Admin> + * type T = EnsureNamespaceMatches<'admin::foo', Namespace.Admin> * // ^ Namespace.Admin * @example - * type T = AssertNamespaceIs<'foo.bar', Namespace.API> + * type T = EnsureNamespaceMatches<'foo.bar', Namespace.API> * // ^ never * @example - * type T = AssertNamespaceIs<'api::foo.bar', Namespace.Plugin> + * type T = EnsureNamespaceMatches<'api::foo.bar', Namespace.Plugin> * // ^ never */ -export type AssertNamespaceIs = U extends StringSuffix< +export type EnsureNamespaceMatches = U extends StringSuffix< Namespace.WithSeparator > ? N @@ -137,18 +137,18 @@ export type Select> = Pick, P>; * Extract the namespace literal from a given UID. * * @example - * type T = AssertNamespaceIs<'admin::foo'> + * type T = ExtractNamespace<'admin::foo'> * // ^ Namespace.Admin * @example - * type T = AssertNamespaceIs<'api::foo.bar'> + * type T = ExtractNamespace<'api::foo.bar'> * // ^ Namespace.API * @example - * type T = AssertNamespaceIs<'admin::foo' | 'api::foo.bar'> + * type T = ExtractNamespace<'admin::foo' | 'api::foo.bar'> * // ^ Namespace.Admin | Namespace.API */ export type ExtractNamespace = - | AssertNamespaceIs - | AssertNamespaceIs - | AssertNamespaceIs - | AssertNamespaceIs - | AssertNamespaceIs; + | EnsureNamespaceMatches + | EnsureNamespaceMatches + | EnsureNamespaceMatches + | EnsureNamespaceMatches + | EnsureNamespaceMatches; From a59719cc3ccc044216631200db947d3472a2faac Mon Sep 17 00:00:00 2001 From: Convly Date: Fri, 26 May 2023 15:33:09 +0200 Subject: [PATCH 091/172] Rename Contains to Includes --- packages/core/strapi/lib/types/core/registry.d.ts | 2 +- packages/core/strapi/lib/types/utils.d.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/core/strapi/lib/types/core/registry.d.ts b/packages/core/strapi/lib/types/core/registry.d.ts index c204bb2a20..7efb556a2d 100644 --- a/packages/core/strapi/lib/types/core/registry.d.ts +++ b/packages/core/strapi/lib/types/core/registry.d.ts @@ -51,7 +51,7 @@ export type Keys = Extract; * type T = keyof WhereKeys; * // ^ "plugin::foo.bar" | "admin::foo" | "admin::bar" * - * type T = keyof WhereKeys }>; + * type T = keyof WhereKeys }>; * // ^ "api::foo.bar" | "api::foo.baz" */ export type WhereKeys, U extends UID.Any = UID.Any> = { diff --git a/packages/core/strapi/lib/types/utils.d.ts b/packages/core/strapi/lib/types/utils.d.ts index d09cffd5f7..adb16e8880 100644 --- a/packages/core/strapi/lib/types/utils.d.ts +++ b/packages/core/strapi/lib/types/utils.d.ts @@ -10,9 +10,9 @@ export type Literal = string | number | bigint | boolean; /** - * Used to check if a string contains a given literal + * Used to check if a string includes a given literal */ -export type Contains = `${string}${S}${string}`; +export type Includes = `${string}${S}${string}`; /** * Used to make sure the given string is not empty From ee84754cfb998101283c48e2230e008aa4667e7e Mon Sep 17 00:00:00 2001 From: Convly Date: Tue, 30 May 2023 14:32:41 +0200 Subject: [PATCH 092/172] Revert mistakes for dts changes --- .../core/data-transfer/src/engine/index.ts | 96 ++++++++++++++----- .../strapi/providers/remote-source/index.ts | 59 ++---------- .../core/data-transfer/src/utils/index.ts | 1 + 3 files changed, 83 insertions(+), 73 deletions(-) diff --git a/packages/core/data-transfer/src/engine/index.ts b/packages/core/data-transfer/src/engine/index.ts index 54f7a6fee6..be9e54f20b 100644 --- a/packages/core/data-transfer/src/engine/index.ts +++ b/packages/core/data-transfer/src/engine/index.ts @@ -4,8 +4,8 @@ import { extname } from 'path'; import { EOL } from 'os'; import { isEmpty, uniq, last, isNumber, difference, set, omit } from 'lodash/fp'; import { diff as semverDiff } from 'semver'; -import type { Schema, Utils } from '@strapi/strapi'; +import type { Schema, Utils } from '@strapi/strapi'; import type { IAsset, IDestinationProvider, @@ -23,11 +23,12 @@ import type { TransferFilters, TransferFilterPreset, StreamItem, + SchemaDiffHandler, + SchemaDiffHandlerContext, } from '../../types'; import type { Diff } from '../utils/json'; import { compareSchemas, validateProvider } from './validation'; -import { filter, map } from '../utils/stream'; import { TransferEngineError, TransferEngineValidationError } from './errors'; import { @@ -36,6 +37,7 @@ import { ErrorDiagnosticSeverity, } from './diagnostic'; import { DataTransferError } from '../errors'; +import * as utils from '../utils'; export const TRANSFER_STAGES: ReadonlyArray = Object.freeze([ 'entities', @@ -103,6 +105,16 @@ class TransferEngine< diagnostics: IDiagnosticReporter; + #handlers: { + schemaDiff: SchemaDiffHandler[]; + } = { + schemaDiff: [], + }; + + onSchemaDiff(handler: SchemaDiffHandler) { + this.#handlers?.schemaDiff?.push(handler); + } + // Save the currently open stream so that we can access it at any time #currentStream?: Writable; @@ -122,8 +134,8 @@ class TransferEngine< /** * Report a fatal error and throw it */ - #panic(error: Error) { - this.#reportError(error, 'fatal'); + panic(error: Error) { + this.reportError(error, 'fatal'); throw error; } @@ -131,7 +143,7 @@ class TransferEngine< /** * Report an error diagnostic */ - #reportError(error: Error, severity: ErrorDiagnosticSeverity) { + reportError(error: Error, severity: ErrorDiagnosticSeverity) { this.diagnostics.report({ kind: 'error', details: { @@ -147,7 +159,7 @@ class TransferEngine< /** * Report a warning diagnostic */ - #reportWarning(message: string, origin?: string) { + reportWarning(message: string, origin?: string) { this.diagnostics.report({ kind: 'warning', details: { createdAt: new Date(), message, origin }, @@ -157,7 +169,7 @@ class TransferEngine< /** * Report an info diagnostic */ - #reportInfo(message: string, params?: unknown) { + reportInfo(message: string, params?: unknown) { this.diagnostics.report({ kind: 'info', details: { createdAt: new Date(), message, params }, @@ -183,11 +195,11 @@ class TransferEngine< const chainTransforms: StreamItem[] = []; for (const transform of transforms) { if ('filter' in transform) { - chainTransforms.push(filter(transform.filter)); + chainTransforms.push(utils.stream.filter(transform.filter)); } if ('map' in transform) { - chainTransforms.push(map(transform.map)); + chainTransforms.push(utils.stream.map(transform.map)); } } if (chainTransforms.length) { @@ -397,11 +409,11 @@ class TransferEngine< const path = diff.path.join('.'); if (diff.kind === 'added') { - return `${path} exists in destination schema but not in source schema`; + return `${path} exists in destination schema but not in source schema and the data will not be transferred.`; } if (diff.kind === 'deleted') { - return `${path} exists in source schema but not in destination schema`; + return `${path} exists in source schema but not in destination schema and the data will not be transferred.`; } if (diff.kind === 'modified') { @@ -496,7 +508,7 @@ class TransferEngine< results.forEach((state) => { if (state.status === 'rejected') { - this.#reportWarning(state.reason, `transfer(${stage})`); + this.reportWarning(state.reason, `transfer(${stage})`); } }); @@ -523,7 +535,7 @@ class TransferEngine< .on('error', (e) => { updateEndTime(); this.#emitStageUpdate('error', stage); - this.#reportError(e, 'error'); + this.reportError(e, 'error'); destination.destroy(e); reject(e); }) @@ -539,7 +551,11 @@ class TransferEngine< // Cause an ongoing transfer to abort gracefully async abortTransfer(): Promise { - this.#currentStream?.destroy(new TransferEngineError('fatal', 'Transfer aborted.')); + const err = new TransferEngineError('fatal', 'Transfer aborted.'); + if (!this.#currentStream) { + throw err; + } + this.#currentStream.destroy(err); } async init(): Promise { @@ -566,7 +582,7 @@ class TransferEngine< results.forEach((result) => { if (result.status === 'rejected') { - this.#panic(result.reason); + this.panic(result.reason); } }); } @@ -582,7 +598,7 @@ class TransferEngine< results.forEach((result) => { if (result.status === 'rejected') { - this.#panic(result.reason); + this.panic(result.reason); } }); } @@ -626,15 +642,47 @@ class TransferEngine< ); } - const { sourceSchema, destinationSchema } = await this.#getSchemas(); + const sourceSchemas = (await this.sourceProvider.getSchemas?.()) as SchemaMap; + const destinationSchemas = (await this.destinationProvider.getSchemas?.()) as SchemaMap; try { - if (sourceSchema && destinationSchema) { - this.#assertSchemasMatching(sourceSchema, destinationSchema); + if (sourceSchemas && destinationSchemas) { + this.#assertSchemasMatching(sourceSchemas, destinationSchemas); } } catch (error) { - if (error instanceof Error) { - this.#panic(error); + // if this is a schema matching error, allow handlers to resolve it + if (error instanceof TransferEngineValidationError && error.details?.details?.diffs) { + const schemaDiffs = error.details?.details?.diffs as Record; + + const context: SchemaDiffHandlerContext = { + ignoredDiffs: {}, + diffs: schemaDiffs, + source: this.sourceProvider, + destination: this.destinationProvider, + }; + + // if we don't have any handlers, throw the original error + if (isEmpty(this.#handlers.schemaDiff)) { + throw error; + } + + await utils.middleware.runMiddleware( + context, + this.#handlers.schemaDiff + ); + + // if there are any remaining diffs that weren't ignored + const unresolvedDiffs = utils.json.diff(context.diffs, context.ignoredDiffs); + if (unresolvedDiffs.length) { + this.panic( + new TransferEngineValidationError('Unresolved differences in schema', { + check: 'schema.changes', + unresolvedDiffs, + }) + ); + } + + return; } throw error; @@ -675,7 +723,7 @@ class TransferEngine< e instanceof Error && (!lastDiagnostic || lastDiagnostic.kind !== 'error' || lastDiagnostic.details.error !== e) ) { - this.#reportError(e, (e as DataTransferError).severity || 'fatal'); + this.reportError(e, (e as DataTransferError).severity || 'fatal'); } // Rollback the destination provider if an exception is thrown during the transfer @@ -699,9 +747,9 @@ class TransferEngine< } catch (error) { // Error happening during the before transfer step should be considered fatal errors if (error instanceof Error) { - this.#panic(error); + this.panic(error); } else { - this.#panic( + this.panic( new Error(`Unknwon error when executing "beforeTransfer" on the ${origin} provider`) ); } diff --git a/packages/core/data-transfer/src/strapi/providers/remote-source/index.ts b/packages/core/data-transfer/src/strapi/providers/remote-source/index.ts index 4d21811f7a..50d6a3e562 100644 --- a/packages/core/data-transfer/src/strapi/providers/remote-source/index.ts +++ b/packages/core/data-transfer/src/strapi/providers/remote-source/index.ts @@ -171,56 +171,17 @@ class RemoteStrapiSourceProvider implements ISourceProvider { } async initTransfer(): Promise { - return new Promise((resolve, reject) => { - this.ws - ?.on('unexpected-response', (_req, res) => { - if (res.statusCode === 401) { - return reject( - new ProviderInitializationError( - 'Failed to initialize the connection: Authentication Error' - ) - ); - } - - if (res.statusCode === 403) { - return reject( - new ProviderInitializationError( - 'Failed to initialize the connection: Authorization Error' - ) - ); - } - - if (res.statusCode === 404) { - return reject( - new ProviderInitializationError( - 'Failed to initialize the connection: Data transfer is not enabled on the remote host' - ) - ); - } - - return reject( - new ProviderInitializationError( - `Failed to initialize the connection: Unexpected server response ${res.statusCode}` - ) - ); - }) - ?.once('open', async () => { - const query = this.dispatcher?.dispatchCommand({ - command: 'init', - }); - - const res = (await query) as Server.Payload; - - if (!res?.transferID) { - return reject( - new ProviderTransferError('Init failed, invalid response from the server') - ); - } - - resolve(res.transferID); - }) - .once('error', reject); + const query = this.dispatcher?.dispatchCommand({ + command: 'init', }); + + const res = (await query) as Server.Payload; + + if (!res?.transferID) { + throw new ProviderTransferError('Init failed, invalid response from the server'); + } + + return res.transferID; } async bootstrap(): Promise { diff --git a/packages/core/data-transfer/src/utils/index.ts b/packages/core/data-transfer/src/utils/index.ts index 133de63aa9..c729abb69d 100644 --- a/packages/core/data-transfer/src/utils/index.ts +++ b/packages/core/data-transfer/src/utils/index.ts @@ -3,3 +3,4 @@ export * as stream from './stream'; export * as json from './json'; export * as schema from './schema'; export * as transaction from './transaction'; +export * as middleware from './middleware'; From efc6f1b46cf95170ae22ea5eafb9cede967399bd Mon Sep 17 00:00:00 2001 From: Convly Date: Tue, 30 May 2023 16:42:41 +0200 Subject: [PATCH 093/172] Revert factories > Factories --- packages/core/strapi/lib/types/index.d.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/strapi/lib/types/index.d.ts b/packages/core/strapi/lib/types/index.d.ts index a3bcde46f7..29b49fcbba 100644 --- a/packages/core/strapi/lib/types/index.d.ts +++ b/packages/core/strapi/lib/types/index.d.ts @@ -2,6 +2,6 @@ export * from './core'; export * as Utils from './utils'; -export * as Factories from './factories'; - export * as Shared from './shared'; + +export * as factories from './factories'; From dcd1ef1bb22044037d8af2a7fe4d4f1314817523 Mon Sep 17 00:00:00 2001 From: Convly Date: Tue, 30 May 2023 17:23:17 +0200 Subject: [PATCH 094/172] Remove unused import --- .../src/strapi/providers/remote-source/index.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/core/data-transfer/src/strapi/providers/remote-source/index.ts b/packages/core/data-transfer/src/strapi/providers/remote-source/index.ts index 50d6a3e562..25404c0533 100644 --- a/packages/core/data-transfer/src/strapi/providers/remote-source/index.ts +++ b/packages/core/data-transfer/src/strapi/providers/remote-source/index.ts @@ -12,11 +12,7 @@ import type { TransferStage, } from '../../../../types'; import { Client, Server } from '../../../../types/remote/protocol'; -import { - ProviderInitializationError, - ProviderTransferError, - ProviderValidationError, -} from '../../../errors/providers'; +import { ProviderTransferError, ProviderValidationError } from '../../../errors/providers'; import { TRANSFER_PATH } from '../../remote/constants'; import { ILocalStrapiSourceProviderOptions } from '../local-source'; import { createDispatcher, connectToWebsocket, trimTrailingSlash } from '../utils'; From ce62bbcf5e6244d893859692250658c06912062a Mon Sep 17 00:00:00 2001 From: Christian Capeans Date: Tue, 30 May 2023 22:12:25 +0200 Subject: [PATCH 095/172] Improve typings in the strapi.controllers --- .../strapi/lib/core-api/controller/index.d.ts | 16 ++++++++-------- .../core/strapi/lib/types/core/strapi/index.d.ts | 5 ++--- packages/core/strapi/lib/types/factories.d.ts | 4 ++-- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/packages/core/strapi/lib/core-api/controller/index.d.ts b/packages/core/strapi/lib/core-api/controller/index.d.ts index daf9f45658..42f65235a0 100644 --- a/packages/core/strapi/lib/core-api/controller/index.d.ts +++ b/packages/core/strapi/lib/core-api/controller/index.d.ts @@ -8,17 +8,17 @@ interface Controller { } export interface SingleTypeController extends Controller { - find?: ControllerHandler; - update?: ControllerHandler; - delete?: ControllerHandler; + find?: ControllerHandler; + update?: ControllerHandler; + delete?: ControllerHandler; } export interface CollectionTypeController extends Controller { - find?: ControllerHandler; - findOne?: ControllerHandler; - create?: ControllerHandler; - update?: ControllerHandler; - delete?: ControllerHandler; + find?: ControllerHandler; + findOne?: ControllerHandler; + create?: ControllerHandler; + update?: ControllerHandler; + delete?: ControllerHandler; } export type GenericController = Partial & { diff --git a/packages/core/strapi/lib/types/core/strapi/index.d.ts b/packages/core/strapi/lib/types/core/strapi/index.d.ts index 558a1b4a7f..548c68145c 100644 --- a/packages/core/strapi/lib/types/core/strapi/index.d.ts +++ b/packages/core/strapi/lib/types/core/strapi/index.d.ts @@ -1,9 +1,8 @@ import { Database } from '@strapi/database'; -import type { Shared } from '@strapi/strapi'; +import type { Shared, Common } from '@strapi/strapi'; import type { GenericController } from '../../../core-api/controller'; import type { GenericService } from '../../../core-api/service'; -import { UID } from '../common'; // TODO move custom fields types to a separate file interface CustomFieldServerOptions { @@ -86,7 +85,7 @@ export interface Strapi { /** * Find a controller using its unique identifier */ - controller(uid: UID.Controller): GenericController | undefined; + controller(uid: T): Shared.Controllers[T]; /** * Getter for the Strapi content types container diff --git a/packages/core/strapi/lib/types/factories.d.ts b/packages/core/strapi/lib/types/factories.d.ts index 6a25c1679a..56652876c8 100644 --- a/packages/core/strapi/lib/types/factories.d.ts +++ b/packages/core/strapi/lib/types/factories.d.ts @@ -59,7 +59,7 @@ export declare function createCoreRouter( ): () => Router; export declare function createCoreController< - T extends UID.Controller, + T extends UID.ContentType, S extends Partial> >(uid: T, cfg?: ControllerCallback | S): () => Required>; @@ -68,7 +68,7 @@ export declare function createCoreService< S extends Partial> >(uid: T, cfg?: ServiceCallback | S): () => Required>; -type GetBaseSchemaController = IsCollectionType< +type GetBaseSchemaController = IsCollectionType< T, CollectionTypeController, SingleTypeController From 9003c8d312885c5119eb0907cd28e5b0c24bd234 Mon Sep 17 00:00:00 2001 From: Ahsan Date: Wed, 31 May 2023 16:22:25 +0530 Subject: [PATCH 096/172] Fix: Handle undefined routes in registerAPIRoutes forEach loop --- packages/core/strapi/lib/services/server/register-routes.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/strapi/lib/services/server/register-routes.js b/packages/core/strapi/lib/services/server/register-routes.js index 1f55c1dd26..85aa7f4a7c 100644 --- a/packages/core/strapi/lib/services/server/register-routes.js +++ b/packages/core/strapi/lib/services/server/register-routes.js @@ -94,7 +94,7 @@ const registerAPIRoutes = (strapi) => { // TODO: remove once auth setup // pass meta down to compose endpoint router.type = 'content-api'; - router.routes.forEach((route) => { + router.routes?.forEach((route) => { generateRouteScope(route); route.info = { apiName }; }); From 9fc35371dd5b7b3815fc2b16d5cf0b089cec121b Mon Sep 17 00:00:00 2001 From: Convly Date: Thu, 1 Jun 2023 15:40:22 +0200 Subject: [PATCH 097/172] Use component uid instead of content type uid --- .../core/strapi/lib/types/core/attributes/dynamic-zone.d.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/strapi/lib/types/core/attributes/dynamic-zone.d.ts b/packages/core/strapi/lib/types/core/attributes/dynamic-zone.d.ts index 9212400edf..a88886f831 100644 --- a/packages/core/strapi/lib/types/core/attributes/dynamic-zone.d.ts +++ b/packages/core/strapi/lib/types/core/attributes/dynamic-zone.d.ts @@ -1,6 +1,6 @@ import type { Utils, Attribute, Common } from '@strapi/strapi'; -export interface DynamicZoneProperties { +export interface DynamicZoneProperties { components: T; } @@ -15,7 +15,7 @@ export type DynamicZone = Array< Utils.Array.Values extends infer P - ? P extends Common.UID.ContentType + ? P extends Common.UID.Component ? Attribute.GetValues