diff --git a/.eslintignore b/.eslintignore index 798ef86699..b9cf1235d6 100644 --- a/.eslintignore +++ b/.eslintignore @@ -7,6 +7,7 @@ examples/** cypress/** packages/generators/generators/lib/files/ packages/generators/app/lib/resources/files/ +packages/core/admin/admin/src/plugins.js packages/core/helper-plugin/build/** packages/core/helper-plugin/lib/src/old/components/** packages/core/helper-plugin/lib/src/testUtils/** diff --git a/.eslintrc.back.js b/.eslintrc.back.js index 44328c8637..cbf9d11785 100644 --- a/.eslintrc.back.js +++ b/.eslintrc.back.js @@ -1,55 +1,36 @@ 'use strict'; module.exports = { - extends: [ - 'eslint:recommended', - 'prettier', - 'plugin:import/errors', - 'plugin:import/warnings', - 'plugin:node/recommended', - // 'plugin:jsdoc/recommended', - ], - plugins: ['jsdoc'], - env: { - es6: true, - node: true, - jest: true, - }, + extends: '@strapi/eslint-config/back', globals: { strapi: false, }, rules: { - // 'jsdoc/require-jsdoc': [ - // 'warn', - // { - // publicOnly: true, - // require: { - // ArrowFunctionExpression: true, - // ClassDeclaration: true, - // ClassExpression: true, - // FunctionDeclaration: true, - // FunctionExpression: true, - // MethodDefinition: true, - // }, - // }, - // ], - 'node/no-unpublished-require': 'off', - 'require-atomic-updates': 'off', - 'no-process-exit': 'off', - strict: ['error', 'global'], - 'no-return-await': 'error', - 'object-shorthand': ['error', 'always', { avoidExplicitReturnArrows: true }], - 'import/order': 'error', - 'import/no-cycle': 'error', - 'import/no-useless-path-segments': 'error', - 'import/first': 'error', - 'import/extensions': ['error', 'never'], - 'import/newline-after-import': 'error', - 'node/exports-style': ['error', 'module.exports'], - 'node/no-new-require': 'error', - 'node/no-path-concat': 'error', - 'node/no-callback-literal': 'error', - 'node/handle-callback-err': 'error', - 'one-var': ['error', 'never'], + 'import/no-dynamic-require': 'off', + 'global-require': 'off', + 'import/no-extraneous-dependencies': [ + 'error', + { + devDependencies: [ + 'packages/admin-test-utils/**/*.js', + 'packages/generators/admin/**/*.js', + 'scripts/**/*.js', + '**/test/**/*.js', + '**/tests/**/*.js', + '**/__tests__/**/*.js', + '**/__mocks__/**/*.js', + ], + }, + ], + 'prefer-destructuring': ['error', { AssignmentExpression: { array: false } }], + eqeqeq: 'warn', + 'no-underscore-dangle': 'warn', + 'no-use-before-define': 'warn', + 'no-param-reassign': 'warn', + 'no-continue': 'warn', + 'no-process-exit': 'warn', + 'no-plusplus': 'warn', + 'no-loop-func': 'warn', + 'guard-for-in': 'warn', }, }; diff --git a/.eslintrc.front.js b/.eslintrc.front.js index 4dc9f78fd6..b197a73370 100644 --- a/.eslintrc.front.js +++ b/.eslintrc.front.js @@ -1,13 +1,6 @@ module.exports = { - parser: 'babel-eslint', - extends: [ - 'airbnb', - 'eslint:recommended', - 'plugin:react/recommended', - 'plugin:redux-saga/recommended', - 'prettier', - ], - plugins: ['react', 'redux-saga', 'react-hooks', 'import', 'jsx-a11y'], + parser: '@babel/eslint-parser', + extends: ['@strapi/eslint-config/front'], env: { browser: true, commonjs: true, @@ -16,11 +9,10 @@ module.exports = { mocha: true, }, parserOptions: { - ecmaVersion: 2018, - ecmaFeatures: { - jsx: true, + requireConfigFile: false, + babelOptions: { + presets: ['@babel/preset-react'], }, - sourceType: 'module', }, globals: { strapi: false, @@ -39,86 +31,12 @@ module.exports = { }, settings: { react: { - version: '16.5.2', + version: 'detect', }, }, rules: { - 'import/no-unresolved': 0, - 'generator-star-spacing': 0, - 'no-console': 0, - 'require-atomic-updates': 0, - 'react-hooks/rules-of-hooks': 'error', - 'react-hooks/exhaustive-deps': 'error', - 'arrow-body-style': 0, - 'arrow-parens': 0, - camelcase: 0, - 'comma-dangle': 0, - 'consistent-return': [ - 2, - { - treatUndefinedAsUnspecified: true, - }, - ], - 'template-curly-spacing': 0, - 'func-names': ['error', 'never'], - 'function-paren-newline': 0, - 'implicit-arrow-linebreak': 0, - 'import/no-extraneous-dependencies': 0, - 'import/no-named-as-default': 0, - 'import/order': 2, - 'import/prefer-default-export': 'off', - 'jsx-a11y/click-events-have-key-events': 1, - 'max-len': [ - 2, - { - code: 120, - ignoreComments: true, - ignoreUrls: true, - ignoreTrailingComments: true, - ignoreStrings: true, - ignoreTemplateLiterals: true, - }, - ], - 'newline-before-return': 2, - 'no-confusing-arrow': 0, - 'no-else-return': 1, - 'no-nested-ternary': ['error'], - 'no-return-assign': 0, - 'no-param-reassign': 0, - 'no-plusplus': 0, - 'no-shadow': 0, - 'no-underscore-dangle': 0, - 'no-use-before-define': ['error', { functions: false, classes: false, variables: false }], - 'object-curly-newline': [2, { multiline: true, consistent: true }], - 'one-var': ['error', 'never'], - 'operator-linebreak': 0, - 'padding-line-between-statements': [ - 'error', - { blankLine: 'always', prev: '*', next: 'if' }, - { blankLine: 'any', prev: 'block-like', next: 'if' }, - ], - 'prefer-arrow-callback': 0, - 'prefer-const': 0, - 'prefer-destructuring': 0, - 'prefer-object-spread': 0, - 'prefer-spread': 0, - 'space-before-function-paren': [ - 'error', - { - anonymous: 'never', - named: 'never', - asyncArrow: 'always', - }, - ], - 'react/destructuring-assignment': 0, - 'react/jsx-filename-extension': [1, { extensions: ['.js', '.jsx'] }], - 'react/forbid-prop-types': 0, - 'react/no-unused-prop-types': 2, - 'react/jsx-props-no-spreading': 0, - 'react/jsx-one-expression-per-line': 0, - 'react/state-in-constructor': 0, - 'react/static-property-placement': 0, - 'react/display-name': 0, - 'react/jsx-wrap-multilines': 0, + 'react/jsx-no-constructed-context-values': 'warn', + 'react/jsx-no-useless-fragment': 'warn', + 'react/no-unstable-nested-components': 'warn', }, }; diff --git a/.github/actions/check-pr-status/__tests__/action.test.js b/.github/actions/check-pr-status/__tests__/action.test.js index 3a32891a2e..0e598ed55a 100644 --- a/.github/actions/check-pr-status/__tests__/action.test.js +++ b/.github/actions/check-pr-status/__tests__/action.test.js @@ -6,7 +6,7 @@ jest.mock('@actions/core'); const github = require('@actions/github'); const core = require('@actions/core'); -test.each(action.BLOCKING_LABELS)('Test blocking labels %s', async label => { +test.each(action.BLOCKING_LABELS)('Test blocking labels %s', async (label) => { github.context = { payload: { pull_request: { diff --git a/.github/actions/check-pr-status/index.js b/.github/actions/check-pr-status/index.js index 86849c6750..099172b61e 100644 --- a/.github/actions/check-pr-status/index.js +++ b/.github/actions/check-pr-status/index.js @@ -7,20 +7,20 @@ async function main() { try { const labels = github.context.payload.pull_request?.labels ?? []; - const blockingLabels = labels.filter(label => BLOCKING_LABELS.includes(label.name)); + const blockingLabels = labels.filter((label) => BLOCKING_LABELS.includes(label.name)); if (blockingLabels.length > 0) { core.setFailed( `The PR has been labelled with a blocking label (${blockingLabels - .map(label => label.name) + .map((label) => label.name) .join(', ')}).` ); return; } - const sourceLabelCount = labels.filter(label => label.name.startsWith('source: ')).length; - const issueLabelCount = labels.filter(label => label.name.startsWith('pr: ')).length; + const sourceLabelCount = labels.filter((label) => label.name.startsWith('source: ')).length; + const issueLabelCount = labels.filter((label) => label.name.startsWith('pr: ')).length; if (sourceLabelCount !== 1) { core.setFailed(`The PR must have one and only one 'source:' label.`); diff --git a/.prettierrc.js b/.prettierrc.js index 102e3fa4b2..1613e2a6ef 100644 --- a/.prettierrc.js +++ b/.prettierrc.js @@ -5,4 +5,5 @@ module.exports = { tabWidth: 2, trailingComma: 'es5', printWidth: 100, + arrowParens: 'always', }; diff --git a/examples/getstarted/config/src/response-handlers.js b/examples/getstarted/config/src/response-handlers.js index 72b34df02d..2ad17f9b8a 100644 --- a/examples/getstarted/config/src/response-handlers.js +++ b/examples/getstarted/config/src/response-handlers.js @@ -1,7 +1,7 @@ 'use strict'; module.exports = { - '404': async (/* ctx */) => { + 404: async (/* ctx */) => { // return ctx.notFound('My custom message 404'); }, }; diff --git a/examples/getstarted/src/api/address/middlewares/address-middleware.js b/examples/getstarted/src/api/address/middlewares/address-middleware.js index baeae56c18..9e31b84eb3 100644 --- a/examples/getstarted/src/api/address/middlewares/address-middleware.js +++ b/examples/getstarted/src/api/address/middlewares/address-middleware.js @@ -1,4 +1,4 @@ -module.exports = options => { +module.exports = (options) => { return (ctx, next) => { ctx.set('X-Strapi-Test', 'Address Middleware'); return next(); diff --git a/examples/getstarted/src/api/address/services/address.js b/examples/getstarted/src/api/address/services/address.js index c394b7fa86..f639b9695d 100644 --- a/examples/getstarted/src/api/address/services/address.js +++ b/examples/getstarted/src/api/address/services/address.js @@ -4,7 +4,7 @@ module.exports = createCoreService('api::address.address', { async find(...args) { const { results, pagination } = await super.find(...args); - results.forEach(result => { + results.forEach((result) => { result.counter = 1; }); diff --git a/examples/getstarted/src/api/review/content-types/review/schema.json b/examples/getstarted/src/api/review/content-types/review/schema.json index 05d9f6a420..5febb1e7e0 100755 --- a/examples/getstarted/src/api/review/content-types/review/schema.json +++ b/examples/getstarted/src/api/review/content-types/review/schema.json @@ -1,4 +1,5 @@ { + "kind": "collectionType", "collectionName": "reviews", "info": { "displayName": "Review", diff --git a/examples/getstarted/src/extensions/users-permissions/strapi-server.js b/examples/getstarted/src/extensions/users-permissions/strapi-server.js index 235100b090..9ad0863dc0 100644 --- a/examples/getstarted/src/extensions/users-permissions/strapi-server.js +++ b/examples/getstarted/src/extensions/users-permissions/strapi-server.js @@ -1,3 +1,3 @@ -module.exports = plugin => { +module.exports = (plugin) => { return plugin; }; diff --git a/examples/getstarted/src/plugins/myplugin/admin/src/index.js b/examples/getstarted/src/plugins/myplugin/admin/src/index.js index 44d19676d8..f00a4b5125 100644 --- a/examples/getstarted/src/plugins/myplugin/admin/src/index.js +++ b/examples/getstarted/src/plugins/myplugin/admin/src/index.js @@ -29,7 +29,7 @@ export default { bootstrap() {}, async registerTrads({ locales }) { const importedTrads = await Promise.all( - locales.map(locale => { + locales.map((locale) => { return import( /* webpackChunkName: "[pluginId]-[request]" */ `./translations/${locale}.json` ) diff --git a/examples/getstarted/src/plugins/myplugin/admin/src/utils/getTrad.js b/examples/getstarted/src/plugins/myplugin/admin/src/utils/getTrad.js index a2b8632a8d..d0a071b26a 100644 --- a/examples/getstarted/src/plugins/myplugin/admin/src/utils/getTrad.js +++ b/examples/getstarted/src/plugins/myplugin/admin/src/utils/getTrad.js @@ -1,5 +1,5 @@ import pluginId from '../pluginId'; -const getTrad = id => `${pluginId}.${id}`; +const getTrad = (id) => `${pluginId}.${id}`; export default getTrad; diff --git a/examples/getstarted/src/plugins/myplugin/server/config/index.js b/examples/getstarted/src/plugins/myplugin/server/config/index.js index 46517110c5..d16884e338 100644 --- a/examples/getstarted/src/plugins/myplugin/server/config/index.js +++ b/examples/getstarted/src/plugins/myplugin/server/config/index.js @@ -4,7 +4,7 @@ module.exports = { default: { testConf: 1, }, - validator: config => { + validator: (config) => { if (typeof config.testConf !== 'number') { throw new Error('testConfig has to be a number'); } diff --git a/examples/kitchensink/src/admin/app.example.js b/examples/kitchensink/src/admin/app.example.js index d4278b95e4..aa8cbb54a7 100644 --- a/examples/kitchensink/src/admin/app.example.js +++ b/examples/kitchensink/src/admin/app.example.js @@ -2,8 +2,7 @@ import theme from './extensions/theme'; const config = { auth: { - logo: - 'https://images.unsplash.com/photo-1593642634367-d91a135587b5?ixid=MnwxMjA3fDF8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=750&q=80', + logo: 'https://images.unsplash.com/photo-1593642634367-d91a135587b5?ixid=MnwxMjA3fDF8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=750&q=80', }, head: { favicon: @@ -12,8 +11,7 @@ const config = { }, locales: ['fr', 'de'], menu: { - logo: - 'https://images.unsplash.com/photo-1593642634367-d91a135587b5?ixid=MnwxMjA3fDF8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=750&q=80', + logo: 'https://images.unsplash.com/photo-1593642634367-d91a135587b5?ixid=MnwxMjA3fDF8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=750&q=80', }, theme, translations: { @@ -29,7 +27,7 @@ const config = { notifications: { release: false }, }; -const bootstrap = app => { +const bootstrap = (app) => { console.log(app); }; diff --git a/examples/kitchensink/src/admin/app.js b/examples/kitchensink/src/admin/app.js index 417194815e..387cea3632 100644 --- a/examples/kitchensink/src/admin/app.js +++ b/examples/kitchensink/src/admin/app.js @@ -2,8 +2,7 @@ import theme from './extensions/theme'; const config = { auth: { - logo: - 'https://images.unsplash.com/photo-1593642634367-d91a135587b5?ixid=MnwxMjA3fDF8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=750&q=80', + logo: 'https://images.unsplash.com/photo-1593642634367-d91a135587b5?ixid=MnwxMjA3fDF8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=750&q=80', }, head: { favicon: @@ -12,8 +11,7 @@ const config = { }, locales: ['fr', 'de'], menu: { - logo: - 'https://images.unsplash.com/photo-1593642634367-d91a135587b5?ixid=MnwxMjA3fDF8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=750&q=80', + logo: 'https://images.unsplash.com/photo-1593642634367-d91a135587b5?ixid=MnwxMjA3fDF8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=750&q=80', }, theme, translations: { @@ -29,7 +27,7 @@ const config = { notifications: { release: false }, }; -const bootstrap = app => { +const bootstrap = (app) => { console.log(app); }; diff --git a/package.json b/package.json index 183757cbeb..2ce7ddb2ec 100644 --- a/package.json +++ b/package.json @@ -71,6 +71,10 @@ "@babel/polyfill": "7.12.1" }, "devDependencies": { + "@babel/core": "7.18.10", + "@babel/eslint-parser": "7.18.9", + "@babel/preset-react": "7.18.6", + "@strapi/eslint-config": "0.1.1", "@swc/core": "1.2.224", "@swc/jest": "0.2.22", "@testing-library/react": "11.2.7", @@ -82,22 +86,13 @@ "chokidar": "3.5.3", "cross-env": "7.0.3", "dotenv": "14.2.0", - "eslint": "7.32.0", - "eslint-config-airbnb": "18.2.1", - "eslint-config-airbnb-base": "14.2.1", - "eslint-config-prettier": "6.15.0", - "eslint-plugin-import": "2.26.0", - "eslint-plugin-jsdoc": "36.1.1", - "eslint-plugin-jsx-a11y": "6.6.1", - "eslint-plugin-node": "11.1.0", - "eslint-plugin-react": "7.30.1", - "eslint-plugin-react-hooks": "4.6.0", - "eslint-plugin-redux-saga": "1.3.2", + "eslint": "8.21.0", "execa": "1.0.0", "fs-extra": "10.1.0", "get-port": "5.1.1", "glob": "7.2.3", "husky": "3.1.0", + "inquirer": "8.2.4", "istanbul": "~0.4.2", "jest": "26.6.3", "jest-circus": "26.6.3", @@ -110,7 +105,7 @@ "npm-run-all": "4.1.5", "nx": "14.4.2", "plop": "2.7.6", - "prettier": "1.19.1", + "prettier": "2.7.1", "qs": "6.11.0", "react-test-renderer": "17.0.2", "request": "2.88.2", diff --git a/packages/admin-test-utils/lib/fixtures/store/index.js b/packages/admin-test-utils/lib/fixtures/store/index.js index 4c9ac95f14..4211451569 100644 --- a/packages/admin-test-utils/lib/fixtures/store/index.js +++ b/packages/admin-test-utils/lib/fixtures/store/index.js @@ -1,6 +1,5 @@ 'use strict'; -// eslint-disable-next-line node/no-extraneous-require const { combineReducers, createStore } = require('redux'); const reducers = { diff --git a/packages/admin-test-utils/lib/setup/strapi.js b/packages/admin-test-utils/lib/setup/strapi.js index a6421d14cf..3147b86eb6 100644 --- a/packages/admin-test-utils/lib/setup/strapi.js +++ b/packages/admin-test-utils/lib/setup/strapi.js @@ -25,4 +25,4 @@ global.strapi = { global.prompt = jest.fn(); -global.URL.createObjectURL = file => `http://localhost:4000/assets/${file.name}`; +global.URL.createObjectURL = (file) => `http://localhost:4000/assets/${file.name}`; diff --git a/packages/admin-test-utils/lib/setup/test-bundler.js b/packages/admin-test-utils/lib/setup/test-bundler.js index 03207ab94a..fb6c50c8e8 100644 --- a/packages/admin-test-utils/lib/setup/test-bundler.js +++ b/packages/admin-test-utils/lib/setup/test-bundler.js @@ -1,7 +1,6 @@ 'use strict'; // needed for regenerator-runtime -// (ES7 generator support is required by redux-saga) require('@babel/polyfill'); const noop = () => {}; diff --git a/packages/admin-test-utils/package.json b/packages/admin-test-utils/package.json index fa82dd43eb..d921cafba4 100644 --- a/packages/admin-test-utils/package.json +++ b/packages/admin-test-utils/package.json @@ -24,6 +24,9 @@ "@testing-library/jest-dom": "5.16.5", "jest-styled-components": "7.0.2" }, + "peerDependencies": { + "redux": "^4.0.1" + }, "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, diff --git a/packages/cli/create-strapi-app/create-strapi-app.js b/packages/cli/create-strapi-app/create-strapi-app.js index ce39878732..50188fb8b4 100644 --- a/packages/cli/create-strapi-app/create-strapi-app.js +++ b/packages/cli/create-strapi-app/create-strapi-app.js @@ -39,7 +39,7 @@ program .option('--template ', 'Specify a Strapi template') .option('--ts, --typescript', 'Use TypeScript to generate the project') .description('create a new application') - .action(directory => { + .action((directory) => { initProject(directory, program); }) .parse(process.argv); @@ -62,7 +62,7 @@ async function initProject(projectName, program) { await checkInstallPath(resolve(projectName)); } - const hasDatabaseOptions = databaseOptions.some(opt => program[opt]); + const hasDatabaseOptions = databaseOptions.some((opt) => program[opt]); if (program.quickstart && hasDatabaseOptions) { console.error( diff --git a/packages/cli/create-strapi-app/index.js b/packages/cli/create-strapi-app/index.js index ef3a3ce78e..7f34f0f3f2 100755 --- a/packages/cli/create-strapi-app/index.js +++ b/packages/cli/create-strapi-app/index.js @@ -1,4 +1,5 @@ #!/usr/bin/env node + 'use strict'; require('./create-strapi-app'); diff --git a/packages/cli/create-strapi-starter/create-strapi-starter.js b/packages/cli/create-strapi-starter/create-strapi-starter.js index 4e27261c30..919349bf52 100644 --- a/packages/cli/create-strapi-starter/create-strapi-starter.js +++ b/packages/cli/create-strapi-starter/create-strapi-starter.js @@ -57,7 +57,9 @@ function generateApp(projectArgs, programArgs) { } async function initProject(projectArgs, program) { - const hasIncompatibleQuickstartOptions = incompatibleQuickstartOptions.some(opt => program[opt]); + const hasIncompatibleQuickstartOptions = incompatibleQuickstartOptions.some( + (opt) => program[opt] + ); if (program.quickstart && hasIncompatibleQuickstartOptions) { console.error( @@ -96,7 +98,7 @@ async function initProject(projectArgs, program) { try { program.parse(process.argv); } catch (err) { - if (err.exitCode && err.exitCode != 0) { + if (err.exitCode && err.exitCode !== 0) { program.outputHelp(); } } diff --git a/packages/cli/create-strapi-starter/index.js b/packages/cli/create-strapi-starter/index.js index 01bfe1deee..3f4347847e 100755 --- a/packages/cli/create-strapi-starter/index.js +++ b/packages/cli/create-strapi-starter/index.js @@ -1,4 +1,5 @@ #!/usr/bin/env node + 'use strict'; require('./create-strapi-starter'); diff --git a/packages/cli/create-strapi-starter/utils/build-starter.js b/packages/cli/create-strapi-starter/utils/build-starter.js index e76c084a89..8b01c42f08 100644 --- a/packages/cli/create-strapi-starter/utils/build-starter.js +++ b/packages/cli/create-strapi-starter/utils/build-starter.js @@ -72,10 +72,7 @@ async function installWithLogs(path, options) { const installPrefix = chalk.yellow('Installing dependencies:'); const loader = ora(installPrefix).start(); const logInstall = (chunk = '') => { - loader.text = `${installPrefix} ${chunk - .toString() - .split('\n') - .join(' ')}`; + loader.text = `${installPrefix} ${chunk.toString().split('\n').join(' ')}`; }; const runner = runInstall(path, options); @@ -94,7 +91,7 @@ async function installWithLogs(path, options) { * @param {boolean} options.useYarn Use yarn instead of npm */ async function getStarterInfo(starter, { useYarn } = {}) { - const isLocalStarter = ['./', '../', '/'].some(filePrefix => starter.startsWith(filePrefix)); + const isLocalStarter = ['./', '../', '/'].some((filePrefix) => starter.startsWith(filePrefix)); let starterPath; let starterParentPath; @@ -125,12 +122,8 @@ async function getStarterInfo(starter, { useYarn } = {}) { */ module.exports = async function buildStarter({ projectName, starter }, program) { const hasYarnInstalled = await hasYarn(); - const { - isLocalStarter, - starterPath, - starterParentPath, - starterPackageInfo, - } = await getStarterInfo(starter, { useYarn: hasYarnInstalled }); + const { isLocalStarter, starterPath, starterParentPath, starterPackageInfo } = + await getStarterInfo(starter, { useYarn: hasYarnInstalled }); // Project directory const rootPath = resolve(projectName); diff --git a/packages/cli/create-strapi-starter/utils/child-process.js b/packages/cli/create-strapi-starter/utils/child-process.js index 9ba241e5df..bc532bbd5e 100644 --- a/packages/cli/create-strapi-starter/utils/child-process.js +++ b/packages/cli/create-strapi-starter/utils/child-process.js @@ -27,12 +27,11 @@ function runApp(rootPath, { useYarn } = {}) { stdio: 'inherit', cwd: rootPath, }); - } else { - return execa('npm', ['run', 'develop'], { - stdio: 'inherit', - cwd: rootPath, - }); } + return execa('npm', ['run', 'develop'], { + stdio: 'inherit', + cwd: rootPath, + }); } async function initGit(rootPath) { diff --git a/packages/cli/create-strapi-starter/utils/stop-process.js b/packages/cli/create-strapi-starter/utils/stop-process.js index af8137f61b..e2f3360057 100644 --- a/packages/cli/create-strapi-starter/utils/stop-process.js +++ b/packages/cli/create-strapi-starter/utils/stop-process.js @@ -1,4 +1,5 @@ 'use strict'; + const logger = require('./logger'); module.exports = function stopProcess(message) { diff --git a/packages/core/admin/admin/src/StrapiApp.js b/packages/core/admin/admin/src/StrapiApp.js index fbc6a8e9c6..cca63eb768 100644 --- a/packages/core/admin/admin/src/StrapiApp.js +++ b/packages/core/admin/admin/src/StrapiApp.js @@ -61,15 +61,15 @@ class StrapiApp { }; } - addComponents = components => { + addComponents = (components) => { if (Array.isArray(components)) { - components.map(compo => this.library.components.add(compo)); + components.map((compo) => this.library.components.add(compo)); } else { this.library.components.add(components); } }; - addCorePluginMenuLink = link => { + addCorePluginMenuLink = (link) => { const stringifiedLink = JSON.stringify(link); invariant(link.to, `link.to should be defined for ${stringifiedLink}`); @@ -89,15 +89,15 @@ class StrapiApp { this.menu.push(link); }; - addFields = fields => { + addFields = (fields) => { if (Array.isArray(fields)) { - fields.map(field => this.library.fields.add(field)); + fields.map((field) => this.library.fields.add(field)); } else { this.library.fields.add(fields); } }; - addMenuLink = link => { + addMenuLink = (link) => { const stringifiedLink = JSON.stringify(link); invariant(link.to, `link.to should be defined for ${stringifiedLink}`); @@ -121,14 +121,14 @@ class StrapiApp { this.menu.push(link); }; - addMiddlewares = middlewares => { - middlewares.forEach(middleware => { + addMiddlewares = (middlewares) => { + middlewares.forEach((middleware) => { this.middlewares.add(middleware); }); }; - addReducers = reducers => { - Object.keys(reducers).forEach(reducerName => { + addReducers = (reducers) => { + Object.keys(reducers).forEach((reducerName) => { this.reducers.add(reducerName, reducers[reducerName]); }); }; @@ -156,13 +156,13 @@ class StrapiApp { invariant(this.settings[sectionId], 'The section does not exist'); invariant(Array.isArray(links), 'TypeError expected links to be an array'); - links.forEach(link => { + links.forEach((link) => { this.addSettingsLink(sectionId, link); }); }; async bootstrap() { - Object.keys(this.appPlugins).forEach(plugin => { + Object.keys(this.appPlugins).forEach((plugin) => { const bootstrap = this.appPlugins[plugin].bootstrap; if (bootstrap) { @@ -208,7 +208,7 @@ class StrapiApp { if (this.customConfigurations?.locales) { this.configurations.locales = [ 'en', - ...this.customConfigurations.locales?.filter(loc => loc !== 'en'), + ...(this.customConfigurations.locales?.filter((loc) => loc !== 'en') || []), ]; } @@ -237,7 +237,7 @@ class StrapiApp { } }; - createHook = name => { + createHook = (name) => { this.hooksDict[name] = createHook(); }; @@ -253,7 +253,7 @@ class StrapiApp { this.settings[section.id] = { ...section, links: [] }; - links.forEach(link => { + links.forEach((link) => { this.addSettingsLink(section.id, link); }); }; @@ -274,12 +274,12 @@ class StrapiApp { } }; - getPlugin = pluginId => { + getPlugin = (pluginId) => { return this.plugins[pluginId]; }; async initialize() { - Object.keys(this.appPlugins).forEach(plugin => { + Object.keys(this.appPlugins).forEach((plugin) => { this.appPlugins[plugin].register({ addComponents: this.addComponents, addCorePluginMenuLink: this.addCorePluginMenuLink, @@ -319,7 +319,7 @@ class StrapiApp { * @returns {Object} The imported admin translations */ async loadAdminTrads() { - const arrayOfPromises = this.configurations.locales.map(locale => { + const arrayOfPromises = this.configurations.locales.map((locale) => { return import(/* webpackChunkName: "[request]" */ `./translations/${locale}.json`) .then(({ default: data }) => { return { data, locale }; @@ -350,7 +350,7 @@ class StrapiApp { const adminTranslations = await this.loadAdminTrads(); const arrayOfPromises = Object.keys(this.appPlugins) - .map(plugin => { + .map((plugin) => { const registerTrads = this.appPlugins[plugin].registerTrads; if (registerTrads) { @@ -359,7 +359,7 @@ class StrapiApp { return null; }) - .filter(a => a); + .filter((a) => a); const pluginsTrads = await Promise.all(arrayOfPromises); const mergedTrads = pluginsTrads.reduce((acc, currentPluginTrads) => { @@ -369,7 +369,7 @@ class StrapiApp { return acc1; }, {}); - Object.keys(pluginTrads).forEach(locale => { + Object.keys(pluginTrads).forEach((locale) => { acc[locale] = { ...acc[locale], ...pluginTrads[locale] }; }); @@ -399,7 +399,7 @@ class StrapiApp { this.hooksDict[name].register(fn); }; - registerPlugin = pluginConf => { + registerPlugin = (pluginConf) => { const plugin = Plugin(pluginConf); this.plugins[plugin.pluginId] = plugin; @@ -414,7 +414,7 @@ class StrapiApp { : this.hooksDict[name].runWaterfall(initialValue, store); }; - runHookParallel = name => this.hooksDict[name].runParallel(); + runHookParallel = (name) => this.hooksDict[name].runParallel(); render() { const store = this.createStore(); diff --git a/packages/core/admin/admin/src/components/AuthenticatedApp/index.js b/packages/core/admin/admin/src/components/AuthenticatedApp/index.js index bbe6da4a25..143260812c 100644 --- a/packages/core/admin/admin/src/components/AuthenticatedApp/index.js +++ b/packages/core/admin/admin/src/components/AuthenticatedApp/index.js @@ -56,9 +56,10 @@ const AuthenticatedApp = () => { }, ]); - const shouldUpdateStrapi = useMemo(() => checkLatestStrapiVersion(strapiVersion, tag_name), [ - tag_name, - ]); + const shouldUpdateStrapi = useMemo( + () => checkLatestStrapiVersion(strapiVersion, tag_name), + [tag_name] + ); useEffect(() => { if (userRoles) { @@ -77,6 +78,16 @@ const AuthenticatedApp = () => { const shouldShowLoader = isLoading || shouldShowNotDependentQueriesLoader; + const appInfosValue = useMemo(() => { + return { + ...appInfos, + latestStrapiReleaseTag: tag_name, + setUserDisplayName, + shouldUpdateStrapi, + userDisplayName, + }; + }, [appInfos, tag_name, shouldUpdateStrapi, userDisplayName]); + if (shouldShowLoader) { return ; } @@ -87,15 +98,7 @@ const AuthenticatedApp = () => { } return ( - + 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 757b96b065..7f185a7207 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,4 +1,5 @@ import React from 'react'; +import PropTypes from 'prop-types'; import { render, waitFor } from '@testing-library/react'; import { QueryClientProvider, QueryClient } from 'react-query'; import { useGuidedTour } from '@strapi/helper-plugin'; @@ -35,9 +36,19 @@ jest.mock('../utils/api', () => ({ fetchUserRoles: jest.fn(), })); -jest.mock('../../PluginsInitializer', () => () =>
PluginsInitializer
); +jest.mock('../../PluginsInitializer', () => () => { + return
PluginsInitializer
; +}); // eslint-disable-next-line react/prop-types -jest.mock('../../RBACProvider', () => ({ children }) =>
{children}
); +jest.mock('../../RBACProvider', () => { + const Compo = ({ children }) =>
{children}
; + + Compo.propTypes = { + children: PropTypes.node.isRequired, + }; + + return Compo; +}); const queryClient = new QueryClient({ defaultOptions: { @@ -47,11 +58,13 @@ const queryClient = new QueryClient({ }, }); -const app = ( +const configurationContextValue = { showReleaseNotification: false }; + +const App = () => ( - + @@ -81,7 +94,7 @@ describe('Admin | components | AuthenticatedApp', () => { ); fetchCurrentUserPermissions.mockImplementation(() => Promise.resolve([])); - const { container } = render(app); + const { container } = render(); expect(container.firstChild).toMatchInlineSnapshot(` .c0 { @@ -147,7 +160,7 @@ describe('Admin | components | AuthenticatedApp', () => { }); it('should not fetch the latest release', () => { - render(app); + render(); expect(fetchStrapiLatestRelease).not.toHaveBeenCalled(); }); @@ -157,7 +170,7 @@ describe('Admin | components | AuthenticatedApp', () => { const setGuidedTourVisibility = jest.fn(); useGuidedTour.mockImplementation(() => ({ setGuidedTourVisibility })); - render(app); + render(); await waitFor(() => expect(setGuidedTourVisibility).not.toHaveBeenCalled()); }); @@ -166,7 +179,7 @@ describe('Admin | components | AuthenticatedApp', () => { fetchUserRoles.mockImplementationOnce(() => [{ code: 'strapi-super-admin' }]); const setGuidedTourVisibility = jest.fn(); useGuidedTour.mockImplementation(() => ({ setGuidedTourVisibility })); - render(app); + render(); await waitFor(() => expect(setGuidedTourVisibility).toHaveBeenCalledWith(true)); }); 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 fab3208161..2f03015bb4 100644 --- a/packages/core/admin/admin/src/components/AuthenticatedApp/utils/api.js +++ b/packages/core/admin/admin/src/components/AuthenticatedApp/utils/api.js @@ -6,7 +6,7 @@ import packageJSON from '../../../../../package.json'; const strapiVersion = packageJSON.version; const showUpdateNotif = !JSON.parse(localStorage.getItem('STRAPI_UPDATE_NOTIF')); -const fetchStrapiLatestRelease = async toggleNotification => { +const fetchStrapiLatestRelease = async (toggleNotification) => { try { const { data: { tag_name }, diff --git a/packages/core/admin/admin/src/components/AutoReloadOverlayBlockerProvider/index.js b/packages/core/admin/admin/src/components/AutoReloadOverlayBlockerProvider/index.js index a0eddbb254..089f949d37 100644 --- a/packages/core/admin/admin/src/components/AutoReloadOverlayBlockerProvider/index.js +++ b/packages/core/admin/admin/src/components/AutoReloadOverlayBlockerProvider/index.js @@ -1,4 +1,4 @@ -import React, { useEffect, useRef, useState } from 'react'; +import React, { useEffect, useMemo, useRef, useState } from 'react'; import PropTypes from 'prop-types'; import { AutoReloadOverlayBockerContext } from '@strapi/helper-plugin'; import Blocker from './Blocker'; @@ -13,7 +13,7 @@ const AutoReloadOverlayBlockerProvider = ({ children }) => { const lockAppWithAutoreload = (config = undefined) => { setIsOpen(true); setConfig(config); - setState(prev => ({ ...prev, start: Date.now() })); + setState((prev) => ({ ...prev, start: Date.now() })); }; const unlockAppWithAutoreload = () => { @@ -36,7 +36,7 @@ const AutoReloadOverlayBlockerProvider = ({ children }) => { return null; } - setState(prev => ({ ...prev, elapsed: Math.round(Date.now() - prev.start) / 1000 })); + setState((prev) => ({ ...prev, elapsed: Math.round(Date.now() - prev.start) / 1000 })); return null; }, 1000); @@ -75,10 +75,12 @@ const AutoReloadOverlayBlockerProvider = ({ children }) => { }; } + const autoReloadValue = useMemo(() => { + return { lockApp: lockApp.current, unlockApp: unlockApp.current }; + }, [lockApp, unlockApp]); + return ( - + { + return { + logos: { + menu: { custom: menuLogo, default: defaultMenuLogo }, + auth: { custom: null, default: authLogo }, + }, + updateProjectSettings: updateProjectSettingsRef.current, + showReleaseNotification, + showTutorials, + }; + }, [ + authLogo, + menuLogo, + showReleaseNotification, + showTutorials, + updateProjectSettingsRef, + defaultMenuLogo, + ]); + return ( - + {children} ); diff --git a/packages/core/admin/admin/src/components/ConfigurationsProvider/reducer.js b/packages/core/admin/admin/src/components/ConfigurationsProvider/reducer.js index 5f2e5d5921..d0696530e7 100644 --- a/packages/core/admin/admin/src/components/ConfigurationsProvider/reducer.js +++ b/packages/core/admin/admin/src/components/ConfigurationsProvider/reducer.js @@ -12,7 +12,7 @@ const initialState = { }; const reducer = (state = initialState, action) => - produce(state, draftState => { + produce(state, (draftState) => { switch (action.type) { case 'UPDATE_PROJECT_SETTINGS': { Object.assign(draftState, action.values); 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 f3409be7ac..a0c032d0b4 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 @@ -19,7 +19,7 @@ const getType = (activeSectionIndex, index) => { }; const StepperHomepage = ({ sections, currentSectionKey }) => { - const activeSectionIndex = sections.findIndex(section => section.key === currentSectionKey); + const activeSectionIndex = sections.findIndex((section) => section.key === currentSectionKey); return ( 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 513af74fa2..d42c860ff5 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 @@ -31,7 +31,7 @@ const sections = [ }, ]; -const App = children => ( +const App = (children) => ( {children} 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 367bb69293..d72871d541 100644 --- a/packages/core/admin/admin/src/components/GuidedTour/Homepage/index.js +++ b/packages/core/admin/admin/src/components/GuidedTour/Homepage/index.js @@ -29,12 +29,12 @@ const GuidedTourHomepage = () => { ), })); - const enrichedSections = sections.map(section => ({ + const enrichedSections = sections.map((section) => ({ isDone: Object.entries(guidedTourState[section.key]).every(([, value]) => value), ...section, })); - const activeSection = enrichedSections.find(section => !section.isDone)?.key; + const activeSection = enrichedSections.find((section) => !section.isDone)?.key; const handleSkip = () => { setSkipped(true); 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 34d614ec87..6360a4d9ec 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 @@ -3,7 +3,7 @@ import { render, screen } from '@testing-library/react'; import { Router } from 'react-router-dom'; import { createMemoryHistory } from 'history'; import { IntlProvider } from 'react-intl'; -import { useGuidedTour, TrackingContext } from '@strapi/helper-plugin'; +import { useGuidedTour, TrackingProvider } from '@strapi/helper-plugin'; import { ThemeProvider, lightTheme } from '@strapi/design-system'; import GuidedTourHomepage from '../index'; @@ -31,7 +31,7 @@ jest.mock('@strapi/helper-plugin', () => ({ const history = createMemoryHistory(); const App = ( - + @@ -39,7 +39,7 @@ const App = ( - + ); describe('GuidedTour Homepage', () => { 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 be1ad8f7d2..09bcd0dafc 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 @@ -18,7 +18,7 @@ const Content = ({ id, defaultMessage }) => { {formatMessage( { id, defaultMessage }, { - documentationLink: children => ( + documentationLink: (children) => ( { {children} ), - b: children => {children}, - p: children => {children}, - light: children => {children}, - ul: children => ( + b: (children) => {children}, + p: (children) => {children}, + light: (children) => {children}, + ul: (children) => (
    {children}
), - li: children => {children}, + li: (children) => {children}, } )} 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 e501a65ac0..f60f5b71dd 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 @@ -36,7 +36,7 @@ const Modal = ({ onClose, onSkip, children, hideSkip }) => { spacing={8} role="dialog" aria-modal - onClick={e => e.stopPropagation()} + onClick={(e) => e.stopPropagation()} > { setSkipped, } = useGuidedTour(); const [isVisible, setIsVisible] = useState(currentStep); - const [ - { stepContent, sectionIndex, stepIndex, hasSectionAfter, hasStepAfter }, - dispatch, - ] = useReducer(reducer, initialState); + const [{ stepContent, sectionIndex, stepIndex, hasSectionAfter, hasStepAfter }, dispatch] = + useReducer(reducer, initialState); const { trackUsage } = useTracking(); useEffect(() => { diff --git a/packages/core/admin/admin/src/components/GuidedTour/Modal/reducer.js b/packages/core/admin/admin/src/components/GuidedTour/Modal/reducer.js index e71250eb0a..da50f47332 100644 --- a/packages/core/admin/admin/src/components/GuidedTour/Modal/reducer.js +++ b/packages/core/admin/admin/src/components/GuidedTour/Modal/reducer.js @@ -10,7 +10,7 @@ export const initialState = { }; const reducer = (state = initialState, action) => - produce(state, draftState => { + produce(state, (draftState) => { switch (action.type) { case 'UPDATE_MODAL': { draftState.stepContent = action.content; 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 fad0a60318..2bf66dc319 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,7 +1,7 @@ import React from 'react'; import { render, screen } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; -import { useGuidedTour, TrackingContext } from '@strapi/helper-plugin'; +import { useGuidedTour, TrackingProvider } from '@strapi/helper-plugin'; import { lightTheme, darkTheme } from '@strapi/design-system'; import Theme from '../../../Theme'; import ThemeToggleProvider from '../../../ThemeToggleProvider'; @@ -30,7 +30,7 @@ jest.mock('@strapi/helper-plugin', () => ({ })); const App = ( - + @@ -38,7 +38,7 @@ const App = ( - + ); describe('', () => { diff --git a/packages/core/admin/admin/src/components/GuidedTour/index.js b/packages/core/admin/admin/src/components/GuidedTour/index.js index c68af686a9..cab615509c 100644 --- a/packages/core/admin/admin/src/components/GuidedTour/index.js +++ b/packages/core/admin/admin/src/components/GuidedTour/index.js @@ -15,7 +15,7 @@ const GuidedTour = ({ children }) => { init ); - const setCurrentStep = step => { + const setCurrentStep = (step) => { // if step is null it is intentional, we need to dispatch it if (step !== null) { const isStepAlreadyDone = get(guidedTourState, step); @@ -34,7 +34,7 @@ const GuidedTour = ({ children }) => { }); }; - const setGuidedTourVisibility = value => { + const setGuidedTourVisibility = (value) => { dispatch({ type: 'SET_GUIDED_TOUR_VISIBILITY', value, @@ -51,7 +51,7 @@ const GuidedTour = ({ children }) => { }); }; - const startSection = sectionName => { + const startSection = (sectionName) => { const sectionSteps = guidedTourState[sectionName]; if (sectionSteps) { @@ -67,7 +67,7 @@ const GuidedTour = ({ children }) => { return null; }; - const setSkipped = value => { + const setSkipped = (value) => { persistStateToLocaleStorage.setSkipped(value); dispatch({ diff --git a/packages/core/admin/admin/src/components/GuidedTour/init.js b/packages/core/admin/admin/src/components/GuidedTour/init.js index 176fe444f1..4aadedce0b 100644 --- a/packages/core/admin/admin/src/components/GuidedTour/init.js +++ b/packages/core/admin/admin/src/components/GuidedTour/init.js @@ -5,14 +5,14 @@ import persistStateToLocaleStorage, { SKIPPED, } from './utils/persistStateToLocaleStorage'; -const init = initialState => { +const init = (initialState) => { const copyInitialState = { ...initialState }; const guidedTourLocaleStorage = persistStateToLocaleStorage.get(COMPLETED_STEPS); const currentStepLocaleStorage = persistStateToLocaleStorage.get(CURRENT_STEP); const skippedLocaleStorage = persistStateToLocaleStorage.get(SKIPPED); if (guidedTourLocaleStorage) { - guidedTourLocaleStorage.forEach(step => { + guidedTourLocaleStorage.forEach((step) => { const [sectionName, stepName] = step.split('.'); set(copyInitialState, ['guidedTourState', sectionName, stepName], true); }); diff --git a/packages/core/admin/admin/src/components/GuidedTour/reducer.js b/packages/core/admin/admin/src/components/GuidedTour/reducer.js index 47ea171977..7887e89b5b 100644 --- a/packages/core/admin/admin/src/components/GuidedTour/reducer.js +++ b/packages/core/admin/admin/src/components/GuidedTour/reducer.js @@ -22,7 +22,7 @@ export const initialState = { }; const reducer = (state = initialState, action) => - produce(state, draftState => { + produce(state, (draftState) => { switch (action.type) { case 'SET_CURRENT_STEP': { draftState.currentStep = action.step; diff --git a/packages/core/admin/admin/src/components/GuidedTour/utils/isGuidedTourCompleted.js b/packages/core/admin/admin/src/components/GuidedTour/utils/isGuidedTourCompleted.js index d48755d6a5..2296ed7ef5 100644 --- a/packages/core/admin/admin/src/components/GuidedTour/utils/isGuidedTourCompleted.js +++ b/packages/core/admin/admin/src/components/GuidedTour/utils/isGuidedTourCompleted.js @@ -1,4 +1,4 @@ -const isGuidedTourCompleted = guidedTourState => +const isGuidedTourCompleted = (guidedTourState) => Object.entries(guidedTourState).every(([, section]) => Object.entries(section).every(([, step]) => step) ); diff --git a/packages/core/admin/admin/src/components/GuidedTour/utils/persistStateToLocaleStorage.js b/packages/core/admin/admin/src/components/GuidedTour/utils/persistStateToLocaleStorage.js index 71104a32a2..57b3dd7bb5 100644 --- a/packages/core/admin/admin/src/components/GuidedTour/utils/persistStateToLocaleStorage.js +++ b/packages/core/admin/admin/src/components/GuidedTour/utils/persistStateToLocaleStorage.js @@ -9,7 +9,7 @@ const persistStateToLocaleStorage = { localStorage.removeItem(CURRENT_STEP); localStorage.removeItem(COMPLETED_STEPS); }, - addCompletedStep: completedStep => { + addCompletedStep(completedStep) { const currentSteps = parse(localStorage.getItem(COMPLETED_STEPS))?.slice() || []; const isAlreadyStored = currentSteps.includes(completedStep); @@ -20,13 +20,13 @@ const persistStateToLocaleStorage = { currentSteps.push(completedStep); localStorage.setItem(COMPLETED_STEPS, stringify(currentSteps)); }, - addCurrentStep: currentStep => { + addCurrentStep(currentStep) { localStorage.setItem(CURRENT_STEP, stringify(currentStep)); }, - setSkipped: value => { + setSkipped(value) { localStorage.setItem(SKIPPED, stringify(value)); }, - get: item => { + get(item) { return parse(localStorage.getItem(item)); }, }; diff --git a/packages/core/admin/admin/src/components/LanguageProvider/index.js b/packages/core/admin/admin/src/components/LanguageProvider/index.js index ac0b8b591f..d94e792dc3 100644 --- a/packages/core/admin/admin/src/components/LanguageProvider/index.js +++ b/packages/core/admin/admin/src/components/LanguageProvider/index.js @@ -23,7 +23,7 @@ const LanguageProvider = ({ children, localeNames, messages }) => { window.localStorage.setItem(localStorageKey, locale); }, [locale]); - const changeLocale = locale => { + const changeLocale = (locale) => { dispatch({ type: 'CHANGE_LOCALE', locale, diff --git a/packages/core/admin/admin/src/components/LanguageProvider/init.js b/packages/core/admin/admin/src/components/LanguageProvider/init.js index 2e63937469..54d4f8b7d4 100644 --- a/packages/core/admin/admin/src/components/LanguageProvider/init.js +++ b/packages/core/admin/admin/src/components/LanguageProvider/init.js @@ -1,6 +1,6 @@ import localStorageKey from './utils/localStorageKey'; -const init = localeNames => { +const init = (localeNames) => { const languageFromLocaleStorage = window.localStorage.getItem(localStorageKey); const appLanguage = localeNames[languageFromLocaleStorage] ? languageFromLocaleStorage : 'en'; diff --git a/packages/core/admin/admin/src/components/LeftMenu/index.js b/packages/core/admin/admin/src/components/LeftMenu/index.js index 79c21683af..23b936b3b8 100644 --- a/packages/core/admin/admin/src/components/LeftMenu/index.js +++ b/packages/core/admin/admin/src/components/LeftMenu/index.js @@ -62,18 +62,18 @@ const LeftMenu = ({ generalSectionLinks, pluginsSectionLinks }) => { const initials = userDisplayName .split(' ') - .map(name => name.substring(0, 1)) + .map((name) => name.substring(0, 1)) .join('') .substring(0, 2); - const handleToggleUserLinks = () => setUserLinksVisible(prev => !prev); + const handleToggleUserLinks = () => setUserLinksVisible((prev) => !prev); const handleLogout = () => { auth.clearAppStorage(); handleToggleUserLinks(); }; - const handleBlur = e => { + const handleBlur = (e) => { if ( !e.currentTarget.contains(e.relatedTarget) && e.relatedTarget?.parentElement?.id !== 'main-nav-user-button' @@ -121,7 +121,7 @@ const LeftMenu = ({ generalSectionLinks, pluginsSectionLinks }) => { defaultMessage: 'Plugins', })} > - {pluginsSectionLinks.map(link => { + {pluginsSectionLinks.map((link) => { const Icon = link.icon; return ( @@ -140,7 +140,7 @@ const LeftMenu = ({ generalSectionLinks, pluginsSectionLinks }) => { defaultMessage: 'General', })} > - {generalSectionLinks.map(link => { + {generalSectionLinks.map((link) => { const LinkIcon = link.icon; return ( @@ -201,7 +201,7 @@ const LeftMenu = ({ generalSectionLinks, pluginsSectionLinks }) => { )} - setCondensed(s => !s)}> + setCondensed((s) => !s)}> {condensed ? formatMessage({ id: 'app.components.LeftMenu.expand', diff --git a/packages/core/admin/admin/src/components/Notifications/Notification/index.js b/packages/core/admin/admin/src/components/Notifications/Notification/index.js index a2a4c4cf7e..38b8138830 100644 --- a/packages/core/admin/admin/src/components/Notifications/Notification/index.js +++ b/packages/core/admin/admin/src/components/Notifications/Notification/index.js @@ -8,7 +8,8 @@ const Notification = ({ dispatch, notification }) => { const { formatMessage } = useIntl(); const { message, link, type, id, onClose, timeout, blockTransition } = notification; - const formattedMessage = msg => (typeof msg === 'string' ? msg : formatMessage(msg, msg.values)); + const formattedMessage = (msg) => + typeof msg === 'string' ? msg : formatMessage(msg, msg.values); const handleClose = useCallback(() => { if (onClose) { onClose(); @@ -66,9 +67,7 @@ const Notification = ({ dispatch, notification }) => { defaultMessage: link.label?.defaultMessage || link.label?.id || link.label, })} - ) : ( - undefined - ) + ) : undefined } onClose={handleClose} closeLabel="Close" diff --git a/packages/core/admin/admin/src/components/Notifications/index.js b/packages/core/admin/admin/src/components/Notifications/index.js index c8d6b68865..598beef842 100644 --- a/packages/core/admin/admin/src/components/Notifications/index.js +++ b/packages/core/admin/admin/src/components/Notifications/index.js @@ -8,7 +8,7 @@ import reducer, { initialState } from './reducer'; const Notifications = ({ children }) => { const [{ notifications }, dispatch] = useReducer(reducer, initialState); - const displayNotification = config => { + const displayNotification = (config) => { dispatch({ type: 'SHOW_NOTIFICATION', config, @@ -26,7 +26,7 @@ const Notifications = ({ children }) => { width={`${500 / 16}rem`} zIndex={10} > - {notifications.map(notification => { + {notifications.map((notification) => { return ( ); diff --git a/packages/core/admin/admin/src/components/Notifications/reducer.js b/packages/core/admin/admin/src/components/Notifications/reducer.js index 1d67d1696f..fbbd816df5 100644 --- a/packages/core/admin/admin/src/components/Notifications/reducer.js +++ b/packages/core/admin/admin/src/components/Notifications/reducer.js @@ -8,7 +8,7 @@ const initialState = { const notificationReducer = (state = initialState, action) => // eslint-disable-next-line consistent-return - produce(state, draftState => { + produce(state, (draftState) => { switch (action.type) { case 'SHOW_NOTIFICATION': { draftState.notifications.push({ @@ -28,7 +28,7 @@ const notificationReducer = (state = initialState, action) => break; } case 'HIDE_NOTIFICATION': { - const indexToRemove = state.notifications.findIndex(notif => notif.id === action.id); + const indexToRemove = state.notifications.findIndex((notif) => notif.id === action.id); if (indexToRemove !== -1) { draftState.notifications.splice(indexToRemove, 1); diff --git a/packages/core/admin/admin/src/components/Notifications/tests/index.test.js b/packages/core/admin/admin/src/components/Notifications/tests/index.test.js index 44ee3386e1..d42ecda652 100644 --- a/packages/core/admin/admin/src/components/Notifications/tests/index.test.js +++ b/packages/core/admin/admin/src/components/Notifications/tests/index.test.js @@ -108,7 +108,9 @@ describe('', () => { expect(items).toHaveLength(1); await act(async () => { - await new Promise(resolve => setTimeout(resolve, 2500)); + await new Promise((resolve) => { + setTimeout(resolve, 2500); + }); }); const foundItems = screen.queryAllByText(/simple notif/); @@ -151,7 +153,9 @@ describe('', () => { expect(items).toHaveLength(1); await act(async () => { - await new Promise(resolve => setTimeout(resolve, 2500)); + await new Promise((resolve) => { + setTimeout(resolve, 2500); + }); }); const foundItems = screen.queryAllByText(/simple notif/); diff --git a/packages/core/admin/admin/src/components/PluginsInitializer/index.js b/packages/core/admin/admin/src/components/PluginsInitializer/index.js index 8a4c1abc50..bd3a1b6c74 100644 --- a/packages/core/admin/admin/src/components/PluginsInitializer/index.js +++ b/packages/core/admin/admin/src/components/PluginsInitializer/index.js @@ -8,11 +8,13 @@ import reducer, { initialState } from './reducer'; const PluginsInitializer = () => { const { plugins: appPlugins } = useStrapiApp(); const [{ plugins }, dispatch] = useReducer(reducer, initialState, () => init(appPlugins)); - const setPlugin = useRef(pluginId => { + const setPlugin = useRef((pluginId) => { dispatch({ type: 'SET_PLUGIN_READY', pluginId }); }); - const hasApluginNotReady = Object.keys(plugins).some(plugin => plugins[plugin].isReady === false); + const hasApluginNotReady = Object.keys(plugins).some( + (plugin) => plugins[plugin].isReady === false + ); if (hasApluginNotReady) { const initializers = Object.keys(plugins).reduce((acc, current) => { diff --git a/packages/core/admin/admin/src/components/PluginsInitializer/init.js b/packages/core/admin/admin/src/components/PluginsInitializer/init.js index 50429ad16f..c73c65fa20 100644 --- a/packages/core/admin/admin/src/components/PluginsInitializer/init.js +++ b/packages/core/admin/admin/src/components/PluginsInitializer/init.js @@ -1,4 +1,4 @@ -const init = plugins => { +const init = (plugins) => { return { plugins: Object.keys(plugins).reduce((acc, current) => { acc[current] = { ...plugins[current] }; diff --git a/packages/core/admin/admin/src/components/PluginsInitializer/reducer.js b/packages/core/admin/admin/src/components/PluginsInitializer/reducer.js index d21382e503..eb5826edc9 100644 --- a/packages/core/admin/admin/src/components/PluginsInitializer/reducer.js +++ b/packages/core/admin/admin/src/components/PluginsInitializer/reducer.js @@ -7,7 +7,7 @@ const initialState = { const reducer = (state = initialState, action) => /* eslint-disable-next-line consistent-return */ - produce(state, draftState => { + produce(state, (draftState) => { switch (action.type) { case 'SET_PLUGIN_READY': { set(draftState, ['plugins', action.pluginId, 'isReady'], true); 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 c983d60da9..f9909a3e63 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 @@ -3,7 +3,9 @@ import { StrapiAppProvider } from '@strapi/helper-plugin'; import { render } from '@testing-library/react'; import PluginsInitializer from '../index'; -jest.mock('../../../pages/Admin', () => () =>
ADMIN
); +jest.mock('../../../pages/Admin', () => () => { + return
ADMIN
; +}); describe('ADMIN | COMPONENTS | PluginsInitializer', () => { it('should not crash', () => { diff --git a/packages/core/admin/admin/src/components/PrivateRoute/index.js b/packages/core/admin/admin/src/components/PrivateRoute/index.js index b5cc08bf1d..9f99bff0e9 100644 --- a/packages/core/admin/admin/src/components/PrivateRoute/index.js +++ b/packages/core/admin/admin/src/components/PrivateRoute/index.js @@ -20,7 +20,7 @@ const PrivateRoute = ({ component: Component, path, ...rest }) => { return ( + render={(props) => auth.getToken() !== null ? ( ) : ( diff --git a/packages/core/admin/admin/src/components/RBACProvider/actions.js b/packages/core/admin/admin/src/components/RBACProvider/actions.js index bb1629235f..dfaba17b30 100644 --- a/packages/core/admin/admin/src/components/RBACProvider/actions.js +++ b/packages/core/admin/admin/src/components/RBACProvider/actions.js @@ -2,7 +2,7 @@ import { RESET_STORE, SET_PERMISSIONS } from './constants'; const resetStore = () => ({ type: RESET_STORE }); -const setPermissions = permissions => ({ +const setPermissions = (permissions) => ({ type: SET_PERMISSIONS, permissions, }); diff --git a/packages/core/admin/admin/src/components/RBACProvider/index.js b/packages/core/admin/admin/src/components/RBACProvider/index.js index e93e52a7d2..15ec3ed7e8 100644 --- a/packages/core/admin/admin/src/components/RBACProvider/index.js +++ b/packages/core/admin/admin/src/components/RBACProvider/index.js @@ -5,7 +5,7 @@ import PropTypes from 'prop-types'; import { resetStore, setPermissions } from './actions'; const RBACProvider = ({ children, permissions, refetchPermissions }) => { - const { allPermissions } = useSelector(state => state.rbacProvider); + const { allPermissions } = useSelector((state) => state.rbacProvider); const dispatch = useDispatch(); diff --git a/packages/core/admin/admin/src/components/RBACProvider/reducer.js b/packages/core/admin/admin/src/components/RBACProvider/reducer.js index 9f28fd9871..1730c78751 100644 --- a/packages/core/admin/admin/src/components/RBACProvider/reducer.js +++ b/packages/core/admin/admin/src/components/RBACProvider/reducer.js @@ -18,12 +18,12 @@ const initialState = { const reducer = (state = initialState, action) => // eslint-disable-next-line consistent-return - produce(state, draftState => { + produce(state, (draftState) => { switch (action.type) { case SET_PERMISSIONS: { draftState.allPermissions = action.permissions; draftState.collectionTypesRelatedPermissions = action.permissions - .filter(perm => perm.subject) + .filter((perm) => perm.subject) .reduce((acc, current) => { const { subject, action } = current; 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 06a104c953..234f892b93 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,4 +1,4 @@ -import { permissions } from '../../../../../../../admin-test-utils/lib/fixtures'; +import { permissions } from '@strapi/admin-test-utils/lib/fixtures'; import { setPermissions, resetStore } from '../actions'; import rbacProviderReducer, { initialState } from '../reducer'; diff --git a/packages/core/admin/admin/src/components/ThemeToggleProvider/index.js b/packages/core/admin/admin/src/components/ThemeToggleProvider/index.js index 4810780def..b056ee090e 100644 --- a/packages/core/admin/admin/src/components/ThemeToggleProvider/index.js +++ b/packages/core/admin/admin/src/components/ThemeToggleProvider/index.js @@ -20,7 +20,7 @@ const getDefaultTheme = () => { const ThemeToggleProvider = ({ children, themes }) => { const [currentTheme, setCurrentTheme] = useState(getDefaultTheme()); - const handleChangeTheme = nextTheme => { + const handleChangeTheme = (nextTheme) => { setCurrentTheme(nextTheme); localStorage.setItem(THEME_KEY, nextTheme); }; diff --git a/packages/core/admin/admin/src/components/UpgradePlanModal/index.js b/packages/core/admin/admin/src/components/UpgradePlanModal/index.js index 376889feb9..1768f7dcad 100644 --- a/packages/core/admin/admin/src/components/UpgradePlanModal/index.js +++ b/packages/core/admin/admin/src/components/UpgradePlanModal/index.js @@ -73,7 +73,7 @@ const UpgradePlanModal = ({ onClose, isOpen }) => { e.stopPropagation()} + onClick={(e) => e.stopPropagation()} aria-labelledby="upgrade-plan" background="neutral0" hasRadius 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 2e93de492d..8a1f925675 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 @@ -16,7 +16,7 @@ const Filters = ({ displayedFilters }) => { if (!isVisible) { trackUsage('willFilterEntries'); } - setIsVisible(prev => !prev); + setIsVisible((prev) => !prev); }; return ( 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 c623406496..edfe341101 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 @@ -17,7 +17,7 @@ const useAllowedAttributes = (contentType, slug) => { const readPermissionForAttr = get(readPermissionsForSlug, ['0', 'properties', 'fields'], []); const attributesArray = Object.keys(get(contentType, ['attributes']), {}); const allowedAttributes = attributesArray - .filter(attr => { + .filter((attr) => { const current = get(contentType, ['attributes', attr], {}); if (!current.type) { 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 215c476090..48f922124d 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 @@ -7,7 +7,7 @@ import Filters from './Filters'; const AttributeFilter = ({ contentType, slug, metadatas }) => { const { formatMessage } = useIntl(); const allowedAttributes = useAllowedAttributes(contentType, slug); - const displayedFilters = allowedAttributes.map(name => { + const displayedFilters = allowedAttributes.map((name) => { const attribute = contentType.attributes[name]; const { type, enum: options } = attribute; diff --git a/packages/core/admin/admin/src/content-manager/components/Block/index.js b/packages/core/admin/admin/src/content-manager/components/Block/index.js index e398d0773b..1e1a62f027 100644 --- a/packages/core/admin/admin/src/content-manager/components/Block/index.js +++ b/packages/core/admin/admin/src/content-manager/components/Block/index.js @@ -8,7 +8,7 @@ import PropTypes from 'prop-types'; import { FormattedMessage } from 'react-intl'; import { Wrapper, Sub } from './components'; -const renderMsg = msg =>

{msg}

; +const renderMsg = (msg) =>

{msg}

; const Block = ({ children, description, style, title }) => (
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 11e89a54f0..399ce2ddee 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 @@ -40,13 +40,8 @@ const CollectionTypeFormWrapper = ({ allLayoutData, children, slug, id, origin } const { push, replace } = useHistory(); const [{ rawQuery }] = useQueryParams(); const dispatch = useDispatch(); - const { - componentsDataStructure, - contentTypeDataStructure, - data, - isLoading, - status, - } = useSelector(selectCrudReducer); + const { componentsDataStructure, contentTypeDataStructure, data, isLoading, status } = + useSelector(selectCrudReducer); const redirectionLink = useFindRedirectionLink(slug); const isMounted = useRef(true); @@ -65,7 +60,7 @@ const CollectionTypeFormWrapper = ({ allLayoutData, children, slug, id, origin } }, [slug, id, isCreatingEntry, origin]); const cleanClonedData = useCallback( - data => { + (data) => { if (!origin) { return data; } @@ -81,7 +76,7 @@ const CollectionTypeFormWrapper = ({ allLayoutData, children, slug, id, origin } [origin] ); - const cleanReceivedData = useCallback(data => { + const cleanReceivedData = useCallback((data) => { const cleaned = removePasswordFieldsFromData( data, allLayoutDataRef.current.contentType, @@ -136,7 +131,7 @@ const CollectionTypeFormWrapper = ({ allLayoutData, children, slug, id, origin } const CancelToken = axios.CancelToken; const source = CancelToken.source(); - const fetchData = async source => { + const fetchData = async (source) => { dispatch(getData()); try { @@ -201,7 +196,7 @@ const CollectionTypeFormWrapper = ({ allLayoutData, children, slug, id, origin } ]); const displayErrors = useCallback( - err => { + (err) => { const errorPayload = err.response.data; let errorMessage = get(errorPayload, ['error', 'message'], 'Bad Request'); @@ -218,7 +213,7 @@ const CollectionTypeFormWrapper = ({ allLayoutData, children, slug, id, origin } ); const onDelete = useCallback( - async trackerProperty => { + async (trackerProperty) => { try { trackUsageRef.current('willDeleteEntry', trackerProperty); diff --git a/packages/core/admin/admin/src/content-manager/components/DragLayer/index.js b/packages/core/admin/admin/src/content-manager/components/DragLayer/index.js index 69ccb9a67c..12fac50850 100644 --- a/packages/core/admin/admin/src/content-manager/components/DragLayer/index.js +++ b/packages/core/admin/admin/src/content-manager/components/DragLayer/index.js @@ -36,7 +36,7 @@ function getItemStyles(initialOffset, currentOffset, mouseOffset) { const CustomDragLayer = () => { const { itemType, isDragging, item, initialOffset, currentOffset, mouseOffset } = useDragLayer( - monitor => ({ + (monitor) => ({ item: monitor.getItem(), itemType: monitor.getItemType(), initialOffset: monitor.getInitialSourceClientOffset(), 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 ace7d6a937..52037e50cd 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 @@ -85,7 +85,7 @@ const RelationMultiple = ({ fieldSchema, metadatas, queryInfos, name, rowId, val {status === 'success' && ( <> - {data?.results.map(entry => ( + {data?.results.map((entry) => ( { return ( - {value.map(item => ( + {value.map((item) => ( diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/utils/tests/isSingleRelation.test.js b/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/utils/tests/isSingleRelation.test.js index eb9848be01..9392a7256e 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/utils/tests/isSingleRelation.test.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicTable/CellContent/utils/tests/isSingleRelation.test.js @@ -1,7 +1,7 @@ import isSingleRelation from '../isSingleRelation'; describe('isSingleRelation', () => { - ['oneToOne', 'manyToOne', 'oneToOneMorph'].forEach(type => { + ['oneToOne', 'manyToOne', 'oneToOneMorph'].forEach((type) => { test(`is single relation: ${type}`, () => { expect(isSingleRelation(type)).toBeTruthy(); }); 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 0e37acdd4f..5d45eb2abc 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 @@ -38,7 +38,7 @@ const TableRows = ({ return ( {rows.map((data, index) => { - const isChecked = entriesToDelete.findIndex(id => id === data.id) !== -1; + const isChecked = entriesToDelete.findIndex((id) => id === data.id) !== -1; const itemLineText = formatMessage( { id: 'content-manager.components.DynamicTable.row-line', @@ -51,7 +51,7 @@ const TableRows = ({ { + fn() { trackUsage('willEditEntryFromList'); push({ pathname: `${pathname}/${data.id}`, @@ -170,8 +170,8 @@ TableRows.defaultProps = { canCreate: false, canDelete: false, entriesToDelete: [], - onClickDelete: () => {}, - onSelectRow: () => {}, + onClickDelete() {}, + onSelectRow() {}, rows: [], withBulkActions: false, withMainAction: false, 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 7ca5563c80..37c60ac454 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 @@ -35,7 +35,7 @@ const DynamicTable = ({ layout, }); - const formattedHeaders = headers.displayedHeaders.map(header => { + const formattedHeaders = headers.displayedHeaders.map((header) => { if (header.fieldSchema.type === 'relation') { const sortFieldValue = `${header.name}.${header.metadatas.mainField.name}`; @@ -65,7 +65,7 @@ const DynamicTable = ({ searchable: false, sortable: true, }, - cellFormatter: cellData => { + cellFormatter(cellData) { const isPublished = !isEmpty(cellData.publishedAt); return ; diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/AddComponentButton/index.js b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/AddComponentButton/index.js index 0547ddbcf5..cd3cbf3800 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/AddComponentButton/index.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/AddComponentButton/index.js @@ -120,26 +120,24 @@ const AddComponentButton = ({ } return ( - <> - - - - - - - - - {buttonLabel} - - - - - - + + + + + + + + + {buttonLabel} + + + + + ); }; diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/Component/index.js b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/Component/index.js index 2cf23883c7..d76d3bdc54 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/Component/index.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/Component/index.js @@ -88,7 +88,7 @@ const Component = ({ const formErrorsKeys = Object.keys(formErrors); - const fieldsErrors = formErrorsKeys.filter(errorKey => { + const fieldsErrors = formErrorsKeys.filter((errorKey) => { const errorKeysArray = errorKey.split('.'); if (`${errorKeysArray[0]}.${errorKeysArray[1]}` === `${name}.${index}`) { diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/ComponentPicker/Category/ComponentCard/index.js b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/ComponentPicker/Category/ComponentCard/index.js index 820591beab..6f9ab169a2 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/ComponentPicker/Category/ComponentCard/index.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/ComponentPicker/Category/ComponentCard/index.js @@ -75,7 +75,7 @@ function ComponentCard({ componentUid, intlLabel, icon, onClick }) { ComponentCard.defaultProps = { icon: 'dice-d6', - onClick: () => {}, + onClick() {}, }; ComponentCard.propTypes = { diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/ComponentPicker/index.js b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/ComponentPicker/index.js index fb94816ac5..50d480cf6b 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/ComponentPicker/index.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicZone/components/ComponentPicker/index.js @@ -16,7 +16,7 @@ const ComponentPicker = ({ components, isOpen, onClickAddComponent }) => { const [categoryToOpen, setCategoryToOpen] = useState(''); const dynamicComponentCategories = useMemo(() => { - const componentsWithInfo = components.map(componentUid => { + const componentsWithInfo = components.map((componentUid) => { const { category, info } = getComponentLayout(componentUid); return { componentUid, category, info }; @@ -38,7 +38,7 @@ const ComponentPicker = ({ components, isOpen, onClickAddComponent }) => { }, [isOpen, dynamicComponentCategories]); const handleAddComponentToDz = useCallback( - componentUid => { + (componentUid) => { onClickAddComponent(componentUid); setCategoryToOpen(''); }, @@ -46,7 +46,7 @@ const ComponentPicker = ({ components, isOpen, onClickAddComponent }) => { ); const handleClickToggle = useCallback( - categoryName => { + (categoryName) => { const nextCategoryToOpen = categoryToOpen === categoryName ? '' : categoryName; setCategoryToOpen(nextCategoryToOpen); 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 ae8cfef989..879369ccdb 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 @@ -16,7 +16,7 @@ import ComponentPicker from './components/ComponentPicker'; /* eslint-disable react/no-array-index-key */ -const createCollapses = arrayLength => +const createCollapses = (arrayLength) => Array.from({ length: arrayLength }).map(() => ({ isOpen: false })); const DynamicZone = ({ @@ -53,7 +53,7 @@ const DynamicZone = ({ useEffect(() => { if (shouldOpenAddedComponent) { - setComponentsCollapses(prev => + setComponentsCollapses((prev) => prev.map((collapse, index) => { if (index === prev.length - 1) { return { ...collapse, isOpen: true }; @@ -71,10 +71,10 @@ const DynamicZone = ({ const { max = Infinity, min = -Infinity } = fieldSchema; const dynamicZoneErrors = useMemo(() => { return Object.keys(formErrors) - .filter(key => { + .filter((key) => { return key === name; }) - .map(key => formErrors[key]); + .map((key) => formErrors[key]); }, [formErrors, name]); const dynamicZoneAvailableComponents = useMemo(() => fieldSchema.components || [], [fieldSchema]); @@ -89,7 +89,7 @@ const DynamicZone = ({ hasError && get(dynamicZoneErrors, [0, 'id'], '') === 'components.Input.error.validation.max'; const handleAddComponent = useCallback( - componentUid => { + (componentUid) => { setIsOpen(false); addComponentToDynamicZone(name, componentUid, hasError); @@ -100,7 +100,7 @@ const DynamicZone = ({ const handleClickOpenPicker = () => { if (dynamicDisplayedComponentsLength < max) { - setIsOpen(prev => !prev); + setIsOpen((prev) => !prev); } else { toggleNotification({ type: 'info', @@ -109,8 +109,8 @@ const DynamicZone = ({ } }; - const handleToggleComponent = indexToToggle => { - setComponentsCollapses(prev => + const handleToggleComponent = (indexToToggle) => { + setComponentsCollapses((prev) => prev.map(({ isOpen }, index) => { if (index === indexToToggle) { return { isOpen: !isOpen }; @@ -123,7 +123,7 @@ const DynamicZone = ({ const handleMoveComponentDown = (name, currentIndex) => { moveComponentDown(name, currentIndex); - setComponentsCollapses(prev => { + setComponentsCollapses((prev) => { return prev.map(({ isOpen }, index, refArray) => { if (index === currentIndex + 1) { return { isOpen: refArray[currentIndex].isOpen }; @@ -140,7 +140,7 @@ const DynamicZone = ({ const handleMoveComponentUp = (name, currentIndex) => { moveComponentUp(name, currentIndex); - setComponentsCollapses(prev => { + setComponentsCollapses((prev) => { return prev.map(({ isOpen }, index, refArray) => { if (index === currentIndex - 1) { return { isOpen: refArray[currentIndex].isOpen }; diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicZone/utils/connect.js b/packages/core/admin/admin/src/content-manager/components/DynamicZone/utils/connect.js index 238d60ef82..eb1b2cd222 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicZone/utils/connect.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicZone/utils/connect.js @@ -1,7 +1,7 @@ import React from 'react'; function connect(WrappedComponent, select) { - return function(props) { + return (props) => { // eslint-disable-next-line react/prop-types const selectors = select(props.name); diff --git a/packages/core/admin/admin/src/content-manager/components/DynamicZone/utils/select.js b/packages/core/admin/admin/src/content-manager/components/DynamicZone/utils/select.js index aedcfd3e26..0b633ce9b1 100644 --- a/packages/core/admin/admin/src/content-manager/components/DynamicZone/utils/select.js +++ b/packages/core/admin/admin/src/content-manager/components/DynamicZone/utils/select.js @@ -17,7 +17,7 @@ function useSelect(name) { } = useCMEditViewDataManager(); const dynamicDisplayedComponents = useMemo( - () => get(modifiedData, [name], []).map(data => data.__component), + () => get(modifiedData, [name], []).map((data) => data.__component), [modifiedData, name] ); 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 0cb49908fd..4b6f683337 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 @@ -264,7 +264,7 @@ const EditViewDataManagerProvider = ({ ); const createFormData = useCallback( - data => { + (data) => { // First we need to remove the added keys needed for the dnd const preparedData = removeKeyInObject(cloneDeep(data), '__temp_key__'); // Then we need to apply our helper @@ -288,7 +288,7 @@ const EditViewDataManagerProvider = ({ }, [hasDraftAndPublish, shouldNotRunValidations]); const handleSubmit = useCallback( - async e => { + async (e) => { e.preventDefault(); let errors = {}; @@ -358,8 +358,8 @@ const EditViewDataManagerProvider = ({ }, [allLayoutData, currentContentTypeLayout, isCreatingEntry, modifiedData, onPublish]); const shouldCheckDZErrors = useCallback( - dzName => { - const doesDZHaveError = Object.keys(formErrors).some(key => key.split('.')[0] === dzName); + (dzName) => { + const doesDZHaveError = Object.keys(formErrors).some((key) => key.split('.')[0] === dzName); const shouldCheckErrors = !isEmpty(formErrors) && doesDZHaveError; return shouldCheckErrors; @@ -413,7 +413,7 @@ const EditViewDataManagerProvider = ({ }); }, []); - const onRemoveRelation = useCallback(keys => { + const onRemoveRelation = useCallback((keys) => { dispatch({ type: 'REMOVE_RELATION', keys, @@ -526,7 +526,7 @@ const EditViewDataManagerProvider = ({ EditViewDataManagerProvider.defaultProps = { from: '/', initialValues: null, - redirectToPreviousPage: () => {}, + redirectToPreviousPage() {}, }; EditViewDataManagerProvider.propTypes = { 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 04a2155db7..f93dd971e2 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 @@ -18,7 +18,7 @@ const initialState = { const reducer = (state, action) => // eslint-disable-next-line consistent-return - produce(state, draftState => { + produce(state, (draftState) => { switch (action.type) { case 'ADD_NON_REPEATABLE_COMPONENT_TO_FIELD': { set( 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 68e786ac21..269057ec1b 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 @@ -32,7 +32,7 @@ const cleanData = (retrievedData, currentSchema, componentsSchema) => { } case 'media': if (getOtherInfos(schema, [current, 'multiple']) === true) { - cleanedData = value ? value.filter(file => !(file instanceof File)) : null; + cleanedData = value ? value.filter((file) => !(file instanceof File)) : null; } else { cleanedData = get(value, 0) instanceof File ? null : get(value, 'id', null); } @@ -40,7 +40,7 @@ const cleanData = (retrievedData, currentSchema, componentsSchema) => { case 'component': if (isRepeatable) { cleanedData = value - ? value.map(data => { + ? value.map((data) => { const subCleanedData = recursiveCleanData(data, componentsSchema[component]); return subCleanedData; @@ -52,7 +52,7 @@ const cleanData = (retrievedData, currentSchema, componentsSchema) => { break; case 'dynamiczone': - cleanedData = value.map(componentData => { + cleanedData = value.map((componentData) => { const subCleanedData = recursiveCleanData( componentData, componentsSchema[componentData.__component] @@ -77,7 +77,7 @@ const cleanData = (retrievedData, currentSchema, componentsSchema) => { export const helperCleanData = (value, key) => { if (isArray(value)) { - return value.map(obj => (obj[key] ? obj[key] : obj)); + return value.map((obj) => (obj[key] ? obj[key] : obj)); } if (isObject(value)) { return value[key]; diff --git a/packages/core/admin/admin/src/content-manager/components/EditViewDataManagerProvider/utils/schema.js b/packages/core/admin/admin/src/content-manager/components/EditViewDataManagerProvider/utils/schema.js index 0d846a4c09..976c5f4b8d 100644 --- a/packages/core/admin/admin/src/content-manager/components/EditViewDataManagerProvider/utils/schema.js +++ b/packages/core/admin/admin/src/content-manager/components/EditViewDataManagerProvider/utils/schema.js @@ -9,12 +9,12 @@ import { translatedErrors as errorsTrads } from '@strapi/helper-plugin'; import isFieldTypeNumber from '../../../utils/isFieldTypeNumber'; -yup.addMethod(yup.mixed, 'defined', function() { - return this.test('defined', errorsTrads.required, value => value !== undefined); +yup.addMethod(yup.mixed, 'defined', function () { + return this.test('defined', errorsTrads.required, (value) => value !== undefined); }); -yup.addMethod(yup.array, 'notEmptyMin', function(min) { - return this.test('notEmptyMin', errorsTrads.min, value => { +yup.addMethod(yup.array, 'notEmptyMin', function (min) { + return this.test('notEmptyMin', errorsTrads.min, (value) => { if (isEmpty(value)) { return true; } @@ -23,8 +23,8 @@ yup.addMethod(yup.array, 'notEmptyMin', function(min) { }); }); -yup.addMethod(yup.string, 'isInferior', function(message, max) { - return this.test('isInferior', message, function(value) { +yup.addMethod(yup.string, 'isInferior', function (message, max) { + return this.test('isInferior', message, function (value) { if (!value) { return true; } @@ -37,8 +37,8 @@ yup.addMethod(yup.string, 'isInferior', function(message, max) { }); }); -yup.addMethod(yup.string, 'isSuperior', function(message, min) { - return this.test('isSuperior', message, function(value) { +yup.addMethod(yup.string, 'isSuperior', function (message, min) { + return this.test('isSuperior', message, function (value) { if (!value) { return true; } @@ -51,7 +51,7 @@ yup.addMethod(yup.string, 'isSuperior', function(message, min) { }); }); -const getAttributes = data => get(data, ['attributes'], {}); +const getAttributes = (data) => get(data, ['attributes'], {}); const createYupSchema = ( model, @@ -97,7 +97,7 @@ const createYupSchema = ( if (attribute.repeatable === true) { const { min, max, required } = attribute; - let componentSchema = yup.lazy(value => { + let componentSchema = yup.lazy((value) => { let baseSchema = yup.array().of(componentFieldSchema); if (min) { @@ -123,7 +123,7 @@ const createYupSchema = ( return acc; } - const componentSchema = yup.lazy(obj => { + const componentSchema = yup.lazy((obj) => { if (obj !== undefined) { return attribute.required === true && !options.isDraft ? componentFieldSchema.defined() @@ -154,7 +154,7 @@ const createYupSchema = ( if (min) { if (attribute.required) { dynamicZoneSchema = dynamicZoneSchema - .test('min', errorsTrads.min, value => { + .test('min', errorsTrads.min, (value) => { if (options.isCreatingEntry) { return value && value.length >= min; } @@ -165,7 +165,7 @@ const createYupSchema = ( return value !== null && value.length >= min; }) - .test('required', errorsTrads.required, value => { + .test('required', errorsTrads.required, (value) => { if (options.isCreatingEntry) { return value !== null || value !== undefined; } @@ -180,7 +180,7 @@ const createYupSchema = ( dynamicZoneSchema = dynamicZoneSchema.notEmptyMin(min); } } else if (attribute.required && !options.isDraft) { - dynamicZoneSchema = dynamicZoneSchema.test('required', errorsTrads.required, value => { + dynamicZoneSchema = dynamicZoneSchema.test('required', errorsTrads.required, (value) => { if (options.isCreatingEntry) { return value !== null || value !== undefined; } @@ -215,7 +215,7 @@ const createYupSchemaAttribute = (type, validations, options) => { if (type === 'json') { schema = yup .mixed(errorsTrads.json) - .test('isJSON', errorsTrads.json, value => { + .test('isJSON', errorsTrads.json, (value) => { if (value === undefined) { return true; } @@ -238,7 +238,7 @@ const createYupSchemaAttribute = (type, validations, options) => { if (['number', 'integer', 'float', 'decimal'].includes(type)) { schema = yup .number() - .transform(cv => (isNaN(cv) ? undefined : cv)) + .transform((cv) => (isNaN(cv) ? undefined : cv)) .typeError(); } @@ -250,7 +250,7 @@ const createYupSchemaAttribute = (type, validations, options) => { schema = yup.date(); } - Object.keys(validations).forEach(validation => { + Object.keys(validations).forEach((validation) => { const validationValue = validations[validation]; if ( @@ -269,7 +269,7 @@ const createYupSchemaAttribute = (type, validations, options) => { if (options.isCreatingEntry) { schema = schema.required(errorsTrads.required); } else { - schema = schema.test('required', errorsTrads.required, value => { + schema = schema.test('required', errorsTrads.required, (value) => { // Field is not touched and the user is editing the entry if (value === undefined && !options.isFromComponent) { return true; diff --git a/packages/core/admin/admin/src/content-manager/components/FieldComponent/utils/connect.js b/packages/core/admin/admin/src/content-manager/components/FieldComponent/utils/connect.js index 648a3d30e4..90f1ffd8e9 100644 --- a/packages/core/admin/admin/src/content-manager/components/FieldComponent/utils/connect.js +++ b/packages/core/admin/admin/src/content-manager/components/FieldComponent/utils/connect.js @@ -1,7 +1,7 @@ import React from 'react'; function connect(WrappedComponent, select) { - return function(props) { + return (props) => { // eslint-disable-next-line react/prop-types const selectors = select(props); 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 661180525d..284dc1a44d 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 @@ -22,7 +22,7 @@ function useSelect({ isFromDynamicZone, name }) { const allDynamicZoneFields = useMemo(() => { const attributes = get(contentType, ['attributes'], {}); - const dynamicZoneFields = Object.keys(attributes).filter(attrName => { + const dynamicZoneFields = Object.keys(attributes).filter((attrName) => { return get(attributes, [attrName, 'type'], '') === 'dynamiczone'; }); @@ -43,17 +43,17 @@ function useSelect({ isFromDynamicZone, name }) { return true; } - const includedDynamicZoneFields = allowedFields.filter(name => name === compoName[0]); + const includedDynamicZoneFields = allowedFields.filter((name) => name === compoName[0]); if (includedDynamicZoneFields.length > 0) { return true; } const relatedChildrenAllowedFields = allowedFields - .map(fieldName => { + .map((fieldName) => { return fieldName.split('.'); }) - .filter(fieldName => { + .filter((fieldName) => { if (fieldName.length < compoName.length) { return false; } @@ -78,10 +78,10 @@ function useSelect({ isFromDynamicZone, name }) { const allowedFields = isCreatingEntry ? [] : readActionAllowedFields; const relatedChildrenAllowedFields = allowedFields - .map(fieldName => { + .map((fieldName) => { return fieldName.split('.'); }) - .filter(fieldName => { + .filter((fieldName) => { if (fieldName.length < compoName.length) { return false; } diff --git a/packages/core/admin/admin/src/content-manager/components/FormTitle/index.js b/packages/core/admin/admin/src/content-manager/components/FormTitle/index.js index e6b8cfc06e..bf5c46f694 100644 --- a/packages/core/admin/admin/src/content-manager/components/FormTitle/index.js +++ b/packages/core/admin/admin/src/content-manager/components/FormTitle/index.js @@ -5,7 +5,7 @@ import { FormattedMessage } from 'react-intl'; const FormTitle = ({ description, title }) => ( <> {!!title && } - {!!description && {msg =>

{msg}

}
} + {!!description && {(msg) =>

{msg}

}
} ); 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 2b97bc695d..7738d2b140 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 @@ -13,7 +13,7 @@ const InjectionZoneList = ({ area, ...props }) => { // TODO return (
    - {compos.map(compo => { + {compos.map((compo) => { const component = compo.Component(props); if (component) { diff --git a/packages/core/admin/admin/src/content-manager/components/InputJSON/index.js b/packages/core/admin/admin/src/content-manager/components/InputJSON/index.js index bd604a1f32..182dc736a2 100644 --- a/packages/core/admin/admin/src/content-manager/components/InputJSON/index.js +++ b/packages/core/admin/admin/src/content-manager/components/InputJSON/index.js @@ -87,11 +87,10 @@ class InputJSON extends React.Component { setSize = () => this.codeMirror.setSize('100%', 'auto'); - getContentAtLine = line => this.codeMirror.getLine(line); + getContentAtLine = (line) => this.codeMirror.getLine(line); - getEditorOption = opt => this.codeMirror.getOption(opt); - - getValue = () => this.codeMirror.getValue(); + // getEditorOption = (opt) => this.codeMirror.getOption(opt); + // getValue = () => this.codeMirror.getValue(); markSelection = ({ message }) => { let line = parseInt(message.split(':')[0].split('line ')[1], 10) - 1; @@ -142,7 +141,7 @@ class InputJSON extends React.Component { this.timer = setTimeout(() => this.testJSON(doc.getValue()), WAIT); }; - testJSON = value => { + testJSON = (value) => { try { jsonlint.parse(value); } catch (err) { @@ -189,7 +188,7 @@ InputJSON.defaultProps = { error: undefined, intlLabel: undefined, labelAction: undefined, - onChange: () => {}, + onChange() {}, value: null, required: false, }; diff --git a/packages/core/admin/admin/src/content-manager/components/InputJSON/jsonlint.js b/packages/core/admin/admin/src/content-manager/components/InputJSON/jsonlint.js index fdf51fda7c..7bf146de32 100644 --- a/packages/core/admin/admin/src/content-manager/components/InputJSON/jsonlint.js +++ b/packages/core/admin/admin/src/content-manager/components/InputJSON/jsonlint.js @@ -1,6 +1,6 @@ /* Jison generated parser */ /* eslint-disable */ -var jsonlint = (function() { +var jsonlint = (function () { var parser = { trace: function trace() {}, yy: {}, @@ -453,7 +453,7 @@ var jsonlint = (function() { }, }; /* Jison generated lexer */ - var lexer = (function() { + var lexer = (function () { var lexer = { EOF: 1, parseError: function parseError(str, hash) { @@ -463,7 +463,7 @@ var jsonlint = (function() { throw new Error(str); } }, - setInput: function(input) { + setInput: function (input) { this._input = input; this._more = this._less = this.done = false; this.yylineno = this.yyleng = 0; @@ -472,7 +472,7 @@ var jsonlint = (function() { this.yylloc = { first_line: 1, first_column: 0, last_line: 1, last_column: 0 }; return this; }, - input: function() { + input: function () { var ch = this._input[0]; this.yytext += ch; this.yyleng++; @@ -483,34 +483,34 @@ var jsonlint = (function() { this._input = this._input.slice(1); return ch; }, - unput: function(ch) { + unput: function (ch) { this._input = ch + this._input; return this; }, - more: function() { + more: function () { this._more = true; return this; }, - less: function(n) { + less: function (n) { this._input = this.match.slice(n) + this._input; }, - pastInput: function() { + pastInput: function () { var past = this.matched.substr(0, this.matched.length - this.match.length); return (past.length > 20 ? '...' : '') + past.substr(-20).replace(/\n/g, ''); }, - upcomingInput: function() { + upcomingInput: function () { var next = this.match; if (next.length < 20) { next += this._input.substr(0, 20 - next.length); } return (next.substr(0, 20) + (next.length > 20 ? '...' : '')).replace(/\n/g, ''); }, - showPosition: function() { + showPosition: function () { var pre = this.pastInput(); var c = new Array(pre.length + 1).join('-'); return pre + this.upcomingInput() + '\n' + c + '^'; }, - next: function() { + next: function () { if (this.done) { return this.EOF; } @@ -587,7 +587,7 @@ var jsonlint = (function() { _currentRules: function _currentRules() { return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; }, - topState: function() { + topState: function () { return this.conditionStack[this.conditionStack.length - 2]; }, pushState: function begin(condition) { @@ -669,7 +669,7 @@ var jsonlint = (function() { })(); if (typeof require !== 'undefined' && typeof exports !== 'undefined') { exports.parser = jsonlint; - exports.parse = function() { + exports.parse = function () { return jsonlint.parse.apply(jsonlint, arguments); }; exports.main = function commonjsMain(args) { 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 40b1128f2b..ea443a1382 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 @@ -174,7 +174,7 @@ const InputUID = ({ setRegenerateLabel(null); }; - const handleChange = e => { + const handleChange = (e) => { if (e.target.value && isCreation) { setIsCustomized(true); } diff --git a/packages/core/admin/admin/src/content-manager/components/InputUID/regex.js b/packages/core/admin/admin/src/content-manager/components/InputUID/regex.js index 864377299f..22f3b0383a 100644 --- a/packages/core/admin/admin/src/content-manager/components/InputUID/regex.js +++ b/packages/core/admin/admin/src/content-manager/components/InputUID/regex.js @@ -1,3 +1,3 @@ -const UID_REGEX = new RegExp(/^[A-Za-z0-9-_.~]*$/); +const UID_REGEX = /^[A-Za-z0-9-_.~]*$/; export default UID_REGEX; 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 15a75e80fc..3f59cd56cf 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 @@ -157,10 +157,10 @@ function Inputs({ return disabled; }, [disabled, isCreatingEntry, isUserAllowedToEditField, isUserAllowedToReadField]); - const options = useMemo(() => generateOptions(fieldSchema.enum || [], isRequired), [ - fieldSchema, - isRequired, - ]); + const options = useMemo( + () => generateOptions(fieldSchema.enum || [], isRequired), + [fieldSchema, isRequired] + ); const { label, description, placeholder, visible } = metadatas; diff --git a/packages/core/admin/admin/src/content-manager/components/Inputs/utils/connect.js b/packages/core/admin/admin/src/content-manager/components/Inputs/utils/connect.js index 51685b4411..308cb5414b 100644 --- a/packages/core/admin/admin/src/content-manager/components/Inputs/utils/connect.js +++ b/packages/core/admin/admin/src/content-manager/components/Inputs/utils/connect.js @@ -1,7 +1,7 @@ import React from 'react'; function connect(WrappedComponent, select) { - return function(props) { + return (props) => { // eslint-disable-next-line react/prop-types const selectors = select(props.keys); diff --git a/packages/core/admin/admin/src/content-manager/components/Inputs/utils/generateOptions.js b/packages/core/admin/admin/src/content-manager/components/Inputs/utils/generateOptions.js index 3ba48d8f65..c6058a333e 100644 --- a/packages/core/admin/admin/src/content-manager/components/Inputs/utils/generateOptions.js +++ b/packages/core/admin/admin/src/content-manager/components/Inputs/utils/generateOptions.js @@ -12,7 +12,7 @@ const generateOptions = (options, isRequired = false) => { key: '__enum_option_null', value: '', }, - ...options.map(option => { + ...options.map((option) => { return { metadatas: { intlLabel: { diff --git a/packages/core/admin/admin/src/content-manager/components/Inputs/utils/getStep.js b/packages/core/admin/admin/src/content-manager/components/Inputs/utils/getStep.js index 900f25b483..7c6653aee0 100644 --- a/packages/core/admin/admin/src/content-manager/components/Inputs/utils/getStep.js +++ b/packages/core/admin/admin/src/content-manager/components/Inputs/utils/getStep.js @@ -1,4 +1,4 @@ -const getStep = type => { +const getStep = (type) => { let step; if (type === 'float' || type === 'decimal') { diff --git a/packages/core/admin/admin/src/content-manager/components/LayoutDndProvider/index.js b/packages/core/admin/admin/src/content-manager/components/LayoutDndProvider/index.js index 9c80e9af3e..bb50f2b79f 100644 --- a/packages/core/admin/admin/src/content-manager/components/LayoutDndProvider/index.js +++ b/packages/core/admin/admin/src/content-manager/components/LayoutDndProvider/index.js @@ -44,16 +44,16 @@ function LayoutDndProvider({ LayoutDndProvider.defaultProps = { attributes: {}, buttonData: [], - goTo: () => {}, + goTo() {}, layout: [], metadatas: {}, - moveItem: () => {}, - moveRow: () => {}, - onAddData: () => {}, + moveItem() {}, + moveRow() {}, + onAddData() {}, relationsLayout: [], - removeField: () => {}, + removeField() {}, selectedItemName: null, - setEditFieldToSelect: () => {}, + setEditFieldToSelect() {}, }; LayoutDndProvider.propTypes = { 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 9137cc610a..f85cc13e72 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 @@ -12,10 +12,10 @@ import Inputs from '../Inputs'; const NonRepeatableComponent = ({ componentUid, isFromDynamicZone, isNested, name }) => { const { getComponentLayout } = useContentTypeLayout(); - const componentLayoutData = useMemo(() => getComponentLayout(componentUid), [ - componentUid, - getComponentLayout, - ]); + const componentLayoutData = useMemo( + () => getComponentLayout(componentUid), + [componentUid, getComponentLayout] + ); const fields = componentLayoutData.layouts.edit; return ( 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 002fe85bad..b8c2cf212b 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 @@ -25,7 +25,7 @@ const md = new Markdown({ linkify: true, typographer: true, // Code from: https://github.com/markdown-it/markdown-it/blob/master/support/demo_template/index.js#L83 - highlight: (str, lang) => { + highlight(str, lang) { if (lang && lang !== 'auto' && getLanguage(lang)) { return ( '
     e.stopPropagation()}
    +                      onClick={(e) => e.stopPropagation()}
                         >
                           
                         
    @@ -294,8 +288,8 @@ const DraggedItem = ({
     DraggedItem.defaultProps = {
       isDraggingSibling: false,
       isOpen: false,
    -  setIsDraggingSibling: () => {},
    -  toggleCollapses: () => {},
    +  setIsDraggingSibling() {},
    +  toggleCollapses() {},
     };
     
     DraggedItem.propTypes = {
    diff --git a/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/DraggedItem/utils/connect.js b/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/DraggedItem/utils/connect.js
    index 563d58b445..f763338c32 100644
    --- a/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/DraggedItem/utils/connect.js
    +++ b/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/DraggedItem/utils/connect.js
    @@ -1,7 +1,7 @@
     import React from 'react';
     
     function connect(WrappedComponent, select) {
    -  return function(props) {
    +  return (props) => {
         const selectors = select(props);
     
         return ;
    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 b6d31cff45..2b7c6931ab 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
    @@ -49,10 +49,10 @@ const RepeatableComponent = ({
       const [isDraggingSibling, setIsDraggingSibling] = useState(false);
       const [, drop] = useDrop({ accept: ItemTypes.COMPONENT });
       const { getComponentLayout } = useContentTypeLayout();
    -  const componentLayoutData = useMemo(() => getComponentLayout(componentUid), [
    -    componentUid,
    -    getComponentLayout,
    -  ]);
    +  const componentLayoutData = useMemo(
    +    () => getComponentLayout(componentUid),
    +    [componentUid, getComponentLayout]
    +  );
     
       const nextTempKey = useMemo(() => {
         return getMaxTempKey(componentValue || []) + 1;
    @@ -113,7 +113,7 @@ const RepeatableComponent = ({
       }
     
       const doesRepComponentHasChildError = componentErrorKeys.some(
    -    error => error.split('.').length > 1
    +    (error) => error.split('.').length > 1
       );
     
       if (doesRepComponentHasChildError && !hasMinError) {
    diff --git a/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/utils/connect.js b/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/utils/connect.js
    index 563d58b445..f763338c32 100644
    --- a/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/utils/connect.js
    +++ b/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/utils/connect.js
    @@ -1,7 +1,7 @@
     import React from 'react';
     
     function connect(WrappedComponent, select) {
    -  return function(props) {
    +  return (props) => {
         const selectors = select(props);
     
         return ;
    diff --git a/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/utils/getComponentErrorKeys.js b/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/utils/getComponentErrorKeys.js
    index d12c3e8eb3..59081b74b9 100644
    --- a/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/utils/getComponentErrorKeys.js
    +++ b/packages/core/admin/admin/src/content-manager/components/RepeatableComponent/utils/getComponentErrorKeys.js
    @@ -1,7 +1,7 @@
     export default function getComponentErrorKeys(name, formErrors) {
       return Object.keys(formErrors)
    -    .filter(errorKey => errorKey.startsWith(name))
    -    .map(errorKey =>
    +    .filter((errorKey) => errorKey.startsWith(name))
    +    .map((errorKey) =>
           errorKey
             .split('.')
             .slice(0, name.split('.').length + 1)
    diff --git a/packages/core/admin/admin/src/content-manager/components/SectionTitle/index.js b/packages/core/admin/admin/src/content-manager/components/SectionTitle/index.js
    index c8c870dd2f..7eed2469e2 100644
    --- a/packages/core/admin/admin/src/content-manager/components/SectionTitle/index.js
    +++ b/packages/core/admin/admin/src/content-manager/components/SectionTitle/index.js
    @@ -10,7 +10,7 @@ const SectionTitle = ({ isSettings }) => {
     
       return (
         
    - {msg => {msg}} + {(msg) => {msg}}
    ); }; diff --git a/packages/core/admin/admin/src/content-manager/components/SelectMany/ListItem.js b/packages/core/admin/admin/src/content-manager/components/SelectMany/ListItem.js index 5a25b242d0..2eb9ab9a83 100644 --- a/packages/core/admin/admin/src/content-manager/components/SelectMany/ListItem.js +++ b/packages/core/admin/admin/src/content-manager/components/SelectMany/ListItem.js @@ -79,7 +79,7 @@ function ListItem({ } ListItem.defaultProps = { - onRemove: () => {}, + onRemove() {}, searchToPersist: null, targetModel: '', }; diff --git a/packages/core/admin/admin/src/content-manager/components/SelectMany/index.js b/packages/core/admin/admin/src/content-manager/components/SelectMany/index.js index 9dea24cc85..7d8459a89f 100644 --- a/packages/core/admin/admin/src/content-manager/components/SelectMany/index.js +++ b/packages/core/admin/admin/src/content-manager/components/SelectMany/index.js @@ -46,7 +46,7 @@ function SelectMany({ id={name} filterOption={(candidate, input) => { if (!isEmpty(value)) { - const isSelected = value.findIndex(item => item.id === candidate.value.id) !== -1; + const isSelected = value.findIndex((item) => item.id === candidate.value.id) !== -1; if (isSelected) { return false; diff --git a/packages/core/admin/admin/src/content-manager/components/SelectOne/SingleValue.js b/packages/core/admin/admin/src/content-manager/components/SelectOne/SingleValue.js index 50e0c51f8f..6427a13328 100644 --- a/packages/core/admin/admin/src/content-manager/components/SelectOne/SingleValue.js +++ b/packages/core/admin/admin/src/content-manager/components/SelectOne/SingleValue.js @@ -22,7 +22,7 @@ const StyledBullet = styled.div` cursor: pointer; `; -const SingleValue = props => { +const SingleValue = (props) => { const { formatMessage } = useIntl(); const Component = components.SingleValue; const hasDraftAndPublish = has(get(props, 'data.value'), 'publishedAt'); diff --git a/packages/core/admin/admin/src/content-manager/components/SelectWrapper/Option.js b/packages/core/admin/admin/src/content-manager/components/SelectWrapper/Option.js index ea175ed839..23ddd224f7 100644 --- a/packages/core/admin/admin/src/content-manager/components/SelectWrapper/Option.js +++ b/packages/core/admin/admin/src/content-manager/components/SelectWrapper/Option.js @@ -20,7 +20,7 @@ const StyledBullet = styled.div` cursor: pointer; `; -const Option = props => { +const Option = (props) => { const { formatMessage } = useIntl(); const Component = components.Option; const hasDraftAndPublish = has(get(props, 'data.value'), 'publishedAt'); diff --git a/packages/core/admin/admin/src/content-manager/components/SelectWrapper/index.js b/packages/core/admin/admin/src/content-manager/components/SelectWrapper/index.js index 1c1870212d..ef5810095b 100644 --- a/packages/core/admin/admin/src/content-manager/components/SelectWrapper/index.js +++ b/packages/core/admin/admin/src/content-manager/components/SelectWrapper/index.js @@ -64,13 +64,8 @@ function SelectWrapper({ const [{ query }] = useQueryParams(); // Disable the input in case of a polymorphic relation const isMorph = useMemo(() => relationType.toLowerCase().includes('morph'), [relationType]); - const { - addRelation, - modifiedData, - moveRelation, - onChange, - onRemoveRelation, - } = useCMEditViewDataManager(); + const { addRelation, modifiedData, moveRelation, onChange, onRemoveRelation } = + useCMEditViewDataManager(); const { pathname } = useLocation(); const value = get(modifiedData, name, null); @@ -80,11 +75,11 @@ function SelectWrapper({ const [isOpen, setIsOpen] = useState(false); const filteredOptions = useMemo(() => { - return options.filter(option => { + return options.filter((option) => { if (!isEmpty(value)) { // SelectMany if (Array.isArray(value)) { - return findIndex(value, o => o.id === option.value.id) === -1; + return findIndex(value, (o) => o.id === option.value.id) === -1; } // SelectOne @@ -95,13 +90,8 @@ function SelectWrapper({ }); }, [options, value]); - const { - endPoint, - containsKey, - defaultParams, - shouldDisplayRelationLink, - paramsToKeep, - } = queryInfos; + const { endPoint, containsKey, defaultParams, shouldDisplayRelationLink, paramsToKeep } = + queryInfos; const isSingle = ['oneWay', 'oneToOne', 'manyToOne', 'oneToManyMorph', 'oneToOneMorph'].includes( relationType @@ -116,11 +106,11 @@ function SelectWrapper({ return [value.id]; } - return value.map(val => val.id); + return value.map((val) => val.id); }, [isSingle, value]); const getData = useCallback( - async source => { + async (source) => { // Currently polymorphic relations are not handled if (isMorph) { setIsLoading(false); @@ -149,19 +139,19 @@ function SelectWrapper({ { params, cancelToken: source.token } ); - const formattedData = data.map(obj => { + const formattedData = data.map((obj) => { return { value: obj, label: obj[mainField.name] }; }); - setOptions(prevState => + setOptions((prevState) => prevState.concat(formattedData).filter((obj, index) => { - const objIndex = prevState.findIndex(el => el.value.id === obj.value.id); + const objIndex = prevState.findIndex((el) => el.value.id === obj.value.id); if (objIndex === -1) { return true; } - return prevState.findIndex(el => el.value.id === obj.value.id) === index; + return prevState.findIndex((el) => el.value.id === obj.value.id) === index; }) ); setIsLoading(false); @@ -197,7 +187,7 @@ function SelectWrapper({ const handleInputChange = (inputValue, { action }) => { if (action === 'input-change') { - setState(prevState => { + setState((prevState) => { if (prevState.contains === inputValue) { return prevState; } @@ -210,7 +200,7 @@ function SelectWrapper({ }; const handleMenuScrollToBottom = () => { - setState(prevState => ({ + setState((prevState) => ({ ...prevState, start: prevState.start + 20, })); @@ -221,11 +211,11 @@ function SelectWrapper({ setIsOpen(false); }; - const handleChange = value => { + const handleChange = (value) => { onChange({ target: { name, value: value ? value.value : value } }); }; - const handleAddRelation = value => { + const handleAddRelation = (value) => { if (!isEmpty(value)) { addRelation({ target: { name, value } }); } diff --git a/packages/core/admin/admin/src/content-manager/components/SelectWrapper/utils/connect.js b/packages/core/admin/admin/src/content-manager/components/SelectWrapper/utils/connect.js index 648a3d30e4..90f1ffd8e9 100644 --- a/packages/core/admin/admin/src/content-manager/components/SelectWrapper/utils/connect.js +++ b/packages/core/admin/admin/src/content-manager/components/SelectWrapper/utils/connect.js @@ -1,7 +1,7 @@ import React from 'react'; function connect(WrappedComponent, select) { - return function(props) { + return (props) => { // eslint-disable-next-line react/prop-types const selectors = select(props); 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 72dadec8f3..63cf0dee7e 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 @@ -38,16 +38,11 @@ const SingleTypeFormWrapper = ({ allLayoutData, children, slug }) => { const toggleNotification = useNotification(); const dispatch = useDispatch(); - const { - componentsDataStructure, - contentTypeDataStructure, - data, - isLoading, - status, - } = useSelector(selectCrudReducer); + const { componentsDataStructure, contentTypeDataStructure, data, isLoading, status } = + useSelector(selectCrudReducer); const cleanReceivedData = useCallback( - data => { + (data) => { const cleaned = removePasswordFieldsFromData( data, allLayoutData.contentType, @@ -100,7 +95,7 @@ const SingleTypeFormWrapper = ({ allLayoutData, children, slug }) => { const CancelToken = axios.CancelToken; const source = CancelToken.source(); - const fetchData = async source => { + const fetchData = async (source) => { dispatch(getData()); setIsCreatingEntry(true); @@ -142,7 +137,7 @@ const SingleTypeFormWrapper = ({ allLayoutData, children, slug }) => { }, [cleanReceivedData, push, slug, dispatch, searchToSend, rawQuery, toggleNotification]); const displayErrors = useCallback( - err => { + (err) => { const errorPayload = err.response.data; let errorMessage = get(errorPayload, ['error', 'message'], 'Bad Request'); @@ -159,7 +154,7 @@ const SingleTypeFormWrapper = ({ allLayoutData, children, slug }) => { ); const onDelete = useCallback( - async trackerProperty => { + async (trackerProperty) => { try { trackUsageRef.current('willDeleteEntry', trackerProperty); diff --git a/packages/core/admin/admin/src/content-manager/components/SingleTypeFormWrapper/utils/getRequestUrl.js b/packages/core/admin/admin/src/content-manager/components/SingleTypeFormWrapper/utils/getRequestUrl.js index 4b108c472b..8ad02f911d 100644 --- a/packages/core/admin/admin/src/content-manager/components/SingleTypeFormWrapper/utils/getRequestUrl.js +++ b/packages/core/admin/admin/src/content-manager/components/SingleTypeFormWrapper/utils/getRequestUrl.js @@ -1,5 +1,5 @@ import { getRequestUrl } from '../../../utils'; -const requestURL = path => getRequestUrl(`single-types/${path}`); +const requestURL = (path) => getRequestUrl(`single-types/${path}`); export default requestURL; 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 c82a7d8649..cd52003914 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 @@ -37,7 +37,7 @@ const Editor = ({ }); CodeMirror.commands.newlineAndIndentContinueMarkdownList = newlineAndIndentContinueMarkdownList; - editorRef.current.on('change', doc => { + editorRef.current.on('change', (doc) => { onChangeRef.current({ target: { name, value: doc.getValue(), type: 'wysiwyg' } }); }); }, [editorRef, textareaRef, name, placeholder]); 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 bd3e262e78..8e4b0e5c69 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 @@ -78,7 +78,7 @@ export const EditorLayout = ({ children, isExpandMode, error, previewContent, on overflow="hidden" width="70%" height="70%" - onClick={e => e.stopPropagation()} + onClick={(e) => e.stopPropagation()} > 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 92509c7f79..480ae839bc 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 @@ -28,7 +28,7 @@ const WysiwygFooter = ({ onToggleExpand }) => { }; WysiwygFooter.defaultProps = { - onToggleExpand: () => {}, + onToggleExpand() {}, }; WysiwygFooter.propTypes = { 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 9cb75b0fc7..192abab576 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 @@ -45,7 +45,7 @@ const WysiwygNav = ({ const buttonMoreRef = useRef(); const handleTogglePopover = () => { - setVisiblePopover(prev => !prev); + setVisiblePopover((prev) => !prev); }; if (disabled || isPreviewMode) { @@ -110,7 +110,7 @@ const WysiwygNav = ({ id="selectTitle" placeholder={selectPlaceholder} size="S" - onChange={value => onActionClick(value, editorRef)} + onChange={(value) => onActionClick(value, editorRef)} > @@ -233,8 +233,8 @@ const WysiwygNav = ({ WysiwygNav.defaultProps = { isPreviewMode: false, - onActionClick: () => {}, - onToggleMediaLib: () => {}, + onActionClick() {}, + onToggleMediaLib() {}, onTogglePreviewMode: undefined, }; 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 185b99df04..d8fdbe8e3c 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 @@ -52,11 +52,11 @@ const Wysiwyg = ({ const MediaLibraryDialog = components['media-library']; - const handleToggleMediaLib = () => setMediaLibVisible(prev => !prev); - const handleTogglePreviewMode = () => setIsPreviewMode(prev => !prev); + const handleToggleMediaLib = () => setMediaLibVisible((prev) => !prev); + const handleTogglePreviewMode = () => setIsPreviewMode((prev) => !prev); const handleToggleExpand = () => { setIsPreviewMode(false); - setIsExpandMode(prev => !prev); + setIsExpandMode((prev) => !prev); }; const handleActionClick = (value, currentEditorRef, togglePopover) => { @@ -100,8 +100,8 @@ const Wysiwyg = ({ } }; - const handleSelectAssets = files => { - const formattedFiles = files.map(f => ({ + const handleSelectAssets = (files) => { + const formattedFiles = files.map((f) => ({ alt: f.alternativeText || f.name, url: prefixFileUrlWithBackendUrl(f.url), mime: f.mime, 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 1b30d01df4..3ae8fe6bcc 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 @@ -29,7 +29,7 @@ describe('Wysiwyg render and actions buttons', () => { let returnedValue; beforeEach(() => { - const onChange = jest.fn(e => { + const onChange = jest.fn((e) => { returnedValue = e.target.value; }); @@ -1402,9 +1402,9 @@ describe('Wysiwyg render and actions buttons', () => { fireEvent.click(renderedContainer.querySelector('#Underline')); const hasUnderlineMarkdown = getContainerByText((content, node) => { - const hasText = node => node.textContent === 'Underline'; + const hasText = (node) => node.textContent === 'Underline'; const nodeHasText = hasText(node); - const childrenDontHaveText = Array.from(node.children).every(child => !hasText(child)); + const childrenDontHaveText = Array.from(node.children).every((child) => !hasText(child)); return nodeHasText && childrenDontHaveText; }); @@ -1560,9 +1560,9 @@ Code fireEvent.click(renderedContainer.querySelector('#Underline')); const hasUnderlineMarkdown = containerQueryByText((content, node) => { - const hasText = node => node.textContent === 'Underline'; + const hasText = (node) => node.textContent === 'Underline'; const nodeHasText = hasText(node); - const childrenDontHaveText = Array.from(node.children).every(child => !hasText(child)); + const childrenDontHaveText = Array.from(node.children).every((child) => !hasText(child)); return nodeHasText && childrenDontHaveText; }); @@ -1646,7 +1646,7 @@ describe('Wysiwyg render actions with initial value', () => { let returnedValue = 'hello world'; beforeEach(() => { - const onChange = jest.fn(e => { + const onChange = jest.fn((e) => { returnedValue += e.target.value; }); diff --git a/packages/core/admin/admin/src/content-manager/components/Wysiwyg/utils/utils.js b/packages/core/admin/admin/src/content-manager/components/Wysiwyg/utils/utils.js index 1c6410a7cf..8540505899 100644 --- a/packages/core/admin/admin/src/content-manager/components/Wysiwyg/utils/utils.js +++ b/packages/core/admin/admin/src/content-manager/components/Wysiwyg/utils/utils.js @@ -30,7 +30,7 @@ export const replaceText = (markdownName, textToChange) => { return editedText; }; -export const insertText = markdownName => { +export const insertText = (markdownName) => { let editedText; // object to calculate text that will be selected after insert of markdown let selection = { start: markdownName.length, end: 0 }; @@ -75,7 +75,7 @@ export const insertText = markdownName => { return { editedText, selection }; }; -export const insertListOrTitle = markdown => { +export const insertListOrTitle = (markdown) => { let textToInsert; switch (markdown) { @@ -140,8 +140,8 @@ export const listHandler = (editor, listType) => { const selections = doc.listSelections(); let remove = null; - editor.current.operation(function() { - selections.forEach(function(selection) { + editor.current.operation(function () { + selections.forEach(function (selection) { const pos = [selection.head.line, selection.anchor.line].sort(); // Remove if the first text starts with it 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 39b705960d..ea15a1211b 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 @@ -7,7 +7,7 @@ const useContentTypeLayout = () => { const currentLayout = useSelector(selectLayout); const getComponentLayout = useCallback( - componentUid => { + (componentUid) => { return get(currentLayout, ['components', componentUid], {}); }, [currentLayout] 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 e1128e3740..f479b4b3c0 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 @@ -7,10 +7,10 @@ import reducer, { initialState } from './reducer'; import { makeSelectModelAndComponentSchemas } from '../../pages/App/selectors'; import { getRequestUrl } from '../../utils'; -const useFetchContentTypeLayout = contentTypeUID => { +const useFetchContentTypeLayout = (contentTypeUID) => { const [{ error, isLoading, layout, layouts }, dispatch] = useReducer(reducer, initialState); const schemasSelector = useMemo(makeSelectModelAndComponentSchemas, []); - const { schemas } = useSelector(state => schemasSelector(state), shallowEqual); + const { schemas } = useSelector((state) => schemasSelector(state), shallowEqual); const isMounted = useRef(true); const getData = useCallback( @@ -68,7 +68,7 @@ const useFetchContentTypeLayout = contentTypeUID => { }, [contentTypeUID, getData]); const updateLayout = useCallback( - data => { + (data) => { dispatch({ type: 'UPDATE_LAYOUT', newLayout: formatLayouts(data, schemas), diff --git a/packages/core/admin/admin/src/content-manager/hooks/useFetchContentTypeLayout/reducer.js b/packages/core/admin/admin/src/content-manager/hooks/useFetchContentTypeLayout/reducer.js index 145f36eb02..fd496b281b 100644 --- a/packages/core/admin/admin/src/content-manager/hooks/useFetchContentTypeLayout/reducer.js +++ b/packages/core/admin/admin/src/content-manager/hooks/useFetchContentTypeLayout/reducer.js @@ -9,7 +9,7 @@ export const initialState = { }; const reducer = (state, action) => - produce(state, draftState => { + produce(state, (draftState) => { switch (action.type) { case 'GET_DATA': { draftState.isLoading = true; 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 4f520d199b..ce10c20009 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 @@ -23,7 +23,7 @@ describe('CONTENT MANAGER | hooks | useFetchContentTypeLayout | reducer', () => const action = { type: 'GET_DATA' }; - const expected = produce(state, draft => { + const expected = produce(state, (draft) => { draft.isLoading = true; draft.error = null; }); @@ -37,7 +37,7 @@ describe('CONTENT MANAGER | hooks | useFetchContentTypeLayout | reducer', () => data: { contentType: { uid: 'test' } }, }; - const expected = produce(state, draft => { + const expected = produce(state, (draft) => { draft.isLoading = false; draft.layout = { contentType: { uid: 'test' } }; draft.layouts = { test: { contentType: { uid: 'test' } } }; @@ -52,7 +52,7 @@ describe('CONTENT MANAGER | hooks | useFetchContentTypeLayout | reducer', () => error: true, }; - const expected = produce(state, draft => { + const expected = produce(state, (draft) => { draft.isLoading = false; draft.error = true; }); 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 6ae3d0e015..cec42ece63 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 @@ -1,7 +1,7 @@ import { cloneDeep, get, set } from 'lodash'; import { getRequestUrl, mergeMetasWithSchema } from '../../../utils'; -const getRelationModel = (targetModel, models) => models.find(model => model.uid === targetModel); +const getRelationModel = (targetModel, models) => models.find((model) => model.uid === targetModel); // editRelations is an array of strings... const formatEditRelationsLayoutWithMetas = (contentTypeConfiguration, models) => { @@ -46,7 +46,7 @@ const formatLayouts = (initialData, models) => { set(data, ['contentType', 'layouts', 'editRelations'], formattedEditRelationsLayout); set(data, ['contentType', 'layouts', 'list'], formattedListLayout); - Object.keys(data.components).forEach(compoUID => { + Object.keys(data.components).forEach((compoUID) => { const formattedCompoEditLayout = formatLayoutWithMetas( data.components[compoUID], ctUid, @@ -63,7 +63,7 @@ const createMetasSchema = (initialData, models) => { const data = mergeMetasWithSchema(cloneDeep(initialData), models, 'contentType'); const { components, contentType } = data; - const formatMetadatas = targetSchema => { + const formatMetadatas = (targetSchema) => { return Object.keys(targetSchema.metadatas).reduce((acc, current) => { const schema = get(targetSchema, ['attributes', current], {}); let metadatas = targetSchema.metadatas[current]; @@ -96,7 +96,7 @@ const createMetasSchema = (initialData, models) => { set(data, ['contentType', 'metadatas'], formatMetadatas(contentType)); - Object.keys(components).forEach(compoUID => { + Object.keys(components).forEach((compoUID) => { const currentCompo = components[compoUID]; const updatedMetas = formatMetadatas(currentCompo); @@ -108,7 +108,7 @@ const createMetasSchema = (initialData, models) => { const formatLayoutWithMetas = (contentTypeConfiguration, ctUid, models) => { const formatted = contentTypeConfiguration.layouts.edit.reduce((acc, current) => { - const row = current.map(attribute => { + const row = current.map((attribute) => { const fieldSchema = get(contentTypeConfiguration, ['attributes', attribute.name], {}); const data = { @@ -241,8 +241,8 @@ const generateRelationQueryInfosForComponents = ( return queryInfos; }; -const getDisplayedModels = models => - models.filter(model => model.isDisplayed).map(({ uid }) => uid); +const getDisplayedModels = (models) => + models.filter((model) => model.isDisplayed).map(({ uid }) => uid); export default formatLayouts; export { 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 7d0a316be5..124fa0a7a1 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 @@ -3,7 +3,7 @@ import { useQueryParams } from '@strapi/helper-plugin'; import selectMenuLinks from './selectors'; import getRedirectionLink from './utils/getRedirectionLink'; -const useFindRedirectionLink = slug => { +const useFindRedirectionLink = (slug) => { const [{ rawQuery }] = useQueryParams(); const collectionTypesMenuLinks = useSelector(selectMenuLinks); const redirectionLink = getRedirectionLink(collectionTypesMenuLinks, slug, rawQuery); diff --git a/packages/core/admin/admin/src/content-manager/hooks/useFindRedirectionLink/selectors.js b/packages/core/admin/admin/src/content-manager/hooks/useFindRedirectionLink/selectors.js index e9b9f09414..881cadb774 100644 --- a/packages/core/admin/admin/src/content-manager/hooks/useFindRedirectionLink/selectors.js +++ b/packages/core/admin/admin/src/content-manager/hooks/useFindRedirectionLink/selectors.js @@ -1,4 +1,4 @@ -const selectMenuLinks = state => { +const selectMenuLinks = (state) => { const cmState = state['content-manager_app']; return cmState.collectionTypeLinks; 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 7a95e0f7b0..05a12c4c5b 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,5 +1,5 @@ +import { fixtures } from '@strapi/admin-test-utils/lib'; import selectMenuLinks from '../selectors'; -import { fixtures } from '../../../../../../../../admin-test-utils'; describe('CONTENT MANAGER | Containers | CollectionTypeFormWrapper | selectors', () => { let store; 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 307ead6cca..42a3cad550 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 @@ -12,7 +12,7 @@ export const initialState = { const rbacManagerReducer = (state = initialState, action) => // eslint-disable-next-line consistent-return - produce(state, draftState => { + produce(state, (draftState) => { switch (action.type) { case SET_PERMISSIONS: { draftState.permissions = Object.entries(action.permissions).reduce((acc, current) => { diff --git a/packages/core/admin/admin/src/content-manager/hooks/useSyncRbac/selectors.js b/packages/core/admin/admin/src/content-manager/hooks/useSyncRbac/selectors.js index ce8505f9f4..ffbd4ee762 100644 --- a/packages/core/admin/admin/src/content-manager/hooks/useSyncRbac/selectors.js +++ b/packages/core/admin/admin/src/content-manager/hooks/useSyncRbac/selectors.js @@ -1,4 +1,4 @@ -export const selectPermissions = state => state['content-manager_rbacManager'].permissions; +export const selectPermissions = (state) => state['content-manager_rbacManager'].permissions; -export const selectCollectionTypePermissions = state => +export const selectCollectionTypePermissions = (state) => state.rbacProvider.collectionTypesRelatedPermissions; 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 416c47c031..3288bcafd1 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,4 +1,4 @@ -import { fixtures } from '../../../../../../../../admin-test-utils/lib'; +import { fixtures } from '@strapi/admin-test-utils/lib'; import { selectPermissions, selectCollectionTypePermissions } from '../selectors'; describe('Admin | content manager | hooks | useSyncRbac | selectors', () => { 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 851b75fc57..b7e0ddcd2c 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 @@ -22,19 +22,19 @@ import getTrad from '../../../utils/getTrad'; import { makeSelectModelLinks } from '../selectors'; const matchByTitle = (links, search) => - matchSorter(links, toLower(search), { keys: [item => toLower(item.title)] }); + matchSorter(links, toLower(search), { keys: [(item) => toLower(item.title)] }); const LeftMenu = () => { const [search, setSearch] = useState(''); const { formatMessage } = useIntl(); const modelLinksSelector = useMemo(makeSelectModelLinks, []); const { collectionTypeLinks, singleTypeLinks } = useSelector( - state => modelLinksSelector(state), + (state) => modelLinksSelector(state), shallowEqual ); - const toIntl = links => - links.map(link => { + const toIntl = (links) => + links.map((link) => { return { ...link, title: formatMessage({ id: link.title, defaultMessage: link.title }), @@ -52,7 +52,7 @@ const LeftMenu = () => { defaultMessage: 'Collection Types', }, searchable: true, - links: sortBy(matchByTitle(intlCollectionTypeLinks, search), object => + links: sortBy(matchByTitle(intlCollectionTypeLinks, search), (object) => object.title.toLowerCase() ), }, @@ -63,7 +63,7 @@ const LeftMenu = () => { defaultMessage: 'Single Types', }, searchable: true, - links: sortBy(matchByTitle(intlSingleTypeLinks, search), object => + links: sortBy(matchByTitle(intlSingleTypeLinks, search), (object) => object.title.toLowerCase() ), }, @@ -96,7 +96,7 @@ const LeftMenu = () => { })} /> - {menu.map(section => { + {menu.map((section) => { const label = formatMessage( { id: section.title.id, defaultMessage: section.title.defaultMessage }, section.title.values @@ -108,7 +108,7 @@ const LeftMenu = () => { label={label} badgeLabel={section.links.length.toString()} > - {section.links.map(link => { + {section.links.map((link) => { const search = link.search ? `?${link.search}` : ''; return ( 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 0868edded1..9621b9d270 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 @@ -28,7 +28,7 @@ const cmPermissions = permissions.contentManager; const App = () => { const contentTypeMatch = useRouteMatch(`/content-manager/:kind/:uid`); const { status, collectionTypeLinks, singleTypeLinks, models, refetchData } = useModels(); - const authorisedModels = sortBy([...collectionTypeLinks, ...singleTypeLinks], model => + const authorisedModels = sortBy([...collectionTypeLinks, ...singleTypeLinks], (model) => model.title.toLowerCase() ); const { pathname } = useLocation(); @@ -114,7 +114,7 @@ const App = () => { export { App }; -export default () => { +export default function () { const { formatMessage } = useIntl(); return ( @@ -125,4 +125,4 @@ export default () => { ); -}; +} 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 3551a3f0bb..f50aff92c3 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 @@ -15,7 +15,7 @@ const initialState = { }; const mainReducer = (state = initialState, action) => - produce(state, draftState => { + produce(state, (draftState) => { switch (action.type) { case GET_DATA: { draftState.status = 'loading'; 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 d05191c5eb..e5b433387e 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,19 +1,19 @@ import { createSelector } from 'reselect'; import { initialState } from './reducer'; -const selectAppDomain = () => state => { +const selectAppDomain = () => (state) => { return state['content-manager_app'] || initialState; }; const makeSelectApp = () => - createSelector(selectAppDomain(), substate => { + createSelector(selectAppDomain(), (substate) => { return substate; }); -const makeSelectModels = () => createSelector(selectAppDomain(), state => state.models); +const makeSelectModels = () => createSelector(selectAppDomain(), (state) => state.models); const makeSelectModelLinks = () => - createSelector(selectAppDomain(), state => ({ + createSelector(selectAppDomain(), (state) => ({ collectionTypeLinks: state.collectionTypeLinks, singleTypeLinks: state.singleTypeLinks, })); 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 fabcc8532e..d364ab2129 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 @@ -25,7 +25,9 @@ jest.mock('@fortawesome/react-fontawesome', () => ({ FontAwesomeIcon: () => null, })); -jest.mock('../../NoContentType', () => () =>
    NoContentType
    ); +jest.mock('../../NoContentType', () => () => { + return
    NoContentType
    ; +}); jest.mock('@strapi/helper-plugin', () => ({ ...jest.requireActual('@strapi/helper-plugin'), 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 e8eac78778..7817b09107 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 @@ -22,7 +22,7 @@ describe('Content Manager | App | reducer', () => { it('should handle the getData action correctly', () => { state.status = 'resolved'; - const expected = produce(state, draft => { + const expected = produce(state, (draft) => { draft.status = 'loading'; }); @@ -50,7 +50,7 @@ describe('Content Manager | App | reducer', () => { isDisplayed: true, }, ]; - const expected = produce(state, draft => { + const expected = produce(state, (draft) => { draft.status = 'resolved'; draft.components = ['test']; draft.models = ['test']; 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 2329e7c4d9..7c266f69d0 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,4 @@ -import { fixtures } from '../../../../../../../../admin-test-utils'; +import { fixtures } from '@strapi/admin-test-utils/lib'; import { makeSelectModels } from '../selectors'; describe('Content Manager | App | selectors', () => { diff --git a/packages/core/admin/admin/src/content-manager/pages/App/useModels.js b/packages/core/admin/admin/src/content-manager/pages/App/useModels.js index 30ceea5a56..382114690a 100644 --- a/packages/core/admin/admin/src/content-manager/pages/App/useModels.js +++ b/packages/core/admin/admin/src/content-manager/pages/App/useModels.js @@ -35,7 +35,7 @@ const useModels = () => { data: { data: models }, }, ] = await Promise.all( - ['components', 'content-types'].map(endPoint => + ['components', 'content-types'].map((endPoint) => axiosInstance.get(getRequestUrl(endPoint), { cancelToken: source.token }) ) ); diff --git a/packages/core/admin/admin/src/content-manager/pages/App/utils/generateModelsLinks.js b/packages/core/admin/admin/src/content-manager/pages/App/utils/generateModelsLinks.js index b36dee0fa6..8030c25829 100644 --- a/packages/core/admin/admin/src/content-manager/pages/App/utils/generateModelsLinks.js +++ b/packages/core/admin/admin/src/content-manager/pages/App/utils/generateModelsLinks.js @@ -3,8 +3,8 @@ import { stringify } from 'qs'; const generateLinks = (links, type, configurations = []) => { return links - .filter(link => link.isDisplayed) - .map(link => { + .filter((link) => link.isDisplayed) + .map((link) => { const collectionTypesPermissions = [ { action: 'plugin::content-manager.explorer.create', subject: link.uid }, { action: 'plugin::content-manager.explorer.read', subject: link.uid }, diff --git a/packages/core/admin/admin/src/content-manager/pages/App/utils/tests/getContentTypeLinks.js b/packages/core/admin/admin/src/content-manager/pages/App/utils/tests/getContentTypeLinks.js index 65e993734d..37dae5842d 100644 --- a/packages/core/admin/admin/src/content-manager/pages/App/utils/tests/getContentTypeLinks.js +++ b/packages/core/admin/admin/src/content-manager/pages/App/utils/tests/getContentTypeLinks.js @@ -70,7 +70,7 @@ describe('checkPermissions', () => { }, ]; - request.mockImplementation(url => { + request.mockImplementation((url) => { if (url === '/content-manager/content-types') { return Promise.resolve({ data }); } 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 f5a8ae1654..0fbed8d7fb 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 @@ -81,7 +81,7 @@ const CollectionTypeRecursivePath = ({ { path: ':id', comp: EditViewLayoutManager }, { path: '', comp: ListViewLayout }, ].map(({ path, comp }) => ( - renderRoute(props, comp)} /> + renderRoute(props, comp)} /> )); return ( 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 dbba86ff3c..8480c5f2db 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 @@ -16,14 +16,14 @@ const cmPermissions = permissions.contentManager; const ComponentSettingsView = () => { const [{ isLoading, data: layout }, dispatch] = useReducer(crudReducer, crudInitialState); const schemasSelector = useMemo(makeSelectModelAndComponentSchemas, []); - const { schemas } = useSelector(state => schemasSelector(state), shallowEqual); + const { schemas } = useSelector((state) => schemasSelector(state), shallowEqual); const { uid } = useParams(); useEffect(() => { const CancelToken = axios.CancelToken; const source = CancelToken.source(); - const fetchData = async source => { + const fetchData = async (source) => { try { dispatch(getData()); 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 d7df4f7ccb..73ce036517 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 @@ -22,7 +22,7 @@ const ComponentFieldList = ({ componentUid }) => { {componentLayout.map((row, index) => ( // eslint-disable-next-line react/no-array-index-key - {row.map(rowContent => ( + {row.map((rowContent) => ( ({ + collect: (monitor) => ({ canDrop: monitor.canDrop(), clientOffset: monitor.getClientOffset(), isOver: monitor.isOver(), @@ -225,7 +225,7 @@ const DisplayedFieldButton = ({ }); const [{ isDragging, getItem }, drag, dragPreview] = useDrag({ type: ItemTypes.EDIT_FIELD, - item: () => { + item() { setIsDraggingSibling(true); return { @@ -244,11 +244,11 @@ const DisplayedFieldButton = ({ // We will need to add a 12 size _TEMP_ div to offer a drop target between each existing row. return name !== '_TEMP_'; }, - collect: monitor => ({ + collect: (monitor) => ({ isDragging: monitor.isDragging(), getItem: monitor.getItem(), }), - end: () => { + end() { setIsDraggingSibling(false); }, }); @@ -344,7 +344,7 @@ const DisplayedFieldButton = ({ as="span" type="button" ref={refs.dragRef} - onClick={e => e.stopPropagation()} + onClick={(e) => e.stopPropagation()} alignItems="center" paddingLeft={3} paddingRight={3} 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 4f6c8d43fc..97d8753bf5 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 @@ -57,7 +57,7 @@ const DisplayedFields = ({ editLayout, editLayoutRemainingFields, onRemoveField, variant="secondary" disabled={editLayoutRemainingFields.length === 0} > - {editLayoutRemainingFields.map(field => ( + {editLayoutRemainingFields.map((field) => ( onAddField(field)}> {field} 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 e1e02251a7..901dd1e03a 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 @@ -46,7 +46,7 @@ const DynamicZoneList = ({ components }) => { return ( - {components.map(componentUid => ( + {components.map((componentUid) => ( { + onChange={(e) => { onChange({ target: { name, value: e.target.checked } }); }} checked={value} @@ -37,10 +37,10 @@ const GenericInput = ({ type, options, onChange, value, name, ...inputProps }) = { + onChange={(value) => { onSizeChange({ name: selectedField, value }); }} label={formatMessage({ diff --git a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/RelationalFieldButton.js b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/RelationalFieldButton.js index 39a462ec91..eb8446f5f0 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/RelationalFieldButton.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/RelationalFieldButton.js @@ -56,10 +56,10 @@ const RelationalFieldButton = ({ const [{ isDragging }, drag, dragPreview] = useDrag({ type: ItemTypes.EDIT_RELATION, - item: () => { + item() { return { index, labelField: children, name }; }, - collect: monitor => ({ + collect: (monitor) => ({ isDragging: monitor.isDragging(), }), }); @@ -94,7 +94,7 @@ const RelationalFieldButton = ({ as="span" type="button" ref={dragButtonRef} - onClick={e => e.stopPropagation()} + onClick={(e) => e.stopPropagation()} alignItems="center" paddingLeft={3} paddingRight={3} diff --git a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/RelationalFields.js b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/RelationalFields.js index 524912d4d9..e2eb5fbc36 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/RelationalFields.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/components/RelationalFields.js @@ -77,7 +77,7 @@ const RelationalFields = ({ variant="secondary" disabled={editRelationsLayoutRemainingFields.length === 0} > - {editRelationsLayoutRemainingFields.map(remainingRelation => ( + {editRelationsLayoutRemainingFields.map((remainingRelation) => ( { + const entryTitleOptions = Object.keys(attributes).filter((attr) => { const type = get(attributes, [attr, 'type'], ''); return ( @@ -68,22 +68,22 @@ const EditSettingsView = ({ mainLayout, components, isContentTypeView, slug, upd const editLayout = get(modifiedData, ['layouts', 'edit'], []); const displayedFields = flatMap(editLayout, 'rowContent'); const editLayoutRemainingFields = Object.keys(modifiedData.attributes) - .filter(attr => { + .filter((attr) => { if (!isContentTypeView) { return true; } return get(modifiedData, ['attributes', attr, 'type'], '') !== 'relation'; }) - .filter(attr => get(modifiedData, ['metadatas', attr, 'edit', 'visible'], false) === true) - .filter(attr => { - return displayedFields.findIndex(el => el.name === attr) === -1; + .filter((attr) => get(modifiedData, ['metadatas', attr, 'edit', 'visible'], false) === true) + .filter((attr) => { + return displayedFields.findIndex((el) => el.name === attr) === -1; }) .sort(); const relationsLayout = get(modifiedData, ['layouts', 'editRelations'], []); const editRelationsLayoutRemainingFields = Object.keys(attributes) - .filter(attr => attributes[attr].type === 'relation') - .filter(attr => relationsLayout.indexOf(attr) === -1); + .filter((attr) => attributes[attr].type === 'relation') + .filter((attr) => relationsLayout.indexOf(attr) === -1); const handleChange = ({ target: { name, value } }) => { dispatch({ @@ -94,11 +94,11 @@ const EditSettingsView = ({ mainLayout, components, isContentTypeView, slug, upd }; const handleToggleModal = () => { - setIsModalFormOpen(prev => !prev); + setIsModalFormOpen((prev) => !prev); }; const toggleConfirmDialog = () => { - setIsConfirmDialogOpen(prev => !prev); + setIsConfirmDialogOpen((prev) => !prev); }; const handleMetaChange = ({ target: { name, value } }) => { @@ -117,7 +117,7 @@ const EditSettingsView = ({ mainLayout, components, isContentTypeView, slug, upd }); }; - const handleMetaSubmit = e => { + const handleMetaSubmit = (e) => { e.preventDefault(); dispatch({ type: 'SUBMIT_META_FORM', @@ -125,17 +125,17 @@ const EditSettingsView = ({ mainLayout, components, isContentTypeView, slug, upd handleToggleModal(); }; - const handleSubmit = e => { + const handleSubmit = (e) => { e.preventDefault(); toggleConfirmDialog(); }; const submitMutation = useMutation( - body => { + (body) => { return putCMSettingsEV(body, slug, isContentTypeView); }, { - onSuccess: ({ data }) => { + onSuccess({ data }) { if (updateLayout) { updateLayout(data.data); } @@ -145,7 +145,7 @@ const EditSettingsView = ({ mainLayout, components, isContentTypeView, slug, upd toggleConfirmDialog(); trackUsage('didEditEditSettings'); }, - onError: () => { + onError() { toggleNotification({ type: 'warning', message: { id: 'notification.error' } }); }, } @@ -215,7 +215,7 @@ const EditSettingsView = ({ mainLayout, components, isContentTypeView, slug, upd onMoveField={handleMoveField} moveRow={moveRow} moveItem={moveItem} - setEditFieldToSelect={name => { + setEditFieldToSelect={(name) => { dispatch({ type: 'SET_FIELD_TO_EDIT', name, @@ -242,7 +242,7 @@ const EditSettingsView = ({ mainLayout, components, isContentTypeView, slug, upd navigationAction={ } - onClick={e => { + onClick={(e) => { e.preventDefault(); goBack(); }} @@ -292,7 +292,7 @@ const EditSettingsView = ({ mainLayout, components, isContentTypeView, slug, upd id: getTrad('containers.SettingPage.editSettings.entry.title.description'), defaultMessage: 'Set the display field of your entry', })} - onChange={value => { + onChange={(value) => { handleChange({ target: { name: 'settings.mainField', @@ -302,7 +302,7 @@ const EditSettingsView = ({ mainLayout, components, isContentTypeView, slug, upd }} value={modifiedData.settings.mainField} > - {entryTitleOptions.map(attribute => ( + {entryTitleOptions.map((attribute) => ( @@ -325,7 +325,7 @@ const EditSettingsView = ({ mainLayout, components, isContentTypeView, slug, upd attributes={attributes} editLayout={editLayout} editLayoutRemainingFields={editLayoutRemainingFields} - onAddField={field => { + onAddField={(field) => { dispatch({ type: 'ON_ADD_FIELD', name: field, @@ -345,8 +345,8 @@ const EditSettingsView = ({ mainLayout, components, isContentTypeView, slug, upd dispatch({ type: 'ADD_RELATION', name })} - onRemoveField={index => dispatch({ type: 'REMOVE_RELATION', index })} + onAddField={(name) => dispatch({ type: 'ADD_RELATION', name })} + onRemoveField={(index) => dispatch({ type: 'REMOVE_RELATION', index })} /> )} 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 0d582ab6ed..e505d2f87e 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 @@ -17,7 +17,7 @@ const initialState = { const reducer = (state = initialState, action) => // eslint-disable-next-line consistent-return - produce(state, draftState => { + produce(state, (draftState) => { const layoutPathEdit = ['modifiedData', 'layouts', 'edit']; const layoutPathRelations = ['modifiedData', 'layouts', 'editRelations']; diff --git a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/utils/createPossibleMainFieldsForModelsAndComponents.js b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/utils/createPossibleMainFieldsForModelsAndComponents.js index 5676922a5b..06fd9dd28f 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/utils/createPossibleMainFieldsForModelsAndComponents.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/utils/createPossibleMainFieldsForModelsAndComponents.js @@ -1,9 +1,9 @@ import { get } from 'lodash'; -const createPossibleMainFieldsForModelsAndComponents = array => { +const createPossibleMainFieldsForModelsAndComponents = (array) => { return array.reduce((acc, current) => { const attributes = get(current, ['attributes'], {}); - const possibleMainFields = Object.keys(attributes).filter(attr => { + const possibleMainFields = Object.keys(attributes).filter((attr) => { return ![ 'boolean', 'component', diff --git a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/utils/getInputProps.js b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/utils/getInputProps.js index 5f089c124d..bd66239495 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/utils/getInputProps.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditSettingsView/utils/getInputProps.js @@ -1,6 +1,6 @@ import { getTrad } from '../../../utils'; -const getInputProps = fieldName => { +const getInputProps = (fieldName) => { let type; switch (fieldName) { 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 9acb0d7049..2b655b6476 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 @@ -1,7 +1,7 @@ /* eslint-disable indent */ -const getRowSize = arr => arr.reduce((sum, value) => sum + value.size, 0); +const getRowSize = (arr) => arr.reduce((sum, value) => sum + value.size, 0); -const createLayout = arr => { +const createLayout = (arr) => { return arr.reduce((acc, current, index) => { const row = { rowId: index, rowContent: current }; @@ -9,7 +9,7 @@ const createLayout = arr => { }, []); }; -const formatLayout = arr => { +const formatLayout = (arr) => { return arr .reduce((acc, current) => { let toPush = []; @@ -33,7 +33,7 @@ const formatLayout = arr => { ? 0 : Math.max.apply( Math, - acc.map(o => o.rowId) + acc.map((o) => o.rowId) ) + 1; const currentRowSize = getRowSize(currentRow); @@ -57,8 +57,8 @@ const formatLayout = arr => { return acc; }, []) - .filter(row => row.rowContent.length > 0) - .filter(row => { + .filter((row) => row.rowContent.length > 0) + .filter((row) => { if (row.rowContent.length === 1) { return row.rowContent[0].name !== '_TEMP_'; } @@ -67,15 +67,15 @@ const formatLayout = arr => { }); }; -const unformatLayout = arr => { +const unformatLayout = (arr) => { return arr.reduce((acc, current) => { - const currentRow = current.rowContent.filter(content => content.name !== '_TEMP_'); + const currentRow = current.rowContent.filter((content) => content.name !== '_TEMP_'); return acc.concat([currentRow]); }, []); }; -const getDefaultInputSize = type => { +const getDefaultInputSize = (type) => { switch (type) { case 'boolean': case 'date': @@ -97,7 +97,7 @@ const getDefaultInputSize = type => { const getFieldSize = (name, layouts = []) => { return layouts.reduce((acc, { rowContent }) => { - const size = rowContent.find(row => row.name === name)?.size ?? null; + const size = rowContent.find((row) => row.name === name)?.size ?? null; if (size) { acc = size; @@ -108,8 +108,8 @@ const getFieldSize = (name, layouts = []) => { }; const setFieldSize = (name, size, layouts = []) => { - return layouts.map(row => { - row.rowContent = row.rowContent.map(column => { + return layouts.map((row) => { + row.rowContent = row.rowContent.map((column) => { if (column.name === name) { return { ...column, 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 85402afe75..73b0b985a2 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 @@ -15,7 +15,7 @@ const DeleteLink = ({ isCreatingEntry, onDelete, onDeleteSucceeded, trackerPrope const { formatMessage } = useIntl(); const toggleNotification = useNotification(); - const toggleWarningDelete = () => setWarningDelete(prevState => !prevState); + const toggleWarningDelete = () => setWarningDelete((prevState) => !prevState); const handleConfirmDelete = async () => { try { diff --git a/packages/core/admin/admin/src/content-manager/pages/EditView/DeleteLink/utils/connect.js b/packages/core/admin/admin/src/content-manager/pages/EditView/DeleteLink/utils/connect.js index b7735feb99..8cd8440d07 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditView/DeleteLink/utils/connect.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditView/DeleteLink/utils/connect.js @@ -1,7 +1,7 @@ import React from 'react'; function connect(WrappedComponent, select) { - return function(props) { + return (props) => { // eslint-disable-next-line react/prop-types const selectors = select(); 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 478b36a4d6..b430e7c999 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 @@ -12,7 +12,7 @@ import { ThemeProvider, lightTheme } from '@strapi/design-system'; import { IntlProvider } from 'react-intl'; import { DraftAndPublishBadge } from '../index'; -const makeApp = props => ( +const makeApp = (props) => ( diff --git a/packages/core/admin/admin/src/content-manager/pages/EditView/DraftAndPublishBadge/utils/connect.js b/packages/core/admin/admin/src/content-manager/pages/EditView/DraftAndPublishBadge/utils/connect.js index b7735feb99..8cd8440d07 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditView/DraftAndPublishBadge/utils/connect.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditView/DraftAndPublishBadge/utils/connect.js @@ -1,7 +1,7 @@ import React from 'react'; function connect(WrappedComponent, select) { - return function(props) { + return (props) => { // eslint-disable-next-line react/prop-types const selectors = select(); 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 b3e5d9b96d..ca1c1f4974 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 @@ -134,8 +134,8 @@ const Header = ({ ); } - const toggleWarningUnpublish = () => setWarningUnpublish(prevState => !prevState); - const toggleWarningDraftRelation = () => setShowWarningDraftRelation(prevState => !prevState); + const toggleWarningUnpublish = () => setWarningUnpublish((prevState) => !prevState); + const toggleWarningDraftRelation = () => setShowWarningDraftRelation((prevState) => !prevState); const handlePublish = () => { toggleWarningDraftRelation(); @@ -165,7 +165,7 @@ const Header = ({ // Needed in order to redirect the user with the correct search params // Since parts is using a link from react-router-dom the best way to do it is to disable the // event - onClick={e => { + onClick={(e) => { e.preventDefault(); goBack(); }} @@ -254,7 +254,7 @@ const Header = ({ }, { br: () =>
    , - b: chunks => {chunks}, + b: (chunks) => {chunks}, count: draftRelationsCountRef.current, } )} diff --git a/packages/core/admin/admin/src/content-manager/pages/EditView/Header/utils/connect.js b/packages/core/admin/admin/src/content-manager/pages/EditView/Header/utils/connect.js index b7735feb99..8cd8440d07 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditView/Header/utils/connect.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditView/Header/utils/connect.js @@ -1,7 +1,7 @@ import React from 'react'; function connect(WrappedComponent, select) { - return function(props) { + return (props) => { // eslint-disable-next-line react/prop-types const selectors = select(); diff --git a/packages/core/admin/admin/src/content-manager/pages/EditView/Header/utils/getDraftRelations.js b/packages/core/admin/admin/src/content-manager/pages/EditView/Header/utils/getDraftRelations.js index 523266a145..e57b1f83de 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditView/Header/utils/getDraftRelations.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditView/Header/utils/getDraftRelations.js @@ -14,7 +14,7 @@ const getDraftRelations = (data, ctSchema, components) => { } if (type === 'dynamiczone') { - currentData.forEach(curr => { + currentData.forEach((curr) => { const compoSchema = get(components, curr.__component, {}); acc += getDraftRelationsCount(curr, compoSchema); @@ -27,7 +27,7 @@ const getDraftRelations = (data, ctSchema, components) => { const compoSchema = get(components, compoUID, {}); if (isRepeatable) { - currentData.forEach(curr => { + currentData.forEach((curr) => { acc += getDraftRelationsCount(curr, compoSchema); }); } else { @@ -43,7 +43,7 @@ const getDraftRelations = (data, ctSchema, components) => { acc += 1; } } else { - currentData.forEach(value => { + currentData.forEach((value) => { if (has(value, 'publishedAt') && isEmpty(value.publishedAt)) { acc += 1; } diff --git a/packages/core/admin/admin/src/content-manager/pages/EditView/Informations/utils/getUnits.js b/packages/core/admin/admin/src/content-manager/pages/EditView/Informations/utils/getUnits.js index 89ad6f06c7..b8f2bda420 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditView/Informations/utils/getUnits.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditView/Informations/utils/getUnits.js @@ -4,7 +4,7 @@ const msPerDay = msPerHour * 24; const msPerMonth = msPerDay * 30; const msPerYear = msPerDay * 365; -const getUnits = value => { +const getUnits = (value) => { if (value < msPerMinute) { return { unit: 'second', value: -Math.round(value / 1000) }; } 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 0e6669cb00..8ff1f2851d 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 @@ -44,13 +44,10 @@ const EditView = ({ }) => { const { trackUsage } = useTracking(); const { formatMessage } = useIntl(); - const { - createActionAllowedFields, - readActionAllowedFields, - updateActionAllowedFields, - } = useMemo(() => { - return getFieldsActionMatchingPermissions(userPermissions, slug); - }, [userPermissions, slug]); + const { createActionAllowedFields, readActionAllowedFields, updateActionAllowedFields } = + useMemo(() => { + return getFieldsActionMatchingPermissions(userPermissions, slug); + }, [userPermissions, slug]); const configurationPermissions = useMemo(() => { return isSingleType @@ -70,9 +67,9 @@ const EditView = ({ ); // Check if a block is a dynamic zone - const isDynamicZone = useCallback(block => { - return block.every(subBlock => { - return subBlock.every(obj => obj.fieldSchema.type === 'dynamiczone'); + const isDynamicZone = useCallback((block) => { + return block.every((subBlock) => { + return subBlock.every((obj) => obj.fieldSchema.type === 'dynamiczone'); }); }, []); diff --git a/packages/core/admin/admin/src/content-manager/pages/EditView/utils/createAttributesLayout.js b/packages/core/admin/admin/src/content-manager/pages/EditView/utils/createAttributesLayout.js index 4a870983cf..793d5b93bd 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditView/utils/createAttributesLayout.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditView/utils/createAttributesLayout.js @@ -4,7 +4,7 @@ import { get, isEmpty } from 'lodash'; /* eslint-disable no-unused-vars */ const createAttributesLayout = (currentLayout, attributes) => { - const getType = name => get(attributes, [name, 'type'], ''); + const getType = (name) => get(attributes, [name, 'type'], ''); let currentRowIndex = 0; const newLayout = []; @@ -29,7 +29,7 @@ const createAttributesLayout = (currentLayout, attributes) => { } } - return newLayout.filter(arr => arr.length > 0); + return newLayout.filter((arr) => arr.length > 0); }; export default createAttributesLayout; 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 7a38071e65..a50ffa348a 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 @@ -2,7 +2,7 @@ import { uniq, flatMap } from 'lodash'; import { findMatchingPermissions } from '@strapi/helper-plugin'; const getFieldsActionMatchingPermissions = (userPermissions, slug) => { - const getMatchingPermissions = action => { + const getMatchingPermissions = (action) => { const matched = findMatchingPermissions(userPermissions, [ { action: `plugin::content-manager.explorer.${action}`, 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 fb0b632721..8d4d4eb715 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 @@ -5,7 +5,7 @@ import isEqual from 'react-fast-compare'; import EditView from '../EditView'; import { generatePermissionsObject } from '../../utils'; -const Permissions = props => { +const Permissions = (props) => { const viewPermissions = useMemo(() => generatePermissionsObject(props.slug), [props.slug]); const { isLoading, allowedActions } = useRBAC(viewPermissions, props.userPermissions); 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 7b6427fc94..a33dc0c8e1 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 @@ -12,7 +12,7 @@ export const initialState = { const editViewManagerReducer = (state = initialState, action) => // eslint-disable-next-line consistent-return - produce(state, drafState => { + produce(state, (drafState) => { switch (action.type) { case RESET_PROPS: { drafState.currentLayout = null; diff --git a/packages/core/admin/admin/src/content-manager/pages/EditViewLayoutManager/selectors.js b/packages/core/admin/admin/src/content-manager/pages/EditViewLayoutManager/selectors.js index 23ef166c45..df96465c24 100644 --- a/packages/core/admin/admin/src/content-manager/pages/EditViewLayoutManager/selectors.js +++ b/packages/core/admin/admin/src/content-manager/pages/EditViewLayoutManager/selectors.js @@ -1,3 +1,3 @@ -const selectLayout = state => state['content-manager_editViewLayoutManager'].currentLayout; +const selectLayout = (state) => state['content-manager_editViewLayoutManager'].currentLayout; export default selectLayout; 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 0391a1f012..b412db94bc 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 @@ -141,13 +141,13 @@ const DraggableCard = ({ const [{ isDragging }, drag, preview] = useDrag({ type: ItemTypes.FIELD, - item: () => { + item() { return { index, labelField, name }; }, - collect: monitor => ({ + collect: (monitor) => ({ isDragging: monitor.isDragging(), }), - end: () => { + end() { setIsDraggingSibling(false); }, }); @@ -167,7 +167,7 @@ const DraggableCard = ({ // anymore, this hack forces a rerender in order to apply the dragRef useEffect(() => { if (!isDraggingSibling) { - forceRerenderAfterDnd(prev => !prev); + forceRerenderAfterDnd((prev) => !prev); } }, [isDraggingSibling]); @@ -203,7 +203,7 @@ const DraggableCard = ({ }, { item: name } )} - onClick={e => e.stopPropagation()} + onClick={(e) => e.stopPropagation()} ref={refs.dragRef} type="button" > @@ -214,7 +214,7 @@ const DraggableCard = ({ { + onClick={(e) => { e.stopPropagation(); onClickEditField(name); }} 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 7be70bd6f4..3c6dc2ce85 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 @@ -72,7 +72,7 @@ const EditFieldForm = ({ defaultMessage: 'Label', })} name="label" - onChange={e => onChangeEditLabel(e)} + onChange={(e) => onChangeEditLabel(e)} value={fieldForm.label} hint={formatMessage({ id: getTrad('form.Input.label.inputDescription'), @@ -90,8 +90,9 @@ const EditFieldForm = ({ defaultMessage: 'Enable sort on this field', })} name="sortable" - onChange={e => - onChangeEditLabel({ target: { name: 'sortable', value: e.target.checked } })} + onChange={(e) => + onChangeEditLabel({ target: { name: 'sortable', value: e.target.checked } }) + } onLabel={formatMessage({ id: 'app.components.ToggleCheckbox.on-label', defaultMessage: 'on', 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 9f929d5eb4..f190f1ad1d 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 @@ -34,7 +34,7 @@ const Settings = ({ modifiedData, onChange, sortOptions }) => { id: getTrad('form.Input.search'), defaultMessage: 'Enable search', })} - onChange={e => { + onChange={(e) => { onChange({ target: { name: 'settings.searchable', value: e.target.checked } }); }} onLabel={formatMessage({ @@ -53,7 +53,7 @@ const Settings = ({ modifiedData, onChange, sortOptions }) => { id: getTrad('form.Input.filters'), defaultMessage: 'Enable filters', })} - onChange={e => { + onChange={(e) => { onChange({ target: { name: 'settings.filterable', value: e.target.checked } }); }} onLabel={formatMessage({ @@ -72,7 +72,7 @@ const Settings = ({ modifiedData, onChange, sortOptions }) => { id: getTrad('form.Input.bulkActions'), defaultMessage: 'Enable bulk actions', })} - onChange={e => { + onChange={(e) => { onChange({ target: { name: 'settings.bulkable', value: e.target.checked } }); }} onLabel={formatMessage({ @@ -99,11 +99,11 @@ const Settings = ({ modifiedData, onChange, sortOptions }) => { defaultMessage: 'Note: You can override this value in the Collection Type settings page.', })} - onChange={value => onChange({ target: { name: 'settings.pageSize', value } })} + onChange={(value) => onChange({ target: { name: 'settings.pageSize', value } })} name="settings.pageSize" value={modifiedData.settings.pageSize || ''} > - {[10, 20, 50, 100].map(pageSize => ( + {[10, 20, 50, 100].map((pageSize) => ( @@ -116,11 +116,11 @@ const Settings = ({ modifiedData, onChange, sortOptions }) => { id: getTrad('form.Input.defaultSort'), defaultMessage: 'Default sort attribute', })} - onChange={value => onChange({ target: { name: 'settings.defaultSortBy', value } })} + onChange={(value) => onChange({ target: { name: 'settings.defaultSortBy', value } })} name="settings.defaultSortBy" value={modifiedData.settings.defaultSortBy || ''} > - {sortOptions.map(sortBy => ( + {sortOptions.map((sortBy) => ( @@ -133,11 +133,11 @@ const Settings = ({ modifiedData, onChange, sortOptions }) => { id: getTrad('form.Input.sort.order'), defaultMessage: 'Default sort order', })} - onChange={value => onChange({ target: { name: 'settings.defaultSortOrder', value } })} + onChange={(value) => onChange({ target: { name: 'settings.defaultSortOrder', value } })} name="settings.defaultSortOrder" value={modifiedData.settings.defaultSortOrder || ''} > - {['ASC', 'DESC'].map(order => ( + {['ASC', 'DESC'].map((order) => ( 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 e90eac7cce..64b35d75b6 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 @@ -83,7 +83,7 @@ const SortDisplayedFields = ({ isDraggingSibling={isDraggingSibling} onMoveField={onMoveField} onClickEditField={onClickEditField} - onRemoveField={e => handleRemoveField(e, index)} + onRemoveField={(e) => handleRemoveField(e, index)} name={field} labelField={metadatas[field].list.label || field} setIsDraggingSibling={setIsDraggingSibling} @@ -102,7 +102,7 @@ const SortDisplayedFields = ({ disabled={listRemainingFields.length <= 0} data-testid="add-field" > - {listRemainingFields.map(field => ( + {listRemainingFields.map((field) => ( handleAddField(field)}> {field} 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 2a3099860b..eb05ba73ab 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 @@ -34,9 +34,9 @@ const ListSettingsView = ({ layout, slug }) => { const { refetchData } = useContext(ModelsContext); const [showWarningSubmit, setWarningSubmit] = useState(false); - const toggleWarningSubmit = () => setWarningSubmit(prevState => !prevState); + const toggleWarningSubmit = () => setWarningSubmit((prevState) => !prevState); const [isModalFormOpen, setIsModalFormOpen] = useState(false); - const toggleModalForm = () => setIsModalFormOpen(prevState => !prevState); + const toggleModalForm = () => setIsModalFormOpen((prevState) => !prevState); const [reducerState, dispatch] = useReducer(reducer, initialState, () => init(initialState, layout) ); @@ -76,7 +76,7 @@ const ListSettingsView = ({ layout, slug }) => { submitMutation.mutate(body); }; - const handleAddField = item => { + const handleAddField = (item) => { dispatch({ type: 'ADD_FIELD', item, @@ -99,13 +99,13 @@ const ListSettingsView = ({ layout, slug }) => { } }; - const handleSubmit = e => { + const handleSubmit = (e) => { e.preventDefault(); toggleWarningSubmit(); trackUsage('willSaveContentTypeLayout'); }; - const handleClickEditField = fieldToEdit => { + const handleClickEditField = (fieldToEdit) => { dispatch({ type: 'SET_FIELD_TO_EDIT', fieldToEdit, @@ -120,7 +120,7 @@ const ListSettingsView = ({ layout, slug }) => { toggleModalForm(); }; - const handleSubmitFieldEdit = e => { + const handleSubmitFieldEdit = (e) => { e.preventDefault(); toggleModalForm(); dispatch({ @@ -128,12 +128,12 @@ const ListSettingsView = ({ layout, slug }) => { }); }; - const submitMutation = useMutation(body => putCMSettingsLV(body, slug), { - onSuccess: () => { + const submitMutation = useMutation((body) => putCMSettingsLV(body, slug), { + onSuccess() { trackUsage('didEditListSettings'); refetchData(); }, - onError: () => { + onError() { toggleNotification({ type: 'warning', message: { id: 'notification.error' }, 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 4fd33f238d..cb9d38ef12 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 @@ -12,7 +12,7 @@ const initialState = { const reducer = (state = initialState, action) => // eslint-disable-next-line consistent-return - produce(state, draftState => { + produce(state, (draftState) => { const layoutFieldListPath = ['modifiedData', 'layouts', 'list']; switch (action.type) { case 'ADD_FIELD': { 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 d35a58d180..916caa4d58 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 @@ -92,7 +92,7 @@ const layout = { uid: 'api::restaurant.restaurant', }; -const makeApp = history => ( +const makeApp = (history) => ( diff --git a/packages/core/admin/admin/src/content-manager/pages/ListSettingsView/utils/ellipsisCardTitle.js b/packages/core/admin/admin/src/content-manager/pages/ListSettingsView/utils/ellipsisCardTitle.js index 512d1579fd..66bd666cf9 100644 --- a/packages/core/admin/admin/src/content-manager/pages/ListSettingsView/utils/ellipsisCardTitle.js +++ b/packages/core/admin/admin/src/content-manager/pages/ListSettingsView/utils/ellipsisCardTitle.js @@ -1,4 +1,4 @@ -const ellipsisCardTitle = title => { +const ellipsisCardTitle = (title) => { const formatedTitle = title.length > 20 ? `${title.substring(0, 20)}...` : title; return formatedTitle; 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 414d50238c..d653b932f8 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 @@ -16,7 +16,7 @@ const FieldPicker = ({ layout }) => { const { trackUsage } = useTracking(); const { formatMessage } = useIntl(); - const allAllowedHeaders = getAllAllowedHeaders(layout.contentType.attributes).map(attrName => { + const allAllowedHeaders = getAllAllowedHeaders(layout.contentType.attributes).map((attrName) => { const metadatas = layout.contentType.metadatas[attrName].list; return { @@ -26,18 +26,18 @@ const FieldPicker = ({ layout }) => { }); const values = displayedHeaders.map(({ name }) => name); - const handleChange = updatedValues => { + const handleChange = (updatedValues) => { trackUsage('didChangeDisplayedFields'); // removing a header if (updatedValues.length < values.length) { - const removedHeader = values.filter(value => { + const removedHeader = values.filter((value) => { return updatedValues.indexOf(value) === -1; }); dispatch(onChangeListHeaders({ name: removedHeader[0], value: true })); } else { - const addedHeader = updatedValues.filter(value => { + const addedHeader = updatedValues.filter((value) => { return values.indexOf(value) === -1; }); @@ -51,18 +51,19 @@ const FieldPicker = ({ layout }) => { aria-label="change displayed fields" value={values} onChange={handleChange} - customizeContent={values => + customizeContent={(values) => formatMessage( { id: getTrad('select.currently.selected'), defaultMessage: '{count} currently selected', }, { count: values.length } - )} + ) + } multi size="S" > - {allAllowedHeaders.map(header => { + {allAllowedHeaders.map((header) => { return ( - {assets.map(asset => { + {assets.map((asset) => { const assetKey = asset.url; if (uploadStatus === Status.Uploading || uploadStatus === Status.Intermediate) { @@ -134,7 +134,7 @@ export const PendingAssetStep = ({ asset={asset} id={assetKey} onCancel={onCancelUpload} - onStatusChange={status => handleStatusChange(status, asset.rawFile)} + onStatusChange={(status) => handleStatusChange(status, asset.rawFile)} size="S" folderId={folderId} /> 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 a170d67a14..976bfe0565 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 @@ -5,7 +5,7 @@ import { render as renderTL } from '@testing-library/react'; import { QueryClientProvider, QueryClient } from 'react-query'; import { PendingAssetStep } from '../PendingAssetStep'; -jest.mock('../../../../utils/getTrad', () => x => x); +jest.mock('../../../../utils/getTrad', () => (x) => x); jest.mock('@strapi/helper-plugin', () => ({ ...jest.requireActual('@strapi/helper-plugin'), @@ -24,7 +24,7 @@ describe('PendingAssetStep', () => { beforeAll(() => { // see https://github.com/testing-library/react-testing-library/issues/470 Object.defineProperty(HTMLMediaElement.prototype, 'muted', { - set: () => {}, + set() {}, }); }); diff --git a/packages/core/upload/admin/src/components/UploadAssetDialog/UploadAssetDialog.js b/packages/core/upload/admin/src/components/UploadAssetDialog/UploadAssetDialog.js index 8a84b37a50..6974b96df4 100644 --- a/packages/core/upload/admin/src/components/UploadAssetDialog/UploadAssetDialog.js +++ b/packages/core/upload/admin/src/components/UploadAssetDialog/UploadAssetDialog.js @@ -25,8 +25,8 @@ export const UploadAssetDialog = ({ const [assets, setAssets] = useState(initialAssetsToAdd || []); const [assetToEdit, setAssetToEdit] = useState(undefined); - const handleAddToPendingAssets = nextAssets => { - setAssets(prevAssets => prevAssets.concat(nextAssets)); + const handleAddToPendingAssets = (nextAssets) => { + setAssets((prevAssets) => prevAssets.concat(nextAssets)); setStep(Steps.PendingAsset); }; @@ -34,8 +34,8 @@ export const UploadAssetDialog = ({ setStep(Steps.AddAsset); }; - const handleCancelUpload = file => { - const nextAssets = assets.filter(asset => asset.rawFile !== file); + const handleCancelUpload = (file) => { + const nextAssets = assets.filter((asset) => asset.rawFile !== file); setAssets(nextAssets); // When there's no asset, transition to the AddAsset step @@ -44,8 +44,8 @@ export const UploadAssetDialog = ({ } }; - const handleUploadSuccess = file => { - const nextAssets = assets.filter(asset => asset.rawFile !== file); + const handleUploadSuccess = (file) => { + const nextAssets = assets.filter((asset) => asset.rawFile !== file); setAssets(nextAssets); if (nextAssets.length === 0) { @@ -53,9 +53,9 @@ export const UploadAssetDialog = ({ } }; - const handleAssetEditValidation = nextAsset => { + const handleAssetEditValidation = (nextAsset) => { if (nextAsset) { - const nextAssets = assets.map(asset => (asset === assetToEdit ? nextAsset : asset)); + const nextAssets = assets.map((asset) => (asset === assetToEdit ? nextAsset : asset)); setAssets(nextAssets); } @@ -80,8 +80,8 @@ export const UploadAssetDialog = ({ } }; - const handleRemoveAsset = assetToRemove => { - const nextAssets = assets.filter(asset => asset !== assetToRemove); + const handleRemoveAsset = (assetToRemove) => { + const nextAssets = assets.filter((asset) => asset !== assetToRemove); setAssets(nextAssets); }; 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 d1c5b9dd31..db7bddc505 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 @@ -2,12 +2,12 @@ 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 { TrackingContext } from '@strapi/helper-plugin'; +import { TrackingProvider } from '@strapi/helper-plugin'; import en from '../../../translations/en.json'; import { UploadAssetDialog } from '../UploadAssetDialog'; import { server } from './server'; -jest.mock('../../../utils/getTrad', () => x => x); +jest.mock('../../../utils/getTrad', () => (x) => x); jest.mock('react-intl', () => ({ useIntl: () => ({ formatMessage: jest.fn(({ id }) => en[id] || id) }), @@ -21,14 +21,14 @@ const queryClient = new QueryClient({ }, }); -const render = (props = { onClose: () => {} }) => +const render = (props = { onClose() {} }) => renderTL( - + - + , { container: document.getElementById('app') } ); @@ -55,7 +55,7 @@ describe('UploadAssetDialog', () => { it('closes the dialog when clicking on cancel on the add asset step', () => { const onCloseSpy = jest.fn(); - render({ onClose: onCloseSpy, onSuccess: () => {} }); + render({ onClose: onCloseSpy, onSuccess() {} }); fireEvent.click(screen.getByText('app.components.Button.cancel')); @@ -66,10 +66,10 @@ describe('UploadAssetDialog', () => { const file = new File(['Some stuff'], 'test.png', { type: 'image/png' }); const onCloseSpy = jest.fn(); - render({ onClose: onCloseSpy, onSuccess: () => {} }); + render({ onClose: onCloseSpy, onSuccess() {} }); const fileList = [file]; - fileList.item = i => fileList[i]; + fileList.item = (i) => fileList[i]; fireEvent.change(document.querySelector('[type="file"]'), { target: { files: fileList } }); fireEvent.click(screen.getByText('app.components.Button.cancel')); @@ -88,15 +88,15 @@ describe('UploadAssetDialog', () => { // see https://github.com/testing-library/react-testing-library/issues/470 Object.defineProperty(HTMLMediaElement.prototype, 'muted', { - set: () => {}, + set() {}, }); const file = new File(['Some stuff'], `test.${ext}`, { type: mime }); const fileList = [file]; - fileList.item = i => fileList[i]; + fileList.item = (i) => fileList[i]; - render({ onClose: onCloseSpy, onSuccess: () => {} }); + render({ onClose: onCloseSpy, onSuccess() {} }); fireEvent.change(document.querySelector('[type="file"]'), { target: { files: fileList }, @@ -210,7 +210,7 @@ describe('UploadAssetDialog', () => { screen.getByText('Manage the assets before adding them to the Media Library') ).toBeInTheDocument(); - assets.forEach(asset => { + assets.forEach((asset) => { const dialog = within(screen.getByRole('dialog')); const card = within(dialog.getAllByLabelText(asset.name)[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 3fe86b3844..41bf27e789 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 @@ -26,7 +26,7 @@ const queryClient = new QueryClient({ }, }); -const renderCompo = props => { +const renderCompo = (props) => { const target = document.createElement('div'); document.body.appendChild(target); 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 bbf1c4531a..70e34f1acd 100644 --- a/packages/core/upload/admin/src/hooks/tests/useAssets.test.js +++ b/packages/core/upload/admin/src/hooks/tests/useAssets.test.js @@ -64,7 +64,7 @@ function ComponentFixture({ children }) { } function setup(...args) { - return new Promise(resolve => { + return new Promise((resolve) => { act(() => { resolve(renderHook(() => useAssets(...args), { wrapper: ComponentFixture })); }); 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 b853770ea6..26524235f1 100644 --- a/packages/core/upload/admin/src/hooks/tests/useBulkMove.test.js +++ b/packages/core/upload/admin/src/hooks/tests/useBulkMove.test.js @@ -96,7 +96,7 @@ function ComponentFixture({ children }) { } function setup(...args) { - return new Promise(resolve => { + return new Promise((resolve) => { act(() => { resolve(renderHook(() => useBulkMove(...args), { wrapper: ComponentFixture })); }); 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 ee354b9910..dbaabc49fb 100644 --- a/packages/core/upload/admin/src/hooks/tests/useBulkRemove.test.js +++ b/packages/core/upload/admin/src/hooks/tests/useBulkRemove.test.js @@ -94,7 +94,7 @@ function ComponentFixture({ children }) { } function setup(...args) { - return new Promise(resolve => { + return new Promise((resolve) => { act(() => { resolve(renderHook(() => useBulkRemove(...args), { wrapper: ComponentFixture })); }); 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 cb032ec691..691fb2dee7 100644 --- a/packages/core/upload/admin/src/hooks/tests/useEditFolder.test.js +++ b/packages/core/upload/admin/src/hooks/tests/useEditFolder.test.js @@ -70,7 +70,7 @@ function ComponentFixture({ children }) { } function setup(...args) { - return new Promise(resolve => { + return new Promise((resolve) => { act(() => { resolve(renderHook(() => useEditFolder(...args), { wrapper: ComponentFixture })); }); 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 cf7090c45e..0e66e519a6 100644 --- a/packages/core/upload/admin/src/hooks/tests/useFolder.test.js +++ b/packages/core/upload/admin/src/hooks/tests/useFolder.test.js @@ -63,7 +63,7 @@ function ComponentFixture({ children }) { } function setup(...args) { - return new Promise(resolve => { + return new Promise((resolve) => { act(() => { resolve(renderHook(() => useFolder(...args), { wrapper: ComponentFixture })); }); 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 46a6c290fc..79092faa1c 100644 --- a/packages/core/upload/admin/src/hooks/tests/useFolderStructure.test.js +++ b/packages/core/upload/admin/src/hooks/tests/useFolderStructure.test.js @@ -55,7 +55,7 @@ function ComponentFixture({ children }) { } function setup(...args) { - return new Promise(resolve => { + return new Promise((resolve) => { act(() => { resolve(renderHook(() => useFolderStructure(...args), { wrapper: ComponentFixture })); }); 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 f28338c9bf..16369c10ac 100644 --- a/packages/core/upload/admin/src/hooks/tests/useFolders.test.js +++ b/packages/core/upload/admin/src/hooks/tests/useFolders.test.js @@ -64,7 +64,7 @@ function ComponentFixture({ children }) { } function setup(...args) { - return new Promise(resolve => { + return new Promise((resolve) => { act(() => { resolve(renderHook(() => useFolders(...args), { wrapper: ComponentFixture })); }); 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 937ab1754b..3b87bada1d 100644 --- a/packages/core/upload/admin/src/hooks/tests/useRemoveAsset.test.js +++ b/packages/core/upload/admin/src/hooks/tests/useRemoveAsset.test.js @@ -55,7 +55,7 @@ function ComponentFixture({ children }) { } function setup(...args) { - return new Promise(resolve => { + return new Promise((resolve) => { act(() => { resolve(renderHook(() => useRemoveAsset(...args), { wrapper: ComponentFixture })); }); diff --git a/packages/core/upload/admin/src/hooks/useBulkMove.js b/packages/core/upload/admin/src/hooks/useBulkMove.js index 0ee60610d6..0e34eda46f 100644 --- a/packages/core/upload/admin/src/hooks/useBulkMove.js +++ b/packages/core/upload/admin/src/hooks/useBulkMove.js @@ -27,7 +27,7 @@ export const useBulkMove = () => { }; const mutation = useMutation(bulkMoveQuery, { - onSuccess: res => { + onSuccess(res) { const { data: { data }, } = res; diff --git a/packages/core/upload/admin/src/hooks/useBulkRemove.js b/packages/core/upload/admin/src/hooks/useBulkRemove.js index 3dfb50db3c..c98102d95f 100644 --- a/packages/core/upload/admin/src/hooks/useBulkRemove.js +++ b/packages/core/upload/admin/src/hooks/useBulkRemove.js @@ -9,7 +9,7 @@ export const useBulkRemove = () => { const queryClient = useQueryClient(); const url = getRequestUrl('actions/bulk-delete'); - const bulkRemoveQuery = filesAndFolders => { + const bulkRemoveQuery = (filesAndFolders) => { const payload = filesAndFolders.reduce((acc, selected) => { const { id, type } = selected; const key = type === 'asset' ? 'fileIds' : 'folderIds'; @@ -27,7 +27,7 @@ export const useBulkRemove = () => { }; const mutation = useMutation(bulkRemoveQuery, { - onSuccess: res => { + onSuccess(res) { const { data: { data }, } = res; @@ -49,7 +49,7 @@ export const useBulkRemove = () => { }, }); }, - onError: error => { + onError(error) { toggleNotification({ type: 'warning', message: error.message }); }, }); diff --git a/packages/core/upload/admin/src/hooks/useCropImg.js b/packages/core/upload/admin/src/hooks/useCropImg.js index 4fe74c577c..2d860be94b 100644 --- a/packages/core/upload/admin/src/hooks/useCropImg.js +++ b/packages/core/upload/admin/src/hooks/useCropImg.js @@ -23,7 +23,7 @@ export const useCropImg = () => { setSize({ width: roundedDataWidth, height: roundedDataHeight }); }; - const crop = image => { + const crop = (image) => { if (!cropperRef.current) { cropperRef.current = new Cropper(image, { modal: true, @@ -50,27 +50,27 @@ export const useCropImg = () => { const produceFile = (name, mimeType, lastModifiedDate) => new Promise((resolve, reject) => { if (!cropperRef.current) { - return reject( + reject( new Error( 'The cropper has not been instanciated: make sure to call the crop() function before calling produceFile().' ) ); + } else { + const canvas = cropperRef.current.getCroppedCanvas(); + + canvas.toBlob( + (blob) => { + resolve( + new File([blob], name, { + type: mimeType, + lastModifiedDate, + }) + ); + }, + mimeType, + QUALITY + ); } - - const canvas = cropperRef.current.getCroppedCanvas(); - - return canvas.toBlob( - blob => { - resolve( - new File([blob], name, { - type: mimeType, - lastModifiedDate, - }) - ); - }, - mimeType, - QUALITY - ); }); return { diff --git a/packages/core/upload/admin/src/hooks/useEditAsset.js b/packages/core/upload/admin/src/hooks/useEditAsset.js index 983cc078c7..01eb8f0759 100644 --- a/packages/core/upload/admin/src/hooks/useEditAsset.js +++ b/packages/core/upload/admin/src/hooks/useEditAsset.js @@ -34,7 +34,7 @@ const editAssetRequest = (asset, file, cancelToken, onProgress) => { onUploadProgress({ total, loaded }) { onProgress((loaded / total) * 100); }, - }).then(res => res.data); + }).then((res) => res.data); }; export const useEditAsset = () => { @@ -47,12 +47,12 @@ export const useEditAsset = () => { const mutation = useMutation( ({ asset, file }) => editAssetRequest(asset, file, tokenRef.current, setProgress), { - onSuccess: () => { + onSuccess() { queryClient.refetchQueries([pluginId, 'assets'], { active: true }); queryClient.refetchQueries([pluginId, 'asset-count'], { active: true }); queryClient.refetchQueries([pluginId, 'folders'], { active: true }); }, - onError: reason => { + onError(reason) { if (reason.response.status === 403) { toggleNotification({ type: 'info', diff --git a/packages/core/upload/admin/src/hooks/useEditFolder.js b/packages/core/upload/admin/src/hooks/useEditFolder.js index 70769ef102..e9a842be4e 100644 --- a/packages/core/upload/admin/src/hooks/useEditFolder.js +++ b/packages/core/upload/admin/src/hooks/useEditFolder.js @@ -8,14 +8,14 @@ const editFolderRequest = ({ attrs, id }) => { const method = isEditing ? 'put' : 'post'; const url = getRequestUrl(`folders/${id ?? ''}`); - return axiosInstance[method](url, attrs).then(res => res.data); + return axiosInstance[method](url, attrs).then((res) => res.data); }; export const useEditFolder = () => { const queryClient = useQueryClient(); const mutation = useMutation((...args) => editFolderRequest(...args), { - onSuccess: () => { + onSuccess() { queryClient.refetchQueries([pluginId, 'folders'], { active: true }); queryClient.refetchQueries([pluginId, 'folder', 'structure'], { active: true }); }, diff --git a/packages/core/upload/admin/src/hooks/useFolderStructure.js b/packages/core/upload/admin/src/hooks/useFolderStructure.js index 4aab86e76b..18e339c2fe 100644 --- a/packages/core/upload/admin/src/hooks/useFolderStructure.js +++ b/packages/core/upload/admin/src/hooks/useFolderStructure.js @@ -19,7 +19,7 @@ export const useFolderStructure = ({ enabled = true } = {}) => { data: { data }, } = await axiosInstance.get(dataRequestURL); - const children = data.map(f => recursiveRenameKeys(f, key => FIELD_MAPPING?.[key] ?? key)); + const children = data.map((f) => recursiveRenameKeys(f, (key) => FIELD_MAPPING?.[key] ?? key)); return [ { diff --git a/packages/core/upload/admin/src/hooks/useModalQueryParams.js b/packages/core/upload/admin/src/hooks/useModalQueryParams.js index 2fd430a2ac..8ceff7e208 100644 --- a/packages/core/upload/admin/src/hooks/useModalQueryParams.js +++ b/packages/core/upload/admin/src/hooks/useModalQueryParams.js @@ -3,7 +3,7 @@ import { useTracking } from '@strapi/helper-plugin'; import { stringify } from 'qs'; -const useModalQueryParams = initialState => { +const useModalQueryParams = (initialState) => { const { trackUsage } = useTracking(); const [queryObject, setQueryObject] = useState({ page: 1, @@ -15,37 +15,37 @@ const useModalQueryParams = initialState => { ...initialState, }); - const handleChangeFilters = nextFilters => { + const handleChangeFilters = (nextFilters) => { trackUsage('didFilterMediaLibraryElements', { location: 'content-manager', filter: Object.keys(nextFilters[nextFilters.length - 1])[0], }); - setQueryObject(prev => ({ ...prev, page: 1, filters: { $and: nextFilters } })); + setQueryObject((prev) => ({ ...prev, page: 1, filters: { $and: nextFilters } })); }; - const handleChangePageSize = pageSize => { - setQueryObject(prev => ({ ...prev, pageSize: parseInt(pageSize, 10), page: 1 })); + const handleChangePageSize = (pageSize) => { + setQueryObject((prev) => ({ ...prev, pageSize: parseInt(pageSize, 10), page: 1 })); }; - const handeChangePage = page => { - setQueryObject(prev => ({ ...prev, page })); + const handeChangePage = (page) => { + setQueryObject((prev) => ({ ...prev, page })); }; - const handleChangeSort = sort => { + const handleChangeSort = (sort) => { trackUsage('didSortMediaLibraryElements', { location: 'content-manager', sort, }); - setQueryObject(prev => ({ ...prev, sort })); + setQueryObject((prev) => ({ ...prev, sort })); }; - const handleChangeSearch = _q => { + const handleChangeSearch = (_q) => { if (_q) { - setQueryObject(prev => ({ ...prev, _q, page: 1 })); + setQueryObject((prev) => ({ ...prev, _q, page: 1 })); } else { const newState = { page: 1 }; - Object.keys(queryObject).forEach(key => { + Object.keys(queryObject).forEach((key) => { if (!['page', '_q'].includes(key)) { newState[key] = queryObject[key]; } @@ -55,8 +55,8 @@ const useModalQueryParams = initialState => { } }; - const handleChangeFolder = folder => { - setQueryObject(prev => ({ ...prev, folder: folder ?? null })); + const handleChangeFolder = (folder) => { + setQueryObject((prev) => ({ ...prev, folder: folder ?? null })); }; return [ diff --git a/packages/core/upload/admin/src/hooks/useRemoveAsset.js b/packages/core/upload/admin/src/hooks/useRemoveAsset.js index c14bba9302..cb8395784a 100644 --- a/packages/core/upload/admin/src/hooks/useRemoveAsset.js +++ b/packages/core/upload/admin/src/hooks/useRemoveAsset.js @@ -4,12 +4,12 @@ import { useNotification } from '@strapi/helper-plugin'; import { deleteRequest } from '../utils/deleteRequest'; import pluginId from '../pluginId'; -export const useRemoveAsset = onSuccess => { +export const useRemoveAsset = (onSuccess) => { const toggleNotification = useNotification(); const queryClient = useQueryClient(); - const mutation = useMutation(assetId => deleteRequest('files', assetId), { - onSuccess: () => { + const mutation = useMutation((assetId) => deleteRequest('files', assetId), { + onSuccess() { queryClient.refetchQueries([pluginId, 'assets'], { active: true }); queryClient.refetchQueries([pluginId, 'asset-count'], { active: true }); @@ -23,12 +23,12 @@ export const useRemoveAsset = onSuccess => { onSuccess(); }, - onError: error => { + onError(error) { toggleNotification({ type: 'warning', message: error.message }); }, }); - const removeAsset = assetId => mutation.mutate(assetId); + const removeAsset = (assetId) => mutation.mutate(assetId); return { ...mutation, removeAsset }; }; diff --git a/packages/core/upload/admin/src/hooks/useUpload.js b/packages/core/upload/admin/src/hooks/useUpload.js index 78d753aaea..d05f80e3df 100644 --- a/packages/core/upload/admin/src/hooks/useUpload.js +++ b/packages/core/upload/admin/src/hooks/useUpload.js @@ -33,7 +33,7 @@ const uploadAsset = (asset, folderId, cancelToken, onProgress) => { onUploadProgress({ total, loaded }) { onProgress((loaded / total) * 100); }, - }).then(res => res.data); + }).then((res) => res.data); }; export const useUpload = () => { @@ -47,7 +47,7 @@ export const useUpload = () => { return uploadAsset(asset, folderId, tokenRef.current, setProgress); }, { - onSuccess: () => { + onSuccess() { queryClient.refetchQueries([pluginId, 'assets'], { active: true }); queryClient.refetchQueries([pluginId, 'asset-count'], { active: true }); }, diff --git a/packages/core/upload/admin/src/hooks/utils/rename-keys.js b/packages/core/upload/admin/src/hooks/utils/rename-keys.js index 7b94e3925d..507692897c 100644 --- a/packages/core/upload/admin/src/hooks/utils/rename-keys.js +++ b/packages/core/upload/admin/src/hooks/utils/rename-keys.js @@ -1,8 +1,9 @@ export const recursiveRenameKeys = (obj, fn) => Object.fromEntries( Object.entries(obj).map(([key, value]) => { - const getValue = v => (typeof v === 'object' && v !== null ? recursiveRenameKeys(v, fn) : v); + const getValue = (v) => + typeof v === 'object' && v !== null ? recursiveRenameKeys(v, fn) : v; - return [fn(key), Array.isArray(value) ? value.map(val => getValue(val)) : getValue(value)]; + return [fn(key), Array.isArray(value) ? value.map((val) => getValue(val)) : getValue(value)]; }) ); diff --git a/packages/core/upload/admin/src/hooks/utils/tests/rename-keys.test.js b/packages/core/upload/admin/src/hooks/utils/tests/rename-keys.test.js index d382e6dffa..37c1077fc8 100644 --- a/packages/core/upload/admin/src/hooks/utils/tests/rename-keys.test.js +++ b/packages/core/upload/admin/src/hooks/utils/tests/rename-keys.test.js @@ -18,7 +18,7 @@ const FIXTURE = { describe('recursiveRenameKeys', () => { test('does rename keys', () => { expect( - recursiveRenameKeys(FIXTURE, key => { + recursiveRenameKeys(FIXTURE, (key) => { switch (key) { case 'foo': return 'bam'; diff --git a/packages/core/upload/admin/src/index.js b/packages/core/upload/admin/src/index.js index 42b6f62200..768c3c49a9 100644 --- a/packages/core/upload/admin/src/index.js +++ b/packages/core/upload/admin/src/index.js @@ -25,7 +25,7 @@ export default { defaultMessage: 'Media Library', }, permissions: pluginPermissions.main, - Component: async () => { + async Component() { const component = await import(/* webpackChunkName: "upload" */ './pages/App'); return component; @@ -48,7 +48,7 @@ export default { defaultMessage: 'Media Library', }, to: '/settings/media-library', - Component: async () => { + async Component() { const component = await import( /* webpackChunkName: "upload-settings" */ './pages/SettingsPage' ); @@ -60,7 +60,7 @@ export default { }, async registerTrads({ locales }) { const importedTrads = await Promise.all( - locales.map(locale => { + locales.map((locale) => { return import( /* webpackChunkName: "upload-translation-[request]" */ `./translations/${locale}.json` ) diff --git a/packages/core/upload/admin/src/pages/App/MediaLibrary.js b/packages/core/upload/admin/src/pages/App/MediaLibrary.js index 554aec0cd0..65c523c8ff 100644 --- a/packages/core/upload/admin/src/pages/App/MediaLibrary.js +++ b/packages/core/upload/admin/src/pages/App/MediaLibrary.js @@ -72,12 +72,20 @@ export const MediaLibrary = () => { const [{ query }, setQuery] = useQueryParams(); const isFiltering = Boolean(query._q || query.filters); - const { data: assetsData, isLoading: assetsLoading, errors: assetsError } = useAssets({ + const { + data: assetsData, + isLoading: assetsLoading, + errors: assetsError, + } = useAssets({ skipWhen: !canRead, query, }); - const { data: folders, isLoading: foldersLoading, errors: foldersError } = useFolders({ + const { + data: folders, + isLoading: foldersLoading, + errors: foldersError, + } = useFolders({ enabled: canRead && assetsData?.pagination?.page === 1 && !containsAssetFilter(query), query, }); @@ -104,7 +112,7 @@ export const MediaLibrary = () => { const [assetToEdit, setAssetToEdit] = useState(undefined); const [folderToEdit, setFolderToEdit] = useState(undefined); const [selected, { selectOne, selectAll }] = useSelectionState(['type', 'id'], []); - const toggleUploadAssetDialog = () => setShowUploadAssetDialog(prev => !prev); + const toggleUploadAssetDialog = () => setShowUploadAssetDialog((prev) => !prev); const toggleEditFolderDialog = ({ created = false } = {}) => { // folders are only displayed on the first page, therefore // we have to navigate the user to that page, in case a folder @@ -116,10 +124,10 @@ export const MediaLibrary = () => { }); } - setShowEditFolderDialog(prev => !prev); + setShowEditFolderDialog((prev) => !prev); }; - const handleChangeSort = value => { + const handleChangeSort = (value) => { trackUsage('didSortMediaLibraryElements', { location: 'upload', sort: value, @@ -127,12 +135,12 @@ export const MediaLibrary = () => { setQuery({ sort: value }); }; - const handleEditFolder = folder => { + const handleEditFolder = (folder) => { setFolderToEdit(folder); setShowEditFolderDialog(true); }; - const handleEditFolderClose = payload => { + const handleEditFolderClose = (payload) => { setFolderToEdit(null); toggleEditFolderDialog(payload); @@ -178,13 +186,13 @@ export const MediaLibrary = () => { (assetCount > 0 || folderCount > 0) && selected.length === assetCount + folderCount } - onChange={e => { + onChange={(e) => { if (e.target.checked) { trackUsage('didSelectAllMediaLibraryElements'); } selectAll([ - ...assets.map(asset => ({ ...asset, type: 'asset' })), - ...folders.map(folder => ({ ...folder, type: 'folder' })), + ...assets.map((asset) => ({ ...asset, type: 'asset' })), + ...folders.map((folder) => ({ ...folder, type: 'folder' })), ]); }} /> @@ -240,10 +248,10 @@ export const MediaLibrary = () => { '' } > - {folders.map(folder => { + {folders.map((folder) => { const selectedFolders = selected.filter(({ type }) => type === 'folder'); const isSelected = !!selectedFolders.find( - currentFolder => currentFolder.id === folder.id + (currentFolder) => currentFolder.id === folder.id ); const url = getFolderURL(pathname, query, folder); 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 8240b3db0c..4c1eddd0fc 100644 --- a/packages/core/upload/admin/src/pages/App/components/Filters.js +++ b/packages/core/upload/admin/src/pages/App/components/Filters.js @@ -15,13 +15,13 @@ export const Filters = () => { const [{ query }, setQuery] = useQueryParams(); const filters = query?.filters?.$and || []; - const toggleFilter = () => setVisible(prev => !prev); + const toggleFilter = () => setVisible((prev) => !prev); - const handleRemoveFilter = nextFilters => { + const handleRemoveFilter = (nextFilters) => { setQuery({ filters: { $and: nextFilters }, page: 1 }); }; - const handleSubmit = filters => { + const handleSubmit = (filters) => { trackUsage('didFilterMediaLibraryElements', { location: 'content-manager', filter: Object.keys(filters[filters.length - 1])[0], 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 f0e71b160b..90f98bd53f 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 @@ -5,7 +5,7 @@ import { IntlProvider } from 'react-intl'; import { EmptyOrNoPermissions } from '../EmptyOrNoPermissions'; -const setup = props => +const setup = (props) => render( diff --git a/packages/core/upload/admin/src/pages/App/tests/BulkActions.test.js b/packages/core/upload/admin/src/pages/App/tests/BulkActions.test.js index cc3134534e..f87590f93b 100644 --- a/packages/core/upload/admin/src/pages/App/tests/BulkActions.test.js +++ b/packages/core/upload/admin/src/pages/App/tests/BulkActions.test.js @@ -61,8 +61,8 @@ describe('BulkActions', () => { const { queryByText } = setup({ onSuccess: jest.fn(), selected: [ - ...[...Array(ASSET_COUNT).keys()].map(index => ({ id: index, type: 'asset' })), - ...[...Array(FOLDER_COUNT).keys()].map(index => ({ id: index, type: 'folder' })), + ...[...Array(ASSET_COUNT).keys()].map((index) => ({ id: index, type: 'asset' })), + ...[...Array(FOLDER_COUNT).keys()].map((index) => ({ id: index, type: 'folder' })), ], }); diff --git a/packages/core/upload/admin/src/pages/App/tests/Header.test.js b/packages/core/upload/admin/src/pages/App/tests/Header.test.js index c81eaa7ef0..fe118df648 100644 --- a/packages/core/upload/admin/src/pages/App/tests/Header.test.js +++ b/packages/core/upload/admin/src/pages/App/tests/Header.test.js @@ -42,7 +42,7 @@ const FIXTURE_FOLDER = { }, }; -const setup = props => { +const setup = (props) => { const withDefaults = { ...props, assetCount: 2, diff --git a/packages/core/upload/admin/src/pages/App/tests/MediaLibrary.test.js b/packages/core/upload/admin/src/pages/App/tests/MediaLibrary.test.js index e8680e4cc5..7e83d471b3 100644 --- a/packages/core/upload/admin/src/pages/App/tests/MediaLibrary.test.js +++ b/packages/core/upload/admin/src/pages/App/tests/MediaLibrary.test.js @@ -2,7 +2,7 @@ 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 { useSelectionState, useQueryParams, TrackingContext } from '@strapi/helper-plugin'; +import { useSelectionState, useQueryParams, TrackingProvider } from '@strapi/helper-plugin'; import { MemoryRouter } from 'react-router-dom'; import { IntlProvider } from 'react-intl'; @@ -68,7 +68,7 @@ jest.mock('@strapi/helper-plugin', () => ({ })); jest.mock('../../../utils', () => ({ ...jest.requireActual('../../../utils'), - getTrad: x => x, + getTrad: (x) => x, })); const queryClient = new QueryClient({ @@ -84,13 +84,13 @@ const renderML = () => renderTL( - + - + ); @@ -176,7 +176,7 @@ describe('Media library homepage', () => { 'name:DESC', 'updatedAt:DESC', 'updatedAt:ASC', - ].forEach(sortKey => { + ].forEach((sortKey) => { it(`modifies the URL with the according params: ${sortKey}`, async () => { const setQueryMock = jest.fn(); useQueryParams.mockReturnValueOnce([{ rawQuery: '', query: {} }, setQueryMock]); diff --git a/packages/core/upload/admin/src/pages/SettingsPage/index.js b/packages/core/upload/admin/src/pages/SettingsPage/index.js index c8b7faa9d0..c7c6cc027c 100644 --- a/packages/core/upload/admin/src/pages/SettingsPage/index.js +++ b/packages/core/upload/admin/src/pages/SettingsPage/index.js @@ -73,7 +73,7 @@ export const SettingsPage = () => { const isSaveButtonDisabled = isEqual(initialData, modifiedData); - const handleSubmit = async e => { + const handleSubmit = async (e) => { e.preventDefault(); if (isSaveButtonDisabled) { @@ -186,7 +186,7 @@ export const SettingsPage = () => { id: 'app.components.ToggleCheckbox.on-label', defaultMessage: 'On', })} - onChange={e => { + onChange={(e) => { handleChange({ target: { name: 'responsiveDimensions', value: e.target.checked }, }); @@ -216,7 +216,7 @@ export const SettingsPage = () => { id: 'app.components.ToggleCheckbox.on-label', defaultMessage: 'On', })} - onChange={e => { + onChange={(e) => { handleChange({ target: { name: 'sizeOptimization', value: e.target.checked }, }); @@ -246,7 +246,7 @@ export const SettingsPage = () => { id: 'app.components.ToggleCheckbox.on-label', defaultMessage: 'On', })} - onChange={e => { + onChange={(e) => { handleChange({ target: { name: 'autoOrientation', value: e.target.checked }, }); diff --git a/packages/core/upload/admin/src/pages/SettingsPage/init.js b/packages/core/upload/admin/src/pages/SettingsPage/init.js index 01b755b049..f10fc2be6e 100644 --- a/packages/core/upload/admin/src/pages/SettingsPage/init.js +++ b/packages/core/upload/admin/src/pages/SettingsPage/init.js @@ -1,4 +1,4 @@ -const init = initialState => { +const init = (initialState) => { return initialState; }; diff --git a/packages/core/upload/admin/src/pages/SettingsPage/reducer.js b/packages/core/upload/admin/src/pages/SettingsPage/reducer.js index 297c1afe28..7659316e2a 100644 --- a/packages/core/upload/admin/src/pages/SettingsPage/reducer.js +++ b/packages/core/upload/admin/src/pages/SettingsPage/reducer.js @@ -20,7 +20,7 @@ const initialState = { const reducer = (state, action) => // eslint-disable-next-line consistent-return - produce(state, drafState => { + produce(state, (drafState) => { switch (action.type) { case 'CANCEL_CHANGES': { drafState.modifiedData = state.initialData; diff --git a/packages/core/upload/admin/src/translations/tests/plural.test.js b/packages/core/upload/admin/src/translations/tests/plural.test.js index 2432a67036..a02247e0f5 100644 --- a/packages/core/upload/admin/src/translations/tests/plural.test.js +++ b/packages/core/upload/admin/src/translations/tests/plural.test.js @@ -3,7 +3,7 @@ const translations = require('../en.json'); describe('translations', () => { describe('plural syntax', () => { it('should avoid .plural/.singular syntax', () => { - Object.keys(translations).forEach(translationKey => { + Object.keys(translations).forEach((translationKey) => { const keyParts = translationKey.split('.'); const lastKeyPart = keyParts.pop(); diff --git a/packages/core/upload/admin/src/utils/axiosInstance.js b/packages/core/upload/admin/src/utils/axiosInstance.js index 78b0aae814..8abf430c89 100644 --- a/packages/core/upload/admin/src/utils/axiosInstance.js +++ b/packages/core/upload/admin/src/utils/axiosInstance.js @@ -6,7 +6,7 @@ const instance = axios.create({ }); instance.interceptors.request.use( - async config => { + async (config) => { config.headers = { Authorization: `Bearer ${auth.getToken()}`, Accept: 'application/json', @@ -15,14 +15,14 @@ instance.interceptors.request.use( return config; }, - error => { + (error) => { Promise.reject(error); } ); instance.interceptors.response.use( - response => response, - error => { + (response) => response, + (error) => { // whatever you want to do with the error if (error.response?.status === 401) { auth.clearAppStorage(); diff --git a/packages/core/upload/admin/src/utils/containsAssetFilter.js b/packages/core/upload/admin/src/utils/containsAssetFilter.js index e92be19ae2..cbb7d6b29f 100644 --- a/packages/core/upload/admin/src/utils/containsAssetFilter.js +++ b/packages/core/upload/admin/src/utils/containsAssetFilter.js @@ -1,18 +1,18 @@ -const containsMimeTypeFilter = query => { +const containsMimeTypeFilter = (query) => { const filters = query?.filters?.$and; if (!filters) { return false; } - const result = filters.find(filter => { + const result = filters.find((filter) => { return Object.keys(filter).includes('mime'); }); return !!result; }; -const containsAssetFilter = query => { +const containsAssetFilter = (query) => { return containsMimeTypeFilter(query); }; diff --git a/packages/core/upload/admin/src/utils/downloadFile.js b/packages/core/upload/admin/src/utils/downloadFile.js index e5fda239fa..de9b2ff982 100644 --- a/packages/core/upload/admin/src/utils/downloadFile.js +++ b/packages/core/upload/admin/src/utils/downloadFile.js @@ -5,7 +5,7 @@ export const downloadFile = (url, fileName) => { url, method: 'GET', responseType: 'blob', - }).then(response => { + }).then((response) => { const url = window.URL.createObjectURL(new Blob([response.data])); const link = document.createElement('a'); diff --git a/packages/core/upload/admin/src/utils/formatDuration.js b/packages/core/upload/admin/src/utils/formatDuration.js index 710e0b6f5f..97bbe26aa1 100644 --- a/packages/core/upload/admin/src/utils/formatDuration.js +++ b/packages/core/upload/admin/src/utils/formatDuration.js @@ -1,8 +1,8 @@ import { intervalToDuration } from 'date-fns'; -const zeroPad = num => String(num).padStart(2, '0'); +const zeroPad = (num) => String(num).padStart(2, '0'); -export const formatDuration = durationInSecond => { +export const formatDuration = (durationInSecond) => { const duration = intervalToDuration({ start: 0, end: durationInSecond * 1000 }); return `${zeroPad(duration.hours)}:${zeroPad(duration.minutes)}:${zeroPad(duration.seconds)}`; diff --git a/packages/core/upload/admin/src/utils/getAllowedFiles.js b/packages/core/upload/admin/src/utils/getAllowedFiles.js index a1c15e3a8a..957424db77 100644 --- a/packages/core/upload/admin/src/utils/getAllowedFiles.js +++ b/packages/core/upload/admin/src/utils/getAllowedFiles.js @@ -9,7 +9,7 @@ import toSingularTypes from './toSingularTypes'; const getAllowedFiles = (pluralTypes, files) => { const singularTypes = toSingularTypes(pluralTypes); - const allowedFiles = files.filter(file => { + const allowedFiles = files.filter((file) => { const fileType = file.mime.split('/')[0]; if (singularTypes.includes('file') && !['video', 'image', 'audio'].includes(fileType)) { diff --git a/packages/core/upload/admin/src/utils/getBreadcrumbDataCM.js b/packages/core/upload/admin/src/utils/getBreadcrumbDataCM.js index 4326266637..4947951c87 100644 --- a/packages/core/upload/admin/src/utils/getBreadcrumbDataCM.js +++ b/packages/core/upload/admin/src/utils/getBreadcrumbDataCM.js @@ -1,6 +1,6 @@ import getTrad from './getTrad'; -const getBreadcrumbDataML = folder => { +const getBreadcrumbDataML = (folder) => { let data = [ { id: null, diff --git a/packages/core/upload/admin/src/utils/getFolderParents.js b/packages/core/upload/admin/src/utils/getFolderParents.js index 273206e7fb..c4acf5d937 100644 --- a/packages/core/upload/admin/src/utils/getFolderParents.js +++ b/packages/core/upload/admin/src/utils/getFolderParents.js @@ -3,7 +3,7 @@ import flattenTree from '../components/SelectTree/utils/flattenTree'; const getFolderParents = (folders, currentFolderId) => { const parents = []; const flatFolders = flattenTree(folders); - const currentFolder = flatFolders.find(folder => folder.value === currentFolderId); + const currentFolder = flatFolders.find((folder) => folder.value === currentFolderId); if (!currentFolder) { return []; diff --git a/packages/core/upload/admin/src/utils/getRequestUrl.js b/packages/core/upload/admin/src/utils/getRequestUrl.js index 24b7747468..97fa474fe2 100644 --- a/packages/core/upload/admin/src/utils/getRequestUrl.js +++ b/packages/core/upload/admin/src/utils/getRequestUrl.js @@ -1,6 +1,6 @@ import pluginId from '../pluginId'; -const getRequestUrl = path => { +const getRequestUrl = (path) => { if (path.startsWith('/')) { return `/${pluginId}${path}`; } diff --git a/packages/core/upload/admin/src/utils/getTrad.js b/packages/core/upload/admin/src/utils/getTrad.js index a2b8632a8d..d0a071b26a 100644 --- a/packages/core/upload/admin/src/utils/getTrad.js +++ b/packages/core/upload/admin/src/utils/getTrad.js @@ -1,5 +1,5 @@ import pluginId from '../pluginId'; -const getTrad = id => `${pluginId}.${id}`; +const getTrad = (id) => `${pluginId}.${id}`; export default getTrad; diff --git a/packages/core/upload/admin/src/utils/toSingularTypes.js b/packages/core/upload/admin/src/utils/toSingularTypes.js index a6d5fe3317..00897bef98 100644 --- a/packages/core/upload/admin/src/utils/toSingularTypes.js +++ b/packages/core/upload/admin/src/utils/toSingularTypes.js @@ -3,12 +3,12 @@ * @param {Object[]} types * @returns Object[] */ -const toSingularTypes = types => { +const toSingularTypes = (types) => { if (!types) { return []; } - return types.map(type => type.substring(0, type.length - 1)); + return types.map((type) => type.substring(0, type.length - 1)); }; export default toSingularTypes; diff --git a/packages/core/upload/admin/src/utils/typeFromMime.js b/packages/core/upload/admin/src/utils/typeFromMime.js index ac569314ad..2e0bc7678d 100644 --- a/packages/core/upload/admin/src/utils/typeFromMime.js +++ b/packages/core/upload/admin/src/utils/typeFromMime.js @@ -1,6 +1,6 @@ import { AssetType } from '../constants'; -export const typeFromMime = mime => { +export const typeFromMime = (mime) => { if (mime.includes(AssetType.Image)) { return AssetType.Image; } diff --git a/packages/core/upload/admin/src/utils/urlYupSchema.js b/packages/core/upload/admin/src/utils/urlYupSchema.js index a3863bdb88..5ba49dc90c 100644 --- a/packages/core/upload/admin/src/utils/urlYupSchema.js +++ b/packages/core/upload/admin/src/utils/urlYupSchema.js @@ -1,4 +1,3 @@ -/* eslint-disable no-template-curly-in-string */ import * as yup from 'yup'; import { translatedErrors as errorsTrads } from '@strapi/helper-plugin'; import getTrad from './getTrad'; @@ -24,7 +23,7 @@ export const urlSchema = yup.object().shape({ }); } - const filtered = urls.filter(val => { + const filtered = urls.filter((val) => { try { // eslint-disable-next-line no-new new URL(val); diff --git a/packages/core/upload/admin/src/utils/urlsToAssets.js b/packages/core/upload/admin/src/utils/urlsToAssets.js index f680bbb367..f99fa914f2 100644 --- a/packages/core/upload/admin/src/utils/urlsToAssets.js +++ b/packages/core/upload/admin/src/utils/urlsToAssets.js @@ -2,14 +2,14 @@ import axios from 'axios'; import { AssetSource } from '../constants'; import { typeFromMime } from './typeFromMime'; -export const urlsToAssets = async urls => { - const assetPromises = urls.map(url => +export const urlsToAssets = async (urls) => { + const assetPromises = urls.map((url) => axios .get(url, { responseType: 'blob', timeout: 60000, }) - .then(res => { + .then((res) => { const loadedFile = new File([res.data], res.config.url, { type: res.headers['content-type'], }); @@ -25,7 +25,7 @@ export const urlsToAssets = async urls => { // Retrieve the assets metadata const assetsResults = await Promise.all(assetPromises); - const assets = assetsResults.map(fullFilledAsset => ({ + const assets = assetsResults.map((fullFilledAsset) => ({ source: AssetSource.Url, name: fullFilledAsset.name, type: typeFromMime(fullFilledAsset.mime), diff --git a/packages/core/upload/jest.config.front.js b/packages/core/upload/jest.config.front.js index de8b352da2..4369690547 100644 --- a/packages/core/upload/jest.config.front.js +++ b/packages/core/upload/jest.config.front.js @@ -1,7 +1,7 @@ 'use strict'; const baseConfig = require('../../../jest.base-config.front'); -const pkg = require('./package'); +const pkg = require('./package.json'); module.exports = { ...baseConfig, diff --git a/packages/core/upload/jest.config.js b/packages/core/upload/jest.config.js index 636254a96c..f6c9937187 100644 --- a/packages/core/upload/jest.config.js +++ b/packages/core/upload/jest.config.js @@ -1,7 +1,7 @@ 'use strict'; const baseConfig = require('../../../jest.base-config'); -const pkg = require('./package'); +const pkg = require('./package.json'); module.exports = { ...baseConfig, diff --git a/packages/core/upload/server/controllers/admin-folder-file.js b/packages/core/upload/server/controllers/admin-folder-file.js index 5584aff281..c17a7ba739 100644 --- a/packages/core/upload/server/controllers/admin-folder-file.js +++ b/packages/core/upload/server/controllers/admin-folder-file.js @@ -112,13 +112,13 @@ module.exports = { const fileTable = strapi.getModel(FILE_MODEL_UID).collectionName; const folderTable = strapi.getModel(FOLDER_MODEL_UID).collectionName; - const folderPathColName = strapi.db.metadata.get(FILE_MODEL_UID).attributes.folderPath - .columnName; + const folderPathColName = + strapi.db.metadata.get(FILE_MODEL_UID).attributes.folderPath.columnName; const pathColName = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.path.columnName; if (existingFolders.length > 0) { // update folders' parent relation - const joinTable = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.parent.joinTable; + const { joinTable } = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.parent; await strapi.db .queryBuilder(joinTable.name) .transacting(trx) @@ -131,7 +131,7 @@ module.exports = { .queryBuilder(joinTable.name) .transacting(trx) .insert( - existingFolders.map(folder => ({ + existingFolders.map((folder) => ({ [joinTable.inverseJoinColumn.name]: destinationFolderId, [joinTable.joinColumn.name]: folder.id, })) @@ -199,7 +199,7 @@ module.exports = { .queryBuilder(fileJoinTable.name) .transacting(trx) .insert( - existingFiles.map(file => ({ + existingFiles.map((file) => ({ [fileJoinTable.inverseJoinColumn.name]: destinationFolderId, [fileJoinTable.joinColumn.name]: file.id, })) diff --git a/packages/core/upload/server/controllers/validation/admin/folder-file.js b/packages/core/upload/server/controllers/validation/admin/folder-file.js index 72bb40e34c..67bb8e823e 100644 --- a/packages/core/upload/server/controllers/validation/admin/folder-file.js +++ b/packages/core/upload/server/controllers/validation/admin/folder-file.js @@ -30,7 +30,7 @@ const validateStructureMoveManyFoldersFilesSchema = yup const validateDuplicatesMoveManyFoldersFilesSchema = yup .object() - .test('are-folders-unique', 'some folders already exist', async function(value) { + .test('are-folders-unique', 'some folders already exist', async function (value) { const { folderIds, destinationFolderId } = value; if (isEmpty(folderIds)) return true; @@ -58,7 +58,7 @@ const validateMoveFoldersNotInsideThemselvesSchema = yup .test( 'dont-move-inside-self', 'folders cannot be moved inside themselves or one of its children', - async function(value) { + async function (value) { const { folderIds, destinationFolderId } = value; if (destinationFolderId === null || isEmpty(folderIds)) return true; @@ -75,8 +75,8 @@ const validateMoveFoldersNotInsideThemselvesSchema = yup }); const unmovableFoldersNames = folders - .filter(folder => destinationFolder.path.startsWith(folder.path)) - .map(f => f.name); + .filter((folder) => destinationFolder.path.startsWith(folder.path)) + .map((f) => f.name); if (unmovableFoldersNames.length > 0) { return this.createError({ message: `folders cannot be moved inside themselves or one of its children: ${unmovableFoldersNames.join( diff --git a/packages/core/upload/server/controllers/validation/admin/folder.js b/packages/core/upload/server/controllers/validation/admin/folder.js index 660d23c1d0..540740e8cc 100644 --- a/packages/core/upload/server/controllers/validation/admin/folder.js +++ b/packages/core/upload/server/controllers/validation/admin/folder.js @@ -9,8 +9,8 @@ const { folderExists } = require('./utils'); const NO_SLASH_REGEX = /^[^/]+$/; const NO_SPACES_AROUND = /^(?! ).+(? - async function(name) { +const isNameUniqueInFolder = (id) => + async function (name) { const { exists } = getService('folder'); const filters = { name, parent: this.parent.parent || null }; if (id) { @@ -44,7 +44,7 @@ const validateCreateFolderSchema = yup .noUnknown() .required(); -const validateUpdateFolderSchema = id => +const validateUpdateFolderSchema = (id) => yup .object() .shape({ @@ -62,28 +62,30 @@ const validateUpdateFolderSchema = id => .strapiID() .nullable() .test('folder-exists', 'parent folder does not exist', folderExists) - .test('dont-move-inside-self', 'folder cannot be moved inside itself', async function( - parent - ) { - if (isNil(parent)) return true; + .test( + 'dont-move-inside-self', + 'folder cannot be moved inside itself', + async function (parent) { + if (isNil(parent)) return true; - const destinationFolder = await strapi.entityService.findOne(FOLDER_MODEL_UID, parent, { - fields: ['path'], - }); + const destinationFolder = await strapi.entityService.findOne(FOLDER_MODEL_UID, parent, { + fields: ['path'], + }); - const currentFolder = await strapi.entityService.findOne(FOLDER_MODEL_UID, id, { - fields: ['path'], - }); + const currentFolder = await strapi.entityService.findOne(FOLDER_MODEL_UID, id, { + fields: ['path'], + }); - if (!destinationFolder || !currentFolder) return true; + if (!destinationFolder || !currentFolder) return true; - return !destinationFolder.path.startsWith(currentFolder.path); - }), + return !destinationFolder.path.startsWith(currentFolder.path); + } + ), }) .noUnknown() .required(); module.exports = { validateCreateFolder: validateYupSchema(validateCreateFolderSchema), - validateUpdateFolder: id => validateYupSchema(validateUpdateFolderSchema(id)), + validateUpdateFolder: (id) => validateYupSchema(validateUpdateFolderSchema(id)), }; diff --git a/packages/core/upload/server/controllers/validation/admin/upload.js b/packages/core/upload/server/controllers/validation/admin/upload.js index 2dff0a0725..0d47663b04 100644 --- a/packages/core/upload/server/controllers/validation/admin/upload.js +++ b/packages/core/upload/server/controllers/validation/admin/upload.js @@ -11,7 +11,7 @@ const fileInfoSchema = yup.object({ folder: yup .strapiID() .nullable() - .test('folder-exists', 'the folder does not exist', async folderId => { + .test('folder-exists', 'the folder does not exist', async (folderId) => { if (isNil(folderId)) { return true; } diff --git a/packages/core/upload/server/controllers/validation/admin/utils.js b/packages/core/upload/server/controllers/validation/admin/utils.js index 3834f598c6..a6c30bfc4e 100644 --- a/packages/core/upload/server/controllers/validation/admin/utils.js +++ b/packages/core/upload/server/controllers/validation/admin/utils.js @@ -3,7 +3,7 @@ const { isNil } = require('lodash/fp'); const { getService } = require('../../../utils'); -const folderExists = async folderId => { +const folderExists = async (folderId) => { if (isNil(folderId)) { return true; } diff --git a/packages/core/upload/server/graphql.js b/packages/core/upload/server/graphql.js index 2fc6e7b850..cdf5100feb 100644 --- a/packages/core/upload/server/graphql.js +++ b/packages/core/upload/server/graphql.js @@ -158,7 +158,7 @@ module.exports = ({ strapi }) => { const apiUploadFolder = await apiUploadFolderService.getAPIUploadFolder(); const files = await Promise.all( - uploads.map(upload => + uploads.map((upload) => formatFile( upload, { folder: apiUploadFolder.id }, @@ -170,10 +170,10 @@ module.exports = ({ strapi }) => { const uploadService = getUploadService('upload'); const uploadedFiles = await Promise.all( - files.map(file => uploadService.uploadFileAndPersist(file, {})) + files.map((file) => uploadService.uploadFileAndPersist(file, {})) ); - sanitizedEntities = uploadedFiles.map(file => + sanitizedEntities = uploadedFiles.map((file) => toEntityResponse(file, { args, resourceUID: fileTypeName }) ); } finally { @@ -236,11 +236,11 @@ module.exports = ({ strapi }) => { types: [fileInfoInputType, mutations], resolversConfig: { // Use custom scopes for the upload file CRUD operations - ['Query.uploadFiles']: { auth: { scope: 'plugin::upload.content-api.find' } }, - ['Query.uploadFile']: { auth: { scope: 'plugin::upload.content-api.findOne' } }, - ['Mutation.createUploadFile']: { auth: { scope: 'plugin::upload.content-api.upload' } }, - ['Mutation.updateUploadFile']: { auth: { scope: 'plugin::upload.content-api.upload' } }, - ['Mutation.deleteUploadFile']: { auth: { scope: 'plugin::upload.content-api.destroy' } }, + 'Query.uploadFiles': { auth: { scope: 'plugin::upload.content-api.find' } }, + 'Query.uploadFile': { auth: { scope: 'plugin::upload.content-api.findOne' } }, + 'Mutation.createUploadFile': { auth: { scope: 'plugin::upload.content-api.upload' } }, + 'Mutation.updateUploadFile': { auth: { scope: 'plugin::upload.content-api.upload' } }, + 'Mutation.deleteUploadFile': { auth: { scope: 'plugin::upload.content-api.destroy' } }, [`Mutation.${UPLOAD_MUTATION_NAME}`]: { auth: { scope: 'plugin::upload.content-api.upload' }, diff --git a/packages/core/upload/server/middlewares/upload.js b/packages/core/upload/server/middlewares/upload.js index a9278df9be..7273f4d9f4 100644 --- a/packages/core/upload/server/middlewares/upload.js +++ b/packages/core/upload/server/middlewares/upload.js @@ -8,7 +8,7 @@ const koaStatic = require('koa-static'); * @param {{ strapi: import('@strapi/strapi').Strapi }} */ module.exports = ({ strapi }) => { - strapi.server.app.on('error', err => { + strapi.server.app.on('error', (err) => { if (err.code === 'EPIPE') { // when serving audio or video the browsers sometimes close the connection to go to range requests instead. // This causes koa to emit a write EPIPE error. We can ignore it. diff --git a/packages/core/upload/server/register.js b/packages/core/upload/server/register.js index fed690efbd..a93863306f 100644 --- a/packages/core/upload/server/register.js +++ b/packages/core/upload/server/register.js @@ -17,7 +17,7 @@ module.exports = async ({ strapi }) => { } }; -const createProvider = config => { +const createProvider = (config) => { const { providerOptions, actionOptions = {} } = config; const providerName = _.toLower(config.provider); @@ -61,7 +61,7 @@ const createProvider = config => { } const wrappedProvider = _.mapValues(providerInstance, (method, methodName) => { - return async function(file, options = actionOptions[methodName]) { + return async function (file, options = actionOptions[methodName]) { return providerInstance[methodName](file, options); }; }); diff --git a/packages/core/upload/server/services/__tests__/folder.test.js b/packages/core/upload/server/services/__tests__/folder.test.js index 6165931b00..c6308e2a7a 100644 --- a/packages/core/upload/server/services/__tests__/folder.test.js +++ b/packages/core/upload/server/services/__tests__/folder.test.js @@ -4,7 +4,7 @@ const { setPathIdAndPath } = require('../folder'); const folderUID = '1'; const rootPathRegex = /^\/[0-9]*$/i; -const folderPathRegex = new RegExp('^/' + folderUID + '/[0-9]*$', 'i'); +const folderPathRegex = new RegExp(`^/${folderUID}/[0-9]*$`, 'i'); describe('folder', () => { describe('setPathIdAndPath', () => { diff --git a/packages/core/upload/server/services/__tests__/metrics.js b/packages/core/upload/server/services/__tests__/metrics.js index 8bb0a2016e..b37220805b 100644 --- a/packages/core/upload/server/services/__tests__/metrics.js +++ b/packages/core/upload/server/services/__tests__/metrics.js @@ -4,7 +4,7 @@ const metricsService = require('../metrics'); // TODO: the matcher exists in jest@28 const closeTo = (expected, precision = 2) => ({ - asymmetricMatch: actual => Math.abs(expected - actual) < Math.pow(10, -precision) / 2, + asymmetricMatch: (actual) => Math.abs(expected - actual) < 10 ** -precision / 2, }); describe('metrics', () => { @@ -50,7 +50,8 @@ describe('metrics', () => { return { select() { return { - groupBy: () => folderLevels.map(info => ({ depth: info[0], occurence: info[1] })), + groupBy: () => + folderLevels.map((info) => ({ depth: info[0], occurence: info[1] })), }; }, }; @@ -62,17 +63,10 @@ describe('metrics', () => { const { computeMetrics } = metricsService({ strapi }); const results = await computeMetrics(); - const [ - assetNumber, - maxDepth, - averageDepth, - folderNumber, - averageDeviationDepth, - ] = expectedResults; + const [assetNumber, maxDepth, averageDepth, folderNumber, averageDeviationDepth] = + expectedResults; - expect( - raw - ).toHaveBeenCalledWith( + expect(raw).toHaveBeenCalledWith( 'LENGTH(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(??, ?, ?), ?, ?), ?, ?), ?, ?), ?, ?), ?, ?), ?, ?), ?, ?), ?, ?), ?, ?)) AS depth, COUNT(*) AS occurence', [ 'path', diff --git a/packages/core/upload/server/services/__tests__/upload/uploadImage.test.js b/packages/core/upload/server/services/__tests__/upload/uploadImage.test.js index 6a6e572df6..b3bdc193b2 100644 --- a/packages/core/upload/server/services/__tests__/upload/uploadImage.test.js +++ b/packages/core/upload/server/services/__tests__/upload/uploadImage.test.js @@ -13,7 +13,7 @@ const tmpWorkingDirectory = path.join(__dirname, './tmp'); function mockUploadProvider(uploadFunc, props) { const { responsiveDimensions = false } = props || {}; - const default_config = { + const defaultConfig = { plugin: { upload: { breakpoints: { @@ -26,7 +26,7 @@ function mockUploadProvider(uploadFunc, props) { global.strapi = { config: { - get: (path, defaultValue) => _.get(default_config, path, defaultValue), + get: (path, defaultValue) => _.get(defaultConfig, path, defaultValue), }, plugins: { upload: { @@ -44,7 +44,7 @@ function mockUploadProvider(uploadFunc, props) { }; } -const getFileData = filePath => ({ +const getFileData = (filePath) => ({ alternativeText: 'image.png', caption: 'image.png', ext: '.png', @@ -70,7 +70,7 @@ describe('Upload image', () => { }); test('Upload with thubmnail', async () => { - let fileData = getFileData(imageFilePath); + const fileData = getFileData(imageFilePath); const upload = jest.fn(); mockUploadProvider(upload); @@ -79,7 +79,7 @@ describe('Upload image', () => { }); test('Upload with responsive formats', async () => { - let fileData = getFileData(imageFilePath); + const fileData = getFileData(imageFilePath); const upload = jest.fn(); mockUploadProvider(upload, { responsiveDimensions: true }); diff --git a/packages/core/upload/server/services/file.js b/packages/core/upload/server/services/file.js index 77651c0661..e8543000df 100644 --- a/packages/core/upload/server/services/file.js +++ b/packages/core/upload/server/services/file.js @@ -4,7 +4,7 @@ const { FOLDER_MODEL_UID, FILE_MODEL_UID } = require('../constants'); const { getService } = require('../utils'); -const getFolderPath = async folderId => { +const getFolderPath = async (folderId) => { if (!folderId) return '/'; const parentFolder = await strapi.entityService.findOne(FOLDER_MODEL_UID, folderId); @@ -17,7 +17,7 @@ const deleteByIds = async (ids = []) => { .query(FILE_MODEL_UID) .findMany({ where: { id: { $in: ids } } }); - await Promise.all(filesToDelete.map(file => getService('upload').remove(file))); + await Promise.all(filesToDelete.map((file) => getService('upload').remove(file))); return filesToDelete; }; diff --git a/packages/core/upload/server/services/folder.js b/packages/core/upload/server/services/folder.js index ebc7092668..e6741f9b39 100644 --- a/packages/core/upload/server/services/folder.js +++ b/packages/core/upload/server/services/folder.js @@ -5,12 +5,8 @@ const { joinBy, setCreatorFields } = require('@strapi/utils'); const { FOLDER_MODEL_UID, FILE_MODEL_UID } = require('../constants'); const { getService } = require('../utils'); -const setPathIdAndPath = async folder => { - const { max } = await strapi.db - .queryBuilder(FOLDER_MODEL_UID) - .max('pathId') - .first() - .execute(); +const setPathIdAndPath = async (folder) => { + const { max } = await strapi.db.queryBuilder(FOLDER_MODEL_UID).max('pathId').first().execute(); const pathId = max + 1; let parentPath = '/'; @@ -58,16 +54,16 @@ const deleteByIds = async (ids = []) => { // delete files const filesToDelete = await strapi.db.query(FILE_MODEL_UID).findMany({ where: { - $or: pathsToDelete.map(path => ({ folderPath: { $startsWith: path } })), + $or: pathsToDelete.map((path) => ({ folderPath: { $startsWith: path } })), }, }); - await Promise.all(filesToDelete.map(file => getService('upload').remove(file))); + await Promise.all(filesToDelete.map((file) => getService('upload').remove(file))); // delete folders const { count: totalFolderNumber } = await strapi.db.query(FOLDER_MODEL_UID).deleteMany({ where: { - $or: pathsToDelete.map(path => ({ path: { $startsWith: path } })), + $or: pathsToDelete.map((path) => ({ path: { $startsWith: path } })), }, }); @@ -113,7 +109,7 @@ const update = async (id, { name, parent }, { user }) => { .execute(); // update parent folder (delete + insert; upsert not possible) - const joinTable = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.parent.joinTable; + const { joinTable } = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.parent; await strapi.db .queryBuilder(joinTable.name) .transacting(trx) @@ -145,8 +141,8 @@ const update = async (id, { name, parent }, { user }) => { const folderTable = strapi.getModel(FOLDER_MODEL_UID).collectionName; const fileTable = strapi.getModel(FILE_MODEL_UID).collectionName; - const folderPathColumnName = strapi.db.metadata.get(FILE_MODEL_UID).attributes.folderPath - .columnName; + const folderPathColumnName = + strapi.db.metadata.get(FILE_MODEL_UID).attributes.folderPath.columnName; const pathColumnName = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.path.columnName; // update folders below @@ -207,7 +203,7 @@ const exists = async (params = {}) => { * @returns {Promise} */ const getStructure = async () => { - const joinTable = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.parent.joinTable; + const { joinTable } = strapi.db.metadata.get(FOLDER_MODEL_UID).attributes.parent; const qb = strapi.db.queryBuilder(FOLDER_MODEL_UID); const alias = qb.getAlias(); const folders = await qb diff --git a/packages/core/upload/server/services/image-manipulation.js b/packages/core/upload/server/services/image-manipulation.js index 1828c3468e..32f323b3b2 100644 --- a/packages/core/upload/server/services/image-manipulation.js +++ b/packages/core/upload/server/services/image-manipulation.js @@ -1,4 +1,5 @@ 'use strict'; + /** * Image manipulation functions */ @@ -22,17 +23,14 @@ const writeStreamToFile = (stream, path) => writeStream.on('error', reject); }); -const getMetadata = file => +const getMetadata = (file) => new Promise((resolve, reject) => { const pipeline = sharp(); - pipeline - .metadata() - .then(resolve) - .catch(reject); + pipeline.metadata().then(resolve).catch(reject); file.getStream().pipe(pipeline); }); -const getDimensions = async file => { +const getDimensions = async (file) => { const { width = null, height = null } = await getMetadata(file); return { width, height }; }; @@ -62,7 +60,7 @@ const resizeFileTo = async (file, options, { name, hash }) => { return newFile; }; -const generateThumbnail = async file => { +const generateThumbnail = async (file) => { if ( file.width > THUMBNAIL_RESIZE_OPTIONS.width || file.height > THUMBNAIL_RESIZE_OPTIONS.height @@ -83,7 +81,7 @@ const generateThumbnail = async file => { * - reduce image quality * */ -const optimize = async file => { +const optimize = async (file) => { const { sizeOptimization = false, autoOrientation = false } = await getService( 'upload' ).getSettings(); @@ -111,7 +109,7 @@ const optimize = async file => { if (newSize > size) { // Ignore optimization if output is bigger than original - return Object.assign({}, file, { width, height, size: bytesToKbytes(size) }); + return { ...file, width, height, size: bytesToKbytes(size) }; } return Object.assign(newFile, { @@ -129,7 +127,7 @@ const DEFAULT_BREAKPOINTS = { const getBreakpoints = () => strapi.config.get('plugin.upload.breakpoints', DEFAULT_BREAKPOINTS); -const generateResponsiveFormats = async file => { +const generateResponsiveFormats = async (file) => { const { responsiveDimensions = false } = await getService('upload').getSettings(); if (!responsiveDimensions) return []; @@ -138,12 +136,14 @@ const generateResponsiveFormats = async file => { const breakpoints = getBreakpoints(); return Promise.all( - Object.keys(breakpoints).map(key => { + Object.keys(breakpoints).map((key) => { const breakpoint = breakpoints[key]; if (breakpointSmallerThan(breakpoint, originalDimensions)) { return generateBreakpoint(key, { file, breakpoint, originalDimensions }); } + + return undefined; }) ); }; @@ -183,8 +183,8 @@ const isSupportedImage = (...args) => { /** * Applies a simple image transformation to see if the image is faulty/corrupted. */ -const isFaultyImage = file => - new Promise(resolve => { +const isFaultyImage = (file) => + new Promise((resolve) => { file .getStream() .pipe(sharp().rotate()) @@ -194,7 +194,7 @@ const isFaultyImage = file => .on('close', () => resolve(false)); }); -const isOptimizableImage = async file => { +const isOptimizableImage = async (file) => { let format; try { const metadata = await getMetadata(file); @@ -206,7 +206,7 @@ const isOptimizableImage = async file => { return format && FORMATS_TO_OPTIMIZE.includes(format); }; -const isImage = async file => { +const isImage = async (file) => { let format; try { const metadata = await getMetadata(file); diff --git a/packages/core/upload/server/services/metrics.js b/packages/core/upload/server/services/metrics.js index bc03f34187..2b9e2a13c4 100644 --- a/packages/core/upload/server/services/metrics.js +++ b/packages/core/upload/server/services/metrics.js @@ -11,7 +11,7 @@ const getMetricsStoreValue = async () => { const value = await strapi.store.get({ type: 'plugin', name: 'upload', key: 'metrics' }); return defaultTo({}, value); }; -const setMetricsStoreValue = value => +const setMetricsStoreValue = (value) => strapi.store.set({ type: 'plugin', name: 'upload', key: 'metrics', value }); module.exports = ({ strapi }) => ({ @@ -21,7 +21,7 @@ module.exports = ({ strapi }) => ({ const folderTable = strapi.getModel(FOLDER_MODEL_UID).collectionName; let keepOnlySlashesSQLString = '??'; - let queryParams = [pathColName]; + const queryParams = [pathColName]; for (let i = 0; i < 10; i += 1) { keepOnlySlashesSQLString = `REPLACE(${keepOnlySlashesSQLString}, ?, ?)`; queryParams.push(String(i), ''); @@ -57,7 +57,7 @@ module.exports = ({ strapi }) => ({ ) ) .groupBy('depth') - ).map(map => ({ depth: Number(map.depth), occurence: Number(map.occurence) })); // values can be strings depending on the database + ).map((map) => ({ depth: Number(map.depth), occurence: Number(map.occurence) })); // values can be strings depending on the database let product = 0; let folderNumber = 0; diff --git a/packages/core/upload/server/services/upload.js b/packages/core/upload/server/services/upload.js index 9526f08df5..d752784b63 100644 --- a/packages/core/upload/server/services/upload.js +++ b/packages/core/upload/server/services/upload.js @@ -31,13 +31,13 @@ const { UPDATED_BY_ATTRIBUTE, CREATED_BY_ATTRIBUTE } = contentTypesUtils.constan const randomSuffix = () => crypto.randomBytes(5).toString('hex'); -const generateFileName = name => { +const generateFileName = (name) => { const baseName = nameToSlug(name, { separator: '_', lowercase: false }); return `${baseName}_${randomSuffix()}`; }; -const sendMediaMetrics = data => { +const sendMediaMetrics = (data) => { if (_.has(data, 'caption') && !_.isEmpty(data.caption)) { strapi.telemetry.send('didSaveMediaWithCaption'); } @@ -47,12 +47,16 @@ const sendMediaMetrics = data => { } }; -const createAndAssignTmpWorkingDirectoryToFiles = async files => { +const createAndAssignTmpWorkingDirectoryToFiles = async (files) => { const tmpWorkingDirectory = await fse.mkdtemp(path.join(os.tmpdir(), 'strapi-upload-')); - Array.isArray(files) - ? files.forEach(file => (file.tmpWorkingDirectory = tmpWorkingDirectory)) - : (files.tmpWorkingDirectory = tmpWorkingDirectory); + if (Array.isArray(files)) { + files.forEach((file) => { + file.tmpWorkingDirectory = tmpWorkingDirectory; + }); + } else { + files.tmpWorkingDirectory = tmpWorkingDirectory; + } return tmpWorkingDirectory; }; @@ -180,12 +184,8 @@ module.exports = ({ strapi }) => ({ * @param {*} fileData */ async uploadImage(fileData) { - const { - getDimensions, - generateThumbnail, - generateResponsiveFormats, - isOptimizableImage, - } = getService('image-manipulation'); + const { getDimensions, generateThumbnail, generateResponsiveFormats, isOptimizableImage } = + getService('image-manipulation'); // Store width and height of the original image const { width, height } = await getDimensions(fileData); @@ -296,7 +296,7 @@ module.exports = ({ strapi }) => ({ if (dbFile.formats) { await Promise.all( - Object.keys(dbFile.formats).map(key => { + Object.keys(dbFile.formats).map((key) => { return strapi.plugin('upload').provider.delete(dbFile.formats[key]); }) ); @@ -371,7 +371,7 @@ module.exports = ({ strapi }) => ({ if (file.formats) { await Promise.all( - Object.keys(file.formats).map(key => { + Object.keys(file.formats).map((key) => { return strapi.plugin('upload').provider.delete(file.formats[key]); }) ); @@ -401,7 +401,7 @@ module.exports = ({ strapi }) => ({ try { const enhancedFiles = await Promise.all( - arr.map(file => { + arr.map((file) => { return this.enhanceAndValidateFile( file, { folder: apiUploadFolder.id }, @@ -414,7 +414,7 @@ module.exports = ({ strapi }) => ({ }) ); - await Promise.all(enhancedFiles.map(file => this.uploadFileAndPersist(file))); + await Promise.all(enhancedFiles.map((file) => this.uploadFileAndPersist(file))); } finally { // delete temporary folder await fse.remove(tmpWorkingDirectory); diff --git a/packages/core/upload/server/utils/cron.js b/packages/core/upload/server/utils/cron.js index 7635d01075..a9397f8759 100644 --- a/packages/core/upload/server/utils/cron.js +++ b/packages/core/upload/server/utils/cron.js @@ -1,6 +1,6 @@ 'use strict'; -const getWeeklyCronScheduleAt = date => +const getWeeklyCronScheduleAt = (date) => `${date.getSeconds()} ${date.getMinutes()} ${date.getHours()} * * ${date.getDay()}`; module.exports = { diff --git a/packages/core/upload/server/utils/file.js b/packages/core/upload/server/utils/file.js index beca4be334..245bb3ba02 100644 --- a/packages/core/upload/server/utils/file.js +++ b/packages/core/upload/server/utils/file.js @@ -1,15 +1,16 @@ 'use strict'; + /** * Utils file containing file treatment utils */ const { Writable } = require('stream'); -const bytesToKbytes = bytes => Math.round((bytes / 1000) * 100) / 100; +const bytesToKbytes = (bytes) => Math.round((bytes / 1000) * 100) / 100; -const streamToBuffer = stream => +const streamToBuffer = (stream) => new Promise((resolve, reject) => { const chunks = []; - stream.on('data', chunk => { + stream.on('data', (chunk) => { chunks.push(chunk); }); stream.on('end', () => { @@ -18,10 +19,12 @@ const streamToBuffer = stream => stream.on('error', reject); }); -const getStreamSize = stream => +const getStreamSize = (stream) => new Promise((resolve, reject) => { let size = 0; - stream.on('data', chunk => (size += Buffer.byteLength(chunk))); + stream.on('data', (chunk) => { + size += Buffer.byteLength(chunk); + }); stream.on('close', () => resolve(size)); stream.on('error', reject); stream.resume(); diff --git a/packages/core/upload/server/utils/index.js b/packages/core/upload/server/utils/index.js index 988425e5e3..f4607f8ea6 100644 --- a/packages/core/upload/server/utils/index.js +++ b/packages/core/upload/server/utils/index.js @@ -1,6 +1,6 @@ 'use strict'; -const getService = name => { +const getService = (name) => { return strapi.plugin('upload').service(name); }; diff --git a/packages/core/upload/tests/admin/file-folder.test.e2e.js b/packages/core/upload/tests/admin/file-folder.test.e2e.js index bcb8070ca6..800b684a89 100644 --- a/packages/core/upload/tests/admin/file-folder.test.e2e.js +++ b/packages/core/upload/tests/admin/file-folder.test.e2e.js @@ -9,7 +9,7 @@ const { createAuthRequest } = require('../../../../../test/helpers/request'); let strapi; let rq; -let data = { +const data = { folders: [], files: [], }; @@ -37,7 +37,7 @@ describe('File', () => { method: 'POST', url: '/upload/actions/bulk-delete', body: { - folderIds: data.folders.map(f => f.id), + folderIds: data.folders.map((f) => f.id), }, }); diff --git a/packages/core/upload/tests/admin/file.test.e2e.js b/packages/core/upload/tests/admin/file.test.e2e.js index a344d29be3..dac8ae5dbd 100644 --- a/packages/core/upload/tests/admin/file.test.e2e.js +++ b/packages/core/upload/tests/admin/file.test.e2e.js @@ -71,7 +71,7 @@ describe('Upload', () => { total: expect.any(Number), }, }); - res.body.results.forEach(file => expect(file.folder).toBeDefined()); + res.body.results.forEach((file) => expect(file.folder).toBeDefined()); }); }); }); diff --git a/packages/core/upload/tests/admin/folder-file.test.e2e.js b/packages/core/upload/tests/admin/folder-file.test.e2e.js index 1f9ce98624..5ce8ead180 100644 --- a/packages/core/upload/tests/admin/folder-file.test.e2e.js +++ b/packages/core/upload/tests/admin/folder-file.test.e2e.js @@ -9,7 +9,7 @@ const { createAuthRequest } = require('../../../../../test/helpers/request'); let strapi; let rq; -let data = { +const data = { folders: [], files: [], }; @@ -48,7 +48,7 @@ describe('Bulk actions for folders & files', () => { method: 'POST', url: '/upload/actions/bulk-delete', body: { - folderIds: data.folders.map(f => f.id), + folderIds: data.folders.map((f) => f.id), }, }); @@ -116,7 +116,7 @@ describe('Bulk actions for folders & files', () => { url: '/upload/folders', }); - const existingfoldersIds = resFolder.body.data.map(f => f.id); + const existingfoldersIds = resFolder.body.data.map((f) => f.id); expect(existingfoldersIds).toEqual(expect.not.arrayContaining([folder1a.id, folder1a1.id])); expect(existingfoldersIds).toEqual(expect.arrayContaining([folder1.id, folder1b.id])); @@ -128,7 +128,7 @@ describe('Bulk actions for folders & files', () => { }, }); - const existingfilesIds = resFiles.body.results.map(f => f.id); + const existingfilesIds = resFiles.body.results.map((f) => f.id); expect(existingfilesIds).toEqual( expect.not.arrayContaining([file1.id, file1a.id, file1a1.id]) ); @@ -183,7 +183,7 @@ describe('Bulk actions for folders & files', () => { }, }); - const existingfilesIds = resFiles.body.results.map(f => f.id); + const existingfilesIds = resFiles.body.results.map((f) => f.id); expect(existingfilesIds).toEqual(expect.not.arrayContaining([file.id])); }); @@ -217,7 +217,7 @@ describe('Bulk actions for folders & files', () => { url: '/upload/folders', }); - const existingfoldersIds = resFolder.body.data.map(f => f.id); + const existingfoldersIds = resFolder.body.data.map((f) => f.id); expect(existingfoldersIds).toEqual(expect.not.arrayContaining([folder.id])); }); }); diff --git a/packages/core/upload/tests/admin/folder-structure.test.e2e.js b/packages/core/upload/tests/admin/folder-structure.test.e2e.js index 3ab8e23924..afeb8ed516 100644 --- a/packages/core/upload/tests/admin/folder-structure.test.e2e.js +++ b/packages/core/upload/tests/admin/folder-structure.test.e2e.js @@ -6,7 +6,7 @@ const { createAuthRequest } = require('../../../../../test/helpers/request'); let strapi; let rq; -let data = { +const data = { folders: [], }; @@ -36,7 +36,7 @@ describe('Folder structure', () => { method: 'POST', url: '/upload/actions/bulk-delete', body: { - folderIds: res.body.data.map(f => f.id), + folderIds: res.body.data.map((f) => f.id), }, }); @@ -53,7 +53,7 @@ describe('Folder structure', () => { method: 'POST', url: '/upload/actions/bulk-delete', body: { - folderIds: data.folders.map(f => f.id), + folderIds: data.folders.map((f) => f.id), }, }); diff --git a/packages/core/upload/tests/admin/folder.test.e2e.js b/packages/core/upload/tests/admin/folder.test.e2e.js index c4356f8d90..553f7dd34f 100644 --- a/packages/core/upload/tests/admin/folder.test.e2e.js +++ b/packages/core/upload/tests/admin/folder.test.e2e.js @@ -11,12 +11,12 @@ const { createAuthRequest } = require('../../../../../test/helpers/request'); let strapi; let rq; -let data = { +const data = { folders: [], }; const rootPathRegex = /^\/[0-9]*$/i; -const getFolderPathRegex = pathId => new RegExp('^/' + pathId + '/[0-9]*$', 'i'); +const getFolderPathRegex = (pathId) => new RegExp(`^/${pathId}/[0-9]*$`, 'i'); const createFolder = async (name, parent = null) => { const res = await rq({ @@ -52,7 +52,7 @@ describe('Folder', () => { method: 'POST', url: '/upload/actions/bulk-delete', body: { - folderIds: data.folders.map(f => f.id), + folderIds: data.folders.map((f) => f.id), }, }); @@ -166,7 +166,7 @@ describe('Folder', () => { test.each([[' abc'], [' abc '], ['abc '], [' abc '], [' abc ']])( 'Cannot create a folder with name starting or ending with a whitespace (%p)', - async name => { + async (name) => { const res = await rq({ method: 'POST', url: '/upload/folders', diff --git a/packages/core/upload/tests/admin/image-dimension.test.e2e.js b/packages/core/upload/tests/admin/image-dimension.test.e2e.js index 5ebf8a16bf..3431a1a1df 100644 --- a/packages/core/upload/tests/admin/image-dimension.test.e2e.js +++ b/packages/core/upload/tests/admin/image-dimension.test.e2e.js @@ -24,7 +24,7 @@ describe('Dimensions are populated when uploading an image', () => { test.each([['.jpg'], ['.png'], ['.webp'], ['.tiff'], ['.svg'], ['.gif']])( 'Dimensions are populated for %s', - async ext => { + async (ext) => { const res = await rq({ method: 'POST', url: '/upload', diff --git a/packages/core/upload/tests/content-api/graphql-upload-automatic-folder.test.e2e.js b/packages/core/upload/tests/content-api/graphql-upload-automatic-folder.test.e2e.js index 4cd692edff..0f107196fd 100644 --- a/packages/core/upload/tests/content-api/graphql-upload-automatic-folder.test.e2e.js +++ b/packages/core/upload/tests/content-api/graphql-upload-automatic-folder.test.e2e.js @@ -29,7 +29,7 @@ describe('Uploads folder (GraphQL)', () => { method: 'POST', url: '/upload/actions/bulk-delete', body: { - folderIds: res.body.data.map(f => f.id), + folderIds: res.body.data.map((f) => f.id), }, }); diff --git a/packages/core/upload/tests/content-api/upload-automatic-folder.test.e2e.js b/packages/core/upload/tests/content-api/upload-automatic-folder.test.e2e.js index 7da48e5fab..2e5fd8a76e 100644 --- a/packages/core/upload/tests/content-api/upload-automatic-folder.test.e2e.js +++ b/packages/core/upload/tests/content-api/upload-automatic-folder.test.e2e.js @@ -51,7 +51,7 @@ describe('Uploads folder', () => { method: 'POST', url: '/upload/actions/bulk-delete', body: { - folderIds: res.body.data.map(f => f.id), + folderIds: res.body.data.map((f) => f.id), }, }); @@ -444,7 +444,7 @@ describe('Uploads folder', () => { }, }); - files.forEach(file => + files.forEach((file) => expect(file).toMatchObject({ folder: { name: 'API Uploads (3)', @@ -454,7 +454,7 @@ describe('Uploads folder', () => { }) ); - expect(files.every(file => file.folder.id === files[0].folder.id)).toBe(true); + expect(files.every((file) => file.folder.id === files[0].folder.id)).toBe(true); uploadFolder = files[0].folder; }); @@ -513,7 +513,7 @@ describe('Uploads folder', () => { }) ); - expect(files.every(file => file.folder.id === files[0].folder.id)).toBe(true); + expect(files.every((file) => file.folder.id === files[0].folder.id)).toBe(true); uploadFolder = files[0].folder; }); @@ -555,7 +555,7 @@ describe('Uploads folder', () => { }, }); - files.forEach(file => { + files.forEach((file) => { expect(file).toMatchObject({ folder: { name: 'API Uploads (3)', @@ -566,7 +566,7 @@ describe('Uploads folder', () => { expect(file.folder.id).not.toBe(uploadFolder.id); }); - expect(files.every(file => file.folder.id === files[0].folder.id)).toBe(true); + expect(files.every((file) => file.folder.id === files[0].folder.id)).toBe(true); uploadFolder = files[0].folder; }); @@ -617,7 +617,7 @@ describe('Uploads folder', () => { }, }); - files.forEach(file => { + files.forEach((file) => { expect(file).toMatchObject({ folder: { name: 'API Uploads (4)', @@ -628,7 +628,7 @@ describe('Uploads folder', () => { expect(file.folder.id).not.toBe(uploadFolder.id); }); - expect(files.every(file => file.folder.id === files[0].folder.id)).toBe(true); + expect(files.every((file) => file.folder.id === files[0].folder.id)).toBe(true); uploadFolder = files[0].folder; }); diff --git a/packages/core/utils/jest.config.js b/packages/core/utils/jest.config.js index 636254a96c..f6c9937187 100644 --- a/packages/core/utils/jest.config.js +++ b/packages/core/utils/jest.config.js @@ -1,7 +1,7 @@ 'use strict'; const baseConfig = require('../../../jest.base-config'); -const pkg = require('./package'); +const pkg = require('./package.json'); module.exports = { ...baseConfig, diff --git a/packages/core/utils/lib/__tests__/content-types.test.js b/packages/core/utils/lib/__tests__/content-types.test.js index b1816310a9..6029d93fa8 100644 --- a/packages/core/utils/lib/__tests__/content-types.test.js +++ b/packages/core/utils/lib/__tests__/content-types.test.js @@ -34,7 +34,7 @@ const createConfig = (privateAttributes = []) => ({ get: jest.fn(() => privateAttributes), }); -const createModel = opts => ({ +const createModel = (opts) => ({ ...opts, }); diff --git a/packages/core/utils/lib/__tests__/env-helper.test.js b/packages/core/utils/lib/__tests__/env-helper.test.js index 10d5f71631..a77412af17 100644 --- a/packages/core/utils/lib/__tests__/env-helper.test.js +++ b/packages/core/utils/lib/__tests__/env-helper.test.js @@ -54,10 +54,13 @@ describe('Env helper', () => { expect(envHelper.bool('NO_VAR')).toBeUndefined(); }); - test.each(['', '1', '-1', 'false'])('Returns false if var is not equal to true (%s)', value => { - process.env.NOT_TRUE = value; - expect(envHelper.bool('NOT_TRUE')).toEqual(false); - }); + test.each(['', '1', '-1', 'false'])( + 'Returns false if var is not equal to true (%s)', + (value) => { + process.env.NOT_TRUE = value; + expect(envHelper.bool('NOT_TRUE')).toEqual(false); + } + ); test('Returns true when using "true"', () => { process.env.TRUE_VAR = 'true'; diff --git a/packages/core/utils/lib/__tests__/hooks.test.js b/packages/core/utils/lib/__tests__/hooks.test.js index a95d212f99..295b3fb0dc 100644 --- a/packages/core/utils/lib/__tests__/hooks.test.js +++ b/packages/core/utils/lib/__tests__/hooks.test.js @@ -43,7 +43,7 @@ describe('Hooks Module', () => { test('Running a hook with an handler can mutate the context', async () => { const ctx = { foo: 'bar' }; - const handler = jest.fn(context => { + const handler = jest.fn((context) => { context.foo = 'foo'; }); @@ -60,16 +60,16 @@ describe('Hooks Module', () => { test('Running a hook with multiple handlers can mutate the hook in order', async () => { const ctx = { foo: [] }; const handlers = [ - jest.fn(context => context.foo.push('foo')), - jest.fn(context => context.foo.push('bar')), + jest.fn((context) => context.foo.push('foo')), + jest.fn((context) => context.foo.push('bar')), ]; const hook = hooks.createAsyncSeriesHook(); - handlers.forEach(handler => hook.register(handler)); + handlers.forEach((handler) => hook.register(handler)); await hook.call(ctx); - handlers.forEach(handler => expect(handler).toHaveBeenCalled()); + handlers.forEach((handler) => expect(handler).toHaveBeenCalled()); expect(ctx).toHaveProperty('foo', ['foo', 'bar']); }); }); @@ -93,7 +93,7 @@ describe('Hooks Module', () => { test('Running a hook with an handler can update the final value', async () => { const param = 'foo'; - const handler = jest.fn(param => [param, 'bar']); + const handler = jest.fn((param) => [param, 'bar']); const hook = hooks.createAsyncSeriesWaterfallHook(); @@ -107,14 +107,17 @@ describe('Hooks Module', () => { test(`Running a hook with multiple handlers means every handler will receive the previous one's result`, async () => { const param = 'foo'; - const handlers = [jest.fn(param => `${param}.bar`), jest.fn(param => `${param}.foobar`)]; + const handlers = [ + jest.fn((param) => `${param}.bar`), + jest.fn((param) => `${param}.foobar`), + ]; const hook = hooks.createAsyncSeriesWaterfallHook(); - handlers.forEach(handler => hook.register(handler)); + handlers.forEach((handler) => hook.register(handler)); const result = await hook.call(param); - handlers.forEach(handler => expect(handler).toHaveBeenCalled()); + handlers.forEach((handler) => expect(handler).toHaveBeenCalled()); expect(result).toEqual('foo.bar.foobar'); }); }); @@ -138,7 +141,7 @@ describe('Hooks Module', () => { test('Running a hook with an handler returns its value', async () => { const param = 'test'; - const handler = jest.fn(param => `${param}.bar`); + const handler = jest.fn((param) => `${param}.bar`); const hook = hooks.createAsyncParallelHook(); @@ -152,14 +155,14 @@ describe('Hooks Module', () => { test(`Running a hook with multiple handlers return every result as an array`, async () => { const param = 'test'; - const handlers = [jest.fn(param => `${param}.foo`), jest.fn(param => `${param}.bar`)]; + const handlers = [jest.fn((param) => `${param}.foo`), jest.fn((param) => `${param}.bar`)]; const hook = hooks.createAsyncParallelHook(); - handlers.forEach(handler => hook.register(handler)); + handlers.forEach((handler) => hook.register(handler)); const result = await hook.call(param); - handlers.forEach(handler => expect(handler).toHaveBeenCalled()); + handlers.forEach((handler) => expect(handler).toHaveBeenCalled()); expect(result).toEqual(['test.foo', 'test.bar']); }); }); diff --git a/packages/core/utils/lib/__tests__/parse-type.test.js b/packages/core/utils/lib/__tests__/parse-type.test.js index 612c0cede4..23e781dcaf 100644 --- a/packages/core/utils/lib/__tests__/parse-type.test.js +++ b/packages/core/utils/lib/__tests__/parse-type.test.js @@ -78,7 +78,7 @@ describe('parseType', () => { describe('Datetime', () => { it.each(['2019-01-01', '2019-01-01 10:11:12', '1234567890111', '2019-01-01T10:11:12.123Z'])( 'Supports ISO formats and always returns a date %s', - value => { + (value) => { const r = parseType({ type: 'datetime', value }); expect(r instanceof Date).toBe(true); } diff --git a/packages/core/utils/lib/__tests__/provider-factory.test.js b/packages/core/utils/lib/__tests__/provider-factory.test.js index a759beb268..ec0f9daead 100644 --- a/packages/core/utils/lib/__tests__/provider-factory.test.js +++ b/packages/core/utils/lib/__tests__/provider-factory.test.js @@ -21,7 +21,7 @@ describe('Provider Factory', () => { expect(provider).toHaveProperty('hooks', expect.any(Object)); - providerMethods.forEach(methodName => + providerMethods.forEach((methodName) => expect(provider).toHaveProperty(methodName, expect.any(Function)) ); }); @@ -30,11 +30,13 @@ describe('Provider Factory', () => { describe('Hooks', () => { test.each(['willRegister'])( 'AsyncSeries: %s hook can be triggered and mutate the given context', - async hookName => { + async (hookName) => { const provider = providerFactory(); const ctx = { bar: 'foo' }; - const handler = jest.fn(context => (context.foo = 'bar')); + const handler = jest.fn((context) => { + context.foo = 'bar'; + }); provider.hooks[hookName].register(handler); @@ -47,11 +49,11 @@ describe('Provider Factory', () => { test.each(['didRegister', 'willDelete', 'didDelete'])( 'AsyncParallel: %s hook can be triggered, but cannot mutate the given context', - async hookName => { + async (hookName) => { const provider = providerFactory(); const ctx = { bar: 'foo' }; - const handler = jest.fn(context => { + const handler = jest.fn((context) => { context.foo = 'bar'; return context; }); @@ -109,7 +111,9 @@ describe('Provider Factory', () => { }); test('Register hooks are triggered on item registration', async () => { - const willRegister = jest.fn(({ value }) => (value.bar = 'foo')); + const willRegister = jest.fn(({ value }) => { + value.bar = 'foo'; + }); const didRegister = jest.fn(); const key = 'key'; @@ -212,7 +216,7 @@ describe('Provider Factory', () => { const provider = providerFactory(); const sortItems = (a, b) => (a.key < b.key ? -1 : 1); - const pickItems = (...indexes) => indexes.map(index => items[index].value); + const pickItems = (...indexes) => indexes.map((index) => items[index].value); beforeAll(async () => { for (const item of items) { @@ -221,7 +225,7 @@ describe('Provider Factory', () => { }); test('Calling getWhere without filters returns every registered items', async () => { - const expected = items.map(i => i.value).sort(sortItems); + const expected = items.map((i) => i.value).sort(sortItems); const results = provider.getWhere(); @@ -271,7 +275,7 @@ describe('Provider Factory', () => { const values = provider.values(); - expect(values).toStrictEqual(items.map(item => item.value)); + expect(values).toStrictEqual(items.map((item) => item.value)); }); }); @@ -300,7 +304,7 @@ describe('Provider Factory', () => { const keys = provider.keys(); - expect(keys).toStrictEqual(items.map(item => item.key)); + expect(keys).toStrictEqual(items.map((item) => item.key)); }); }); diff --git a/packages/core/utils/lib/__tests__/validators.test.js b/packages/core/utils/lib/__tests__/validators.test.js index a6f8c6ccb0..446ac53e69 100644 --- a/packages/core/utils/lib/__tests__/validators.test.js +++ b/packages/core/utils/lib/__tests__/validators.test.js @@ -36,10 +36,7 @@ describe('validators', () => { ])('yup.strapiID().required(): %s => %s', async (value, expectedResult) => { let result = true; try { - await yup - .strapiID() - .required() - .validate(value); + await yup.strapiID().required().validate(value); } catch (e) { result = false; } @@ -59,10 +56,7 @@ describe('validators', () => { ])('yup.strapiID().nullable(): %s => %s', async (value, expectedResult) => { let result = true; try { - await yup - .strapiID() - .nullable() - .validate(value); + await yup.strapiID().nullable().validate(value); } catch (e) { result = false; } @@ -82,11 +76,7 @@ describe('validators', () => { ])('yup.strapiID().nullable().defined(): %s => %s', async (value, expectedResult) => { let result = true; try { - await yup - .strapiID() - .nullable() - .defined() - .validate(value); + await yup.strapiID().nullable().defined().validate(value); } catch (e) { result = false; } diff --git a/packages/core/utils/lib/__tests__/visitors.test.js b/packages/core/utils/lib/__tests__/visitors.test.js index b77022c646..d4a0884b9b 100644 --- a/packages/core/utils/lib/__tests__/visitors.test.js +++ b/packages/core/utils/lib/__tests__/visitors.test.js @@ -19,7 +19,7 @@ describe('Sanitize visitors util', () => { test('keeps creator relations with populateCreatorFields true', async () => { const remove = jest.fn(); const set = jest.fn(); - const promises = creatorKeys.map(async key => { + const promises = creatorKeys.map(async (key) => { await rrrFunction( { data, @@ -39,7 +39,7 @@ describe('Sanitize visitors util', () => { test('removes creator relations with populateCreatorFields false', async () => { const remove = jest.fn(); const set = jest.fn(); - const promises = creatorKeys.map(async key => { + const promises = creatorKeys.map(async (key) => { await rrrFunction( { data, @@ -53,7 +53,7 @@ describe('Sanitize visitors util', () => { await Promise.all(promises); expect(remove).toHaveBeenCalledTimes(creatorKeys.length); - creatorKeys.forEach(key => expect(remove).toHaveBeenCalledWith(key)); + creatorKeys.forEach((key) => expect(remove).toHaveBeenCalledWith(key)); expect(set).toBeCalledTimes(0); }); }); diff --git a/packages/core/utils/lib/__tests__/yup-formatter.test.js b/packages/core/utils/lib/__tests__/yup-formatter.test.js index a0865e26cf..ff4ff2e989 100644 --- a/packages/core/utils/lib/__tests__/yup-formatter.test.js +++ b/packages/core/utils/lib/__tests__/yup-formatter.test.js @@ -27,7 +27,7 @@ describe('formatYupErrors', () => { name: yup.string().required('name is required'), }) .validate({}) - .catch(err => { + .catch((err) => { expect(formatYupErrors(err)).toMatchObject({ errors: [ { @@ -45,10 +45,7 @@ describe('formatYupErrors', () => { expect.hasAssertions(); return yup .object({ - name: yup - .string() - .min(2, 'min length is 2') - .required(), + name: yup.string().min(2, 'min length is 2').required(), }) .validate( { @@ -59,7 +56,7 @@ describe('formatYupErrors', () => { abortEarly: false, } ) - .catch(err => { + .catch((err) => { expect(formatYupErrors(err)).toMatchObject({ errors: [ { @@ -77,15 +74,8 @@ describe('formatYupErrors', () => { expect.hasAssertions(); return yup .object({ - name: yup - .string() - .min(2, 'min length is 2') - .typeError('name must be a string') - .required(), - price: yup - .number() - .integer() - .required('price is required'), + name: yup.string().min(2, 'min length is 2').typeError('name must be a string').required(), + price: yup.number().integer().required('price is required'), }) .validate( { @@ -96,7 +86,7 @@ describe('formatYupErrors', () => { abortEarly: false, } ) - .catch(err => { + .catch((err) => { expect(formatYupErrors(err)).toMatchObject({ errors: [ { diff --git a/packages/core/utils/lib/build-query.js b/packages/core/utils/lib/build-query.js index 35c7f7da37..8cff188f76 100644 --- a/packages/core/utils/lib/build-query.js +++ b/packages/core/utils/lib/build-query.js @@ -1,6 +1,6 @@ 'use strict'; -//TODO: move to dbal +// TODO: move to dbal const _ = require('lodash'); const parseType = require('./parse-type'); @@ -25,7 +25,7 @@ const getAssociationFromFieldKey = ({ model, field }) => { const part = fieldParts[i]; attribute = part; - const assoc = tmpModel.associations.find(ast => ast.alias === part); + const assoc = tmpModel.associations.find((ast) => ast.alias === part); if (assoc) { association = assoc; @@ -59,7 +59,7 @@ const getAssociationFromFieldKey = ({ model, field }) => { */ const castInput = ({ type, value, operator }) => { return Array.isArray(value) - ? value.map(val => castValue({ type, operator, value: val })) + ? value.map((val) => castValue({ type, operator, value: val })) : castValue({ type, operator, value }); }; @@ -84,9 +84,7 @@ const castValue = ({ type, value, operator }) => { const normalizeFieldName = ({ model, field }) => { const fieldPath = field.split('.'); return _.last(fieldPath) === 'id' - ? _.initial(fieldPath) - .concat(model.primaryKey) - .join('.') + ? _.initial(fieldPath).concat(model.primaryKey).join('.') : fieldPath.join('.'); }; @@ -100,7 +98,7 @@ const hasDeepFilters = ({ where = [], sort = [] }, { minDepth = 1 } = {}) => { const hasDeepWhereClauses = where.some(({ field, operator, value }) => { if (BOOLEAN_OPERATORS.includes(operator)) { - return value.some(clauses => hasDeepFilters({ where: clauses })); + return value.some((clauses) => hasDeepFilters({ where: clauses })); } return field.split('.').length > minDepth; @@ -114,7 +112,8 @@ const normalizeWhereClauses = (whereClauses, { model }) => { .filter(({ field, value }) => { if (_.isNull(value)) { return false; - } else if (_.isUndefined(value)) { + } + if (_.isUndefined(value)) { strapi.log.warn(`The value of field: '${field}', in your where filter, is undefined.`); return false; } @@ -125,7 +124,7 @@ const normalizeWhereClauses = (whereClauses, { model }) => { return { field, operator, - value: value.map(clauses => normalizeWhereClauses(clauses, { model })), + value: value.map((clauses) => normalizeWhereClauses(clauses, { model })), }; } diff --git a/packages/core/utils/lib/code-generator.js b/packages/core/utils/lib/code-generator.js index 20894baa1e..ed5f85aeb0 100644 --- a/packages/core/utils/lib/code-generator.js +++ b/packages/core/utils/lib/code-generator.js @@ -2,7 +2,7 @@ // Using timestamp (milliseconds) to be sure it is unique // + converting timestamp to base 36 for better readibility -const generateTimestampCode = date => { +const generateTimestampCode = (date) => { const referDate = date || new Date(); return referDate.getTime().toString(36); diff --git a/packages/core/utils/lib/config.js b/packages/core/utils/lib/config.js index 9a653aa4d9..bac51a7381 100644 --- a/packages/core/utils/lib/config.js +++ b/packages/core/utils/lib/config.js @@ -62,22 +62,24 @@ const getConfigUrls = (config, forAdminBuild = false) => { }; }; -const getAbsoluteUrl = adminOrServer => (config, forAdminBuild = false) => { - const { serverUrl, adminUrl } = getConfigUrls(config, forAdminBuild); - let url = adminOrServer === 'server' ? serverUrl : adminUrl; +const getAbsoluteUrl = + (adminOrServer) => + (config, forAdminBuild = false) => { + const { serverUrl, adminUrl } = getConfigUrls(config, forAdminBuild); + const url = adminOrServer === 'server' ? serverUrl : adminUrl; - if (url.startsWith('http')) { - return url; - } + if (url.startsWith('http')) { + return url; + } - let hostname = - config.get('environment') === 'development' && - ['127.0.0.1', '0.0.0.0'].includes(config.get('server.host')) - ? 'localhost' - : config.get('server.host'); + const hostname = + config.get('environment') === 'development' && + ['127.0.0.1', '0.0.0.0'].includes(config.get('server.host')) + ? 'localhost' + : config.get('server.host'); - return `http://${hostname}:${config.get('server.port')}${url}`; -}; + return `http://${hostname}:${config.get('server.port')}${url}`; + }; module.exports = { getConfigUrls, diff --git a/packages/core/utils/lib/content-types.js b/packages/core/utils/lib/content-types.js index b5984ddc53..89a019ba09 100644 --- a/packages/core/utils/lib/content-types.js +++ b/packages/core/utils/lib/content-types.js @@ -32,7 +32,7 @@ const constants = { COLLECTION_TYPE, }; -const getTimestamps = model => { +const getTimestamps = (model) => { const attributes = []; if (has(CREATED_AT_ATTRIBUTE, model.attributes)) { @@ -64,7 +64,7 @@ const isWritableAttribute = (model, attributeName) => { return getWritableAttributes(model).includes(attributeName); }; -const getNonVisibleAttributes = model => { +const getNonVisibleAttributes = (model) => { const nonVisibleAttributes = _.reduce( model.attributes, (acc, attr, attrName) => (attr.visible === false ? acc.concat(attrName) : acc), @@ -74,7 +74,7 @@ const getNonVisibleAttributes = model => { return _.uniq([ID_ATTRIBUTE, ...getTimestamps(model), ...nonVisibleAttributes]); }; -const getVisibleAttributes = model => { +const getVisibleAttributes = (model) => { return _.difference(_.keys(model.attributes), getNonVisibleAttributes(model)); }; @@ -82,20 +82,20 @@ const isVisibleAttribute = (model, attributeName) => { return getVisibleAttributes(model).includes(attributeName); }; -const hasDraftAndPublish = model => _.get(model, 'options.draftAndPublish', false) === true; +const hasDraftAndPublish = (model) => _.get(model, 'options.draftAndPublish', false) === true; const isDraft = (data, model) => hasDraftAndPublish(model) && _.get(data, PUBLISHED_AT_ATTRIBUTE) === null; const isSingleType = ({ kind = COLLECTION_TYPE }) => kind === SINGLE_TYPE; const isCollectionType = ({ kind = COLLECTION_TYPE }) => kind === COLLECTION_TYPE; -const isKind = kind => model => model.kind === kind; +const isKind = (kind) => (model) => model.kind === kind; const getPrivateAttributes = (model = {}) => { return _.union( strapi.config.get('api.responses.privateAttributes', []), _.get(model, 'options.privateAttributes', []), - _.keys(_.pickBy(model.attributes, attr => !!attr.private)) + _.keys(_.pickBy(model.attributes, (attr) => !!attr.private)) ); }; @@ -103,11 +103,11 @@ const isPrivateAttribute = (model = {}, attributeName) => { return model && model.privateAttributes && model.privateAttributes.includes(attributeName); }; -const isScalarAttribute = attribute => { +const isScalarAttribute = (attribute) => { return !['media', 'component', 'relation', 'dynamiczone'].includes(attribute.type); }; -const getScalarAttributes = schema => { +const getScalarAttributes = (schema) => { return _.reduce( schema.attributes, (acc, attr, attrName) => { @@ -118,9 +118,9 @@ const getScalarAttributes = schema => { ); }; -const isMediaAttribute = attribute => attribute.type === 'media'; -const isRelationalAttribute = attribute => attribute.type === 'relation'; -const isComponentAttribute = attribute => ['component', 'dynamiczone'].includes(attribute.type); +const isMediaAttribute = (attribute) => attribute.type === 'media'; +const isRelationalAttribute = (attribute) => attribute.type === 'relation'; +const isComponentAttribute = (attribute) => ['component', 'dynamiczone'].includes(attribute.type); /** * Checks if an attribute is of type `type` @@ -136,7 +136,7 @@ const isTypedAttribute = (attribute, type) => { * @param {object} contentType * @returns {string} */ -const getContentTypeRoutePrefix = contentType => { +const getContentTypeRoutePrefix = (contentType) => { return isSingleType(contentType) ? _.kebabCase(contentType.info.singularName) : _.kebabCase(contentType.info.pluralName); diff --git a/packages/core/utils/lib/convert-query-params.js b/packages/core/utils/lib/convert-query-params.js index 1640bc5de4..669f21d417 100644 --- a/packages/core/utils/lib/convert-query-params.js +++ b/packages/core/utils/lib/convert-query-params.js @@ -1,3 +1,5 @@ +/* eslint-disable max-classes-per-file */ + 'use strict'; /** @@ -25,13 +27,13 @@ class InvalidSortError extends Error { } } -const validateOrder = order => { +const validateOrder = (order) => { if (!['asc', 'desc'].includes(order.toLocaleLowerCase())) { throw new InvalidOrderError(); } }; -const convertCountQueryParams = countQuery => { +const convertCountQueryParams = (countQuery) => { return parseType({ type: 'boolean', value: countQuery }); }; @@ -39,13 +41,13 @@ const convertCountQueryParams = countQuery => { * Sort query parser * @param {string} sortQuery - ex: id:asc,price:desc */ -const convertSortQueryParams = sortQuery => { +const convertSortQueryParams = (sortQuery) => { if (typeof sortQuery === 'string') { - return sortQuery.split(',').map(value => convertSingleSortQueryParam(value)); + return sortQuery.split(',').map((value) => convertSingleSortQueryParam(value)); } if (Array.isArray(sortQuery)) { - return sortQuery.flatMap(sortValue => convertSortQueryParams(sortValue)); + return sortQuery.flatMap((sortValue) => convertSortQueryParams(sortValue)); } if (_.isPlainObject(sortQuery)) { @@ -55,7 +57,7 @@ const convertSortQueryParams = sortQuery => { throw new InvalidSortError(); }; -const convertSingleSortQueryParam = sortQuery => { +const convertSingleSortQueryParam = (sortQuery) => { // split field and order param with default order to ascending const [field, order = 'asc'] = sortQuery.split(':'); @@ -68,9 +70,9 @@ const convertSingleSortQueryParam = sortQuery => { return _.set({}, field, order); }; -const convertNestedSortQueryParam = sortQuery => { +const convertNestedSortQueryParam = (sortQuery) => { const transformedSort = {}; - for (const field in sortQuery) { + for (const field of Object.keys(sortQuery)) { const order = sortQuery[field]; // this is a deep sort @@ -89,7 +91,7 @@ const convertNestedSortQueryParam = sortQuery => { * Start query parser * @param {string} startQuery */ -const convertStartQueryParams = startQuery => { +const convertStartQueryParams = (startQuery) => { const startAsANumber = _.toNumber(startQuery); if (!_.isInteger(startAsANumber) || startAsANumber < 0) { @@ -103,7 +105,7 @@ const convertStartQueryParams = startQuery => { * Limit query parser * @param {string} limitQuery */ -const convertLimitQueryParams = limitQuery => { +const convertLimitQueryParams = (limitQuery) => { const limitAsANumber = _.toNumber(limitQuery); if (!_.isInteger(limitAsANumber) || (limitAsANumber !== -1 && limitAsANumber < 0)) { @@ -130,18 +132,18 @@ const convertPopulateQueryParams = (populate, schema, depth = 0) => { } if (typeof populate === 'string') { - return populate.split(',').map(value => _.trim(value)); + return populate.split(',').map((value) => _.trim(value)); } if (Array.isArray(populate)) { // map convert return _.uniq( - populate.flatMap(value => { + populate.flatMap((value) => { if (typeof value !== 'string') { throw new InvalidPopulateError(); } - return value.split(',').map(value => _.trim(value)); + return value.split(',').map((value) => _.trim(value)); }) ); } @@ -171,8 +173,8 @@ const convertPopulateObject = (populate, schema) => { // fixed when we'll implement a more accurate way to query them if (attribute.type === 'dynamiczone') { const populates = attribute.components - .map(uid => strapi.getModel(uid)) - .map(schema => convertNestedPopulate(subPopulate, schema)); + .map((uid) => strapi.getModel(uid)) + .map((schema) => convertNestedPopulate(subPopulate, schema)); return { ...acc, @@ -255,13 +257,13 @@ const convertFieldsQueryParams = (fields, depth = 0) => { } if (typeof fields === 'string') { - const fieldsValues = fields.split(',').map(value => _.trim(value)); + const fieldsValues = fields.split(',').map((value) => _.trim(value)); return _.uniq(['id', ...fieldsValues]); } if (Array.isArray(fields)) { // map convert - const fieldsValues = fields.flatMap(value => convertFieldsQueryParams(value, depth + 1)); + const fieldsValues = fields.flatMap((value) => convertFieldsQueryParams(value, depth + 1)); return _.uniq(['id', ...fieldsValues]); } @@ -290,13 +292,13 @@ const convertAndSanitizeFilters = (filters, schema) => { return ( filters // Sanitize each filter - .map(filter => convertAndSanitizeFilters(filter, schema)) + .map((filter) => convertAndSanitizeFilters(filter, schema)) // Filter out empty filters - .filter(filter => !isObject(filter) || !isEmpty(filter)) + .filter((filter) => !isObject(filter) || !isEmpty(filter)) ); } - const removeOperator = operator => delete filters[operator]; + const removeOperator = (operator) => delete filters[operator]; // Here, `key` can either be an operator or an attribute name for (const [key, value] of Object.entries(filters)) { @@ -324,24 +326,23 @@ const convertAndSanitizeFilters = (filters, schema) => { removeOperator(key); } + // Password attributes + else if (attribute.type === 'password') { + // Always remove password attributes from filters object + removeOperator(key); + } + // Scalar attributes else { - // Always remove password attributes from filters object - if (attribute.type === 'password') { - removeOperator(key); - } else { - filters[key] = convertAndSanitizeFilters(value, schema); - } + filters[key] = convertAndSanitizeFilters(value, schema); } } // Handle operators - else { - if (['$null', '$notNull'].includes(key)) { - filters[key] = parseType({ type: 'boolean', value: filters[key], forceCast: true }); - } else if (isObject(value)) { - filters[key] = convertAndSanitizeFilters(value, schema); - } + else if (['$null', '$notNull'].includes(key)) { + filters[key] = parseType({ type: 'boolean', value: filters[key], forceCast: true }); + } else if (isObject(value)) { + filters[key] = convertAndSanitizeFilters(value, schema); } // Remove empty objects & arrays diff --git a/packages/core/utils/lib/env-helper.js b/packages/core/utils/lib/env-helper.js index 69d024c1cf..b26a893fed 100644 --- a/packages/core/utils/lib/env-helper.js +++ b/packages/core/utils/lib/env-helper.js @@ -58,7 +58,7 @@ const utils = { value = value.substring(1, value.length - 1); } - return value.split(',').map(v => { + return value.split(',').map((v) => { return _.trim(_.trim(v, ' '), '"'); }); }, diff --git a/packages/core/utils/lib/errors.js b/packages/core/utils/lib/errors.js index 7a99a4e254..34cb3c919d 100644 --- a/packages/core/utils/lib/errors.js +++ b/packages/core/utils/lib/errors.js @@ -1,3 +1,5 @@ +/* eslint-disable max-classes-per-file */ + 'use strict'; const { HttpError } = require('http-errors'); diff --git a/packages/core/utils/lib/format-yup-error.js b/packages/core/utils/lib/format-yup-error.js index 17c23decd5..19b1492097 100644 --- a/packages/core/utils/lib/format-yup-error.js +++ b/packages/core/utils/lib/format-yup-error.js @@ -2,13 +2,13 @@ const { isEmpty, toPath } = require('lodash/fp'); -const formatYupInnerError = yupError => ({ +const formatYupInnerError = (yupError) => ({ path: toPath(yupError.path), message: yupError.message, name: yupError.name, }); -const formatYupErrors = yupError => ({ +const formatYupErrors = (yupError) => ({ errors: isEmpty(yupError.inner) ? [formatYupInnerError(yupError)] : yupError.inner.map(formatYupInnerError), diff --git a/packages/core/utils/lib/hooks.js b/packages/core/utils/lib/hooks.js index 4a227c421b..b4577d0ed6 100644 --- a/packages/core/utils/lib/hooks.js +++ b/packages/core/utils/lib/hooks.js @@ -85,7 +85,7 @@ const createAsyncParallelHook = () => ({ ...createHook(), async call(context) { - const promises = this.getHandlers().map(handler => handler(cloneDeep(context))); + const promises = this.getHandlers().map((handler) => handler(cloneDeep(context))); return Promise.all(promises); }, diff --git a/packages/core/utils/lib/object-formatting.js b/packages/core/utils/lib/object-formatting.js index 1d8a5899e2..23c1326db8 100644 --- a/packages/core/utils/lib/object-formatting.js +++ b/packages/core/utils/lib/object-formatting.js @@ -2,7 +2,7 @@ const _ = require('lodash'); -const removeUndefined = obj => _.pickBy(obj, value => typeof value !== 'undefined'); +const removeUndefined = (obj) => _.pickBy(obj, (value) => typeof value !== 'undefined'); module.exports = { removeUndefined, diff --git a/packages/core/utils/lib/pagination.js b/packages/core/utils/lib/pagination.js index bef6b935d3..cf234dede9 100644 --- a/packages/core/utils/lib/pagination.js +++ b/packages/core/utils/lib/pagination.js @@ -30,10 +30,12 @@ const ensureMinValues = ({ start, limit }) => ({ limit: limit === -1 ? limit : Math.max(limit, 1), }); -const ensureMaxValues = (maxLimit = -1) => ({ start, limit }) => ({ - start, - limit: withMaxLimit(limit, maxLimit), -}); +const ensureMaxValues = + (maxLimit = -1) => + ({ start, limit }) => ({ + start, + limit: withMaxLimit(limit, maxLimit), + }); // Apply maxLimit as the limit when limit is -1 const withNoLimit = (pagination, maxLimit = -1) => ({ diff --git a/packages/core/utils/lib/parse-multipart.js b/packages/core/utils/lib/parse-multipart.js index 6230e8cdbb..26bd707c41 100644 --- a/packages/core/utils/lib/parse-multipart.js +++ b/packages/core/utils/lib/parse-multipart.js @@ -2,7 +2,7 @@ const _ = require('lodash'); -module.exports = ctx => { +module.exports = (ctx) => { if (!ctx.is('multipart')) { return { data: ctx.request.body, files: {} }; } diff --git a/packages/core/utils/lib/parse-type.js b/packages/core/utils/lib/parse-type.js index f96052ebe9..befd33dee0 100644 --- a/packages/core/utils/lib/parse-type.js +++ b/packages/core/utils/lib/parse-type.js @@ -3,9 +3,9 @@ const _ = require('lodash'); const dates = require('date-fns'); -const timeRegex = new RegExp('^(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(.[0-9]{1,3})?$'); +const timeRegex = /^(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(.[0-9]{1,3})?$/; -const parseTime = value => { +const parseTime = (value) => { if (dates.isDate(value)) return dates.format(value, 'HH:mm:ss.SSS'); if (typeof value !== 'string') { @@ -23,10 +23,10 @@ const parseTime = value => { return `${hours}:${minutes}:${seconds}.${fractionPart}`; }; -const parseDate = value => { +const parseDate = (value) => { if (dates.isDate(value)) return dates.format(value, 'yyyy-MM-dd'); try { - let date = dates.parseISO(value); + const date = dates.parseISO(value); if (dates.isValid(date)) return dates.format(date, 'yyyy-MM-dd'); @@ -36,7 +36,7 @@ const parseDate = value => { } }; -const parseDateTimeOrTimestamp = value => { +const parseDateTimeOrTimestamp = (value) => { if (dates.isDate(value)) return value; try { const date = dates.parseISO(value); diff --git a/packages/core/utils/lib/pipe-async.js b/packages/core/utils/lib/pipe-async.js index da0fd6f849..213a96a979 100644 --- a/packages/core/utils/lib/pipe-async.js +++ b/packages/core/utils/lib/pipe-async.js @@ -1,11 +1,13 @@ 'use strict'; -module.exports = (...methods) => async data => { - let res = data; +module.exports = + (...methods) => + async (data) => { + let res = data; - for (const method of methods) { - res = await method(res); - } + for (const method of methods) { + res = await method(res); + } - return res; -}; + return res; + }; diff --git a/packages/core/utils/lib/policy.js b/packages/core/utils/lib/policy.js index 5474e9c1ec..1a5551fadf 100644 --- a/packages/core/utils/lib/policy.js +++ b/packages/core/utils/lib/policy.js @@ -1,6 +1,7 @@ /** * Policies util */ + 'use strict'; const _ = require('lodash'); @@ -9,7 +10,7 @@ const { eq } = require('lodash/fp'); const PLUGIN_PREFIX = 'plugin::'; const API_PREFIX = 'api::'; -const parsePolicy = policy => { +const parsePolicy = (policy) => { if (typeof policy === 'string') { return { policyName: policy, config: {} }; } @@ -43,7 +44,7 @@ const globalPolicy = ({ method, endpoint, controller, action, plugin }) => { }; const resolvePolicies = (config, { pluginName, apiName } = {}) => { - return config.map(policyConfig => { + return config.map((policyConfig) => { return { handler: getPolicy(policyConfig, { pluginName, apiName }), config: policyConfig.config || {}, @@ -87,10 +88,10 @@ const getPolicy = (policyConfig, { pluginName, apiName } = {}) => { return policy.handler; }; -const createPolicy = options => { +const createPolicy = (options) => { const { name = 'unnamed', validator, handler } = options; - const wrappedValidator = config => { + const wrappedValidator = (config) => { if (validator) { try { validator(config); diff --git a/packages/core/utils/lib/print-value.js b/packages/core/utils/lib/print-value.js index 0645e99f61..7a61bebc7c 100644 --- a/packages/core/utils/lib/print-value.js +++ b/packages/core/utils/lib/print-value.js @@ -3,7 +3,7 @@ // Code copied from the yup library (https://github.com/jquense/yup) // https://github.com/jquense/yup/blob/2778b88bdacd5260d593c6468793da2e77daf21f/src/util/printValue.ts -const toString = Object.prototype.toString; +const { toString } = Object.prototype; const errorToString = Error.prototype.toString; const regExpToString = RegExp.prototype.toString; const symbolToString = typeof Symbol !== 'undefined' ? Symbol.prototype.toString : () => ''; @@ -13,34 +13,34 @@ const SYMBOL_REGEXP = /^Symbol\((.*)\)(.*)$/; function printNumber(val) { if (val != +val) return 'NaN'; const isNegativeZero = val === 0 && 1 / val < 0; - return isNegativeZero ? '-0' : '' + val; + return isNegativeZero ? '-0' : `${val}`; } function printSimpleValue(val, quoteStrings = false) { - if (val == null || val === true || val === false) return '' + val; + if (val == null || val === true || val === false) return `${val}`; const typeOf = typeof val; if (typeOf === 'number') return printNumber(val); if (typeOf === 'string') return quoteStrings ? `"${val}"` : val; - if (typeOf === 'function') return '[Function ' + (val.name || 'anonymous') + ']'; + if (typeOf === 'function') return `[Function ${val.name || 'anonymous'}]`; if (typeOf === 'symbol') return symbolToString.call(val).replace(SYMBOL_REGEXP, 'Symbol($1)'); const tag = toString.call(val).slice(8, -1); - if (tag === 'Date') return isNaN(val.getTime()) ? '' + val : val.toISOString(val); - if (tag === 'Error' || val instanceof Error) return '[' + errorToString.call(val) + ']'; + if (tag === 'Date') return Number.isNaN(val.getTime()) ? `${val}` : val.toISOString(val); + if (tag === 'Error' || val instanceof Error) return `[${errorToString.call(val)}]`; if (tag === 'RegExp') return regExpToString.call(val); return null; } function printValue(value, quoteStrings) { - let result = printSimpleValue(value, quoteStrings); + const result = printSimpleValue(value, quoteStrings); if (result !== null) return result; return JSON.stringify( value, - function(key, value) { - let result = printSimpleValue(this[key], quoteStrings); + function replacer(key, value) { + const result = printSimpleValue(this[key], quoteStrings); if (result !== null) return result; return value; }, diff --git a/packages/core/utils/lib/provider-factory.js b/packages/core/utils/lib/provider-factory.js index b6a3f0709b..2bc695ad26 100644 --- a/packages/core/utils/lib/provider-factory.js +++ b/packages/core/utils/lib/provider-factory.js @@ -96,7 +96,7 @@ const providerFactory = (options = {}) => { return items; } - return items.filter(item => { + return items.filter((item) => { return filtersEntries.every(([key, value]) => item[key] === value); }); }, diff --git a/packages/core/utils/lib/relations.js b/packages/core/utils/lib/relations.js index 0eef9fefba..816cbdeb33 100644 --- a/packages/core/utils/lib/relations.js +++ b/packages/core/utils/lib/relations.js @@ -2,8 +2,8 @@ const MANY_RELATIONS = ['oneToMany', 'manyToMany']; -const getRelationalFields = contentType => { - return Object.keys(contentType.attributes).filter(attributeName => { +const getRelationalFields = (contentType) => { + return Object.keys(contentType.attributes).filter((attributeName) => { return contentType.attributes[attributeName].type === 'relation'; }); }; diff --git a/packages/core/utils/lib/sanitize/index.js b/packages/core/utils/lib/sanitize/index.js index a97be07ca5..11735c1efe 100644 --- a/packages/core/utils/lib/sanitize/index.js +++ b/packages/core/utils/lib/sanitize/index.js @@ -13,7 +13,7 @@ module.exports = { contentAPI: { input(data, schema, { auth } = {}) { if (isArray(data)) { - return Promise.all(data.map(entry => this.input(entry, schema, { auth }))); + return Promise.all(data.map((entry) => this.input(entry, schema, { auth }))); } const nonWritableAttributes = getNonWritableAttributes(schema); @@ -31,14 +31,14 @@ module.exports = { // Apply sanitizers from registry if exists strapi.sanitizers .get('content-api.input') - .forEach(sanitizer => transforms.push(sanitizer(schema))); + .forEach((sanitizer) => transforms.push(sanitizer(schema))); return pipeAsync(...transforms)(data); }, output(data, schema, { auth } = {}) { if (isArray(data)) { - return Promise.all(data.map(entry => this.output(entry, schema, { auth }))); + return Promise.all(data.map((entry) => this.output(entry, schema, { auth }))); } const transforms = [sanitizers.defaultSanitizeOutput(schema)]; @@ -50,7 +50,7 @@ module.exports = { // Apply sanitizers from registry if exists strapi.sanitizers .get('content-api.output') - .forEach(sanitizer => transforms.push(sanitizer(schema))); + .forEach((sanitizer) => transforms.push(sanitizer(schema))); return pipeAsync(...transforms)(data); }, diff --git a/packages/core/utils/lib/sanitize/visitors/allowed-fields.js b/packages/core/utils/lib/sanitize/visitors/allowed-fields.js index 4f03e7c687..868c22cea5 100644 --- a/packages/core/utils/lib/sanitize/visitors/allowed-fields.js +++ b/packages/core/utils/lib/sanitize/visitors/allowed-fields.js @@ -2,68 +2,70 @@ const { isArray, toPath } = require('lodash/fp'); -module.exports = (allowedFields = null) => ({ key, path }, { remove }) => { - // All fields are allowed - if (allowedFields === null) { - return; - } +module.exports = + (allowedFields = null) => + ({ key, path }, { remove }) => { + // All fields are allowed + if (allowedFields === null) { + return; + } - // Ignore invalid formats - if (!isArray(allowedFields)) { - return; - } + // Ignore invalid formats + if (!isArray(allowedFields)) { + return; + } - const containedPaths = getContainedPaths(path); + const containedPaths = getContainedPaths(path); - /** - * Tells if the current path should be kept or not based - * on the success of the check functions for any of the allowed paths. - * - * The check functions are defined as follow: - * - * `containedPaths.includes(p)` - * @example - * ```js - * const path = 'foo.bar.field'; - * const p = 'foo.bar'; - * // it should match - * - * const path = 'foo.bar.field'; - * const p = 'bar.foo'; - * // it shouldn't match - * - * const path = 'foo.bar'; - * const p = 'foo.bar.field'; - * // it should match but isn't handled by this check - * ``` - * - * `p.startsWith(`${path}.`)` - * @example - * ```js - * const path = 'foo.bar'; - * const p = 'foo.bar.field'; - * // it should match - * - * const path = 'foo.bar.field'; - * const p = 'bar.foo'; - * // it shouldn't match - * - * const path = 'foo.bar.field'; - * const p = 'foo.bar'; - * // it should match but isn't handled by this check - * ``` - */ - const isPathAllowed = allowedFields.some( - p => containedPaths.includes(p) || p.startsWith(`${path}.`) - ); + /** + * Tells if the current path should be kept or not based + * on the success of the check functions for any of the allowed paths. + * + * The check functions are defined as follow: + * + * `containedPaths.includes(p)` + * @example + * ```js + * const path = 'foo.bar.field'; + * const p = 'foo.bar'; + * // it should match + * + * const path = 'foo.bar.field'; + * const p = 'bar.foo'; + * // it shouldn't match + * + * const path = 'foo.bar'; + * const p = 'foo.bar.field'; + * // it should match but isn't handled by this check + * ``` + * + * `p.startsWith(`${path}.`)` + * @example + * ```js + * const path = 'foo.bar'; + * const p = 'foo.bar.field'; + * // it should match + * + * const path = 'foo.bar.field'; + * const p = 'bar.foo'; + * // it shouldn't match + * + * const path = 'foo.bar.field'; + * const p = 'foo.bar'; + * // it should match but isn't handled by this check + * ``` + */ + const isPathAllowed = allowedFields.some( + (p) => containedPaths.includes(p) || p.startsWith(`${path}.`) + ); - if (isPathAllowed) { - return; - } + if (isPathAllowed) { + return; + } - // Remove otherwise - remove(key); -}; + // Remove otherwise + remove(key); + }; /** * Retrieve the list of allowed paths based on the given path @@ -83,7 +85,7 @@ module.exports = (allowedFields = null) => ({ key, path }, { remove }) => { * // ['foo', 'foo.bar', 'foo.bar.field'] * ``` */ -const getContainedPaths = path => { +const getContainedPaths = (path) => { const parts = toPath(path); return parts.reduce((acc, value, index, list) => { diff --git a/packages/core/utils/lib/sanitize/visitors/remove-restricted-relations.js b/packages/core/utils/lib/sanitize/visitors/remove-restricted-relations.js index 1c717dcadf..7325368f4c 100644 --- a/packages/core/utils/lib/sanitize/visitors/remove-restricted-relations.js +++ b/packages/core/utils/lib/sanitize/visitors/remove-restricted-relations.js @@ -4,63 +4,65 @@ const ACTIONS_TO_VERIFY = ['find']; const { CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE } = require('../../content-types').constants; -module.exports = auth => async ({ data, key, attribute, schema }, { remove, set }) => { - const isRelation = attribute.type === 'relation'; +module.exports = + (auth) => + async ({ data, key, attribute, schema }, { remove, set }) => { + const isRelation = attribute.type === 'relation'; - if (!isRelation) { - return; - } + if (!isRelation) { + return; + } - const handleMorphRelation = async () => { - const newMorphValue = []; + const handleMorphRelation = async () => { + const newMorphValue = []; + + for (const element of data[key]) { + const scopes = ACTIONS_TO_VERIFY.map((action) => `${element.__type}.${action}`); + const isAllowed = await hasAccessToSomeScopes(scopes, auth); + + if (isAllowed) { + newMorphValue.push(element); + } + } + + // If the new value is empty, remove the relation completely + if (newMorphValue.length === 0) { + remove(key); + } else { + set(key, newMorphValue); + } + }; + + const handleRegularRelation = async () => { + const scopes = ACTIONS_TO_VERIFY.map((action) => `${attribute.target}.${action}`); - for (const element of data[key]) { - const scopes = ACTIONS_TO_VERIFY.map(action => `${element.__type}.${action}`); const isAllowed = await hasAccessToSomeScopes(scopes, auth); - if (isAllowed) { - newMorphValue.push(element); + // If the authenticated user don't have access to any of the scopes, then remove the field + if (!isAllowed) { + remove(key); } + }; + + const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph'); + const isCreatorRelation = [CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE].includes(key); + + // Polymorphic relations + if (isMorphRelation) { + await handleMorphRelation(); + return; } - // If the new value is empty, remove the relation completely - if (newMorphValue.length === 0) { - remove(key); - } else { - set(key, newMorphValue); + // Creator relations + if (isCreatorRelation && schema.options.populateCreatorFields) { + // do nothing + return; } + + // Regular relations + await handleRegularRelation(); }; - const handleRegularRelation = async () => { - const scopes = ACTIONS_TO_VERIFY.map(action => `${attribute.target}.${action}`); - - const isAllowed = await hasAccessToSomeScopes(scopes, auth); - - // If the authenticated user don't have access to any of the scopes, then remove the field - if (!isAllowed) { - remove(key); - } - }; - - const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph'); - const isCreatorRelation = [CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE].includes(key); - - // Polymorphic relations - if (isMorphRelation) { - await handleMorphRelation(); - return; - } - - // Creator relations - if (isCreatorRelation && schema.options.populateCreatorFields) { - // do nothing - return; - } - - // Regular relations - await handleRegularRelation(); -}; - const hasAccessToSomeScopes = async (scopes, auth) => { for (const scope of scopes) { try { diff --git a/packages/core/utils/lib/sanitize/visitors/restricted-fields.js b/packages/core/utils/lib/sanitize/visitors/restricted-fields.js index d3f1805d5f..b474cb0d89 100644 --- a/packages/core/utils/lib/sanitize/visitors/restricted-fields.js +++ b/packages/core/utils/lib/sanitize/visitors/restricted-fields.js @@ -2,30 +2,31 @@ const { isArray } = require('lodash/fp'); -module.exports = (restrictedFields = null) => ({ key, path }, { remove }) => { - // Remove all fields - if (restrictedFields === null) { - remove(key); - return; - } +module.exports = + (restrictedFields = null) => + ({ key, path }, { remove }) => { + // Remove all fields + if (restrictedFields === null) { + remove(key); + return; + } - // Ignore invalid formats - if (!isArray(restrictedFields)) { - return; - } + // Ignore invalid formats + if (!isArray(restrictedFields)) { + return; + } - // Remove if an exact match was found - if (restrictedFields.includes(path)) { - remove(key); - return; - } + // Remove if an exact match was found + if (restrictedFields.includes(path)) { + remove(key); + return; + } - // Remove nested matches - const isRestrictedNested = restrictedFields.some(allowedPath => - path.startsWith(`${allowedPath}.`) - ); - if (isRestrictedNested) { - remove(key); - return; - } -}; + // Remove nested matches + const isRestrictedNested = restrictedFields.some((allowedPath) => + path.startsWith(`${allowedPath}.`) + ); + if (isRestrictedNested) { + remove(key); + } + }; diff --git a/packages/core/utils/lib/set-creator-fields.js b/packages/core/utils/lib/set-creator-fields.js index 31daef83fd..ff20080198 100644 --- a/packages/core/utils/lib/set-creator-fields.js +++ b/packages/core/utils/lib/set-creator-fields.js @@ -3,13 +3,15 @@ const { assign, assoc } = require('lodash/fp'); const { CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE } = require('./content-types').constants; -module.exports = ({ user, isEdition = false }) => data => { - if (isEdition) { - return assoc(UPDATED_BY_ATTRIBUTE, user.id, data); - } +module.exports = + ({ user, isEdition = false }) => + (data) => { + if (isEdition) { + return assoc(UPDATED_BY_ATTRIBUTE, user.id, data); + } - return assign(data, { - [CREATED_BY_ATTRIBUTE]: user.id, - [UPDATED_BY_ATTRIBUTE]: user.id, - }); -}; + return assign(data, { + [CREATED_BY_ATTRIBUTE]: user.id, + [UPDATED_BY_ATTRIBUTE]: user.id, + }); + }; diff --git a/packages/core/utils/lib/string-formatting.js b/packages/core/utils/lib/string-formatting.js index dbef3c2413..9e4e9c0b5e 100644 --- a/packages/core/utils/lib/string-formatting.js +++ b/packages/core/utils/lib/string-formatting.js @@ -1,4 +1,5 @@ 'use strict'; + const _ = require('lodash'); const { trimChars, trimCharsEnd, trimCharsStart } = require('lodash/fp'); const slugify = require('@sindresorhus/slugify'); @@ -6,9 +7,9 @@ const { kebabCase } = require('lodash'); const nameToSlug = (name, options = { separator: '-' }) => slugify(name, options); -const nameToCollectionName = name => slugify(name, { separator: '_' }); +const nameToCollectionName = (name) => slugify(name, { separator: '_' }); -const toRegressedEnumValue = value => +const toRegressedEnumValue = (value) => slugify(value, { decamelize: false, lowercase: false, @@ -16,14 +17,14 @@ const toRegressedEnumValue = value => }); const getCommonBeginning = (...strings) => - _.takeWhile(strings[0], (char, index) => strings.every(string => string[index] === char)).join( + _.takeWhile(strings[0], (char, index) => strings.every((string) => string[index] === char)).join( '' ); const getCommonPath = (...paths) => { - const [segments, ...otherSegments] = paths.map(it => _.split(it, '/')); + const [segments, ...otherSegments] = paths.map((it) => _.split(it, '/')); return _.join( - _.takeWhile(segments, (str, index) => otherSegments.every(it => it[index] === str)), + _.takeWhile(segments, (str, index) => otherSegments.every((it) => it[index] === str)), '/' ); }; @@ -42,9 +43,9 @@ const escapeQuery = (query, charsToEscape, escapeChar = '\\') => { const stringIncludes = (arr, val) => arr.map(String).includes(String(val)); const stringEquals = (a, b) => String(a) === String(b); -const isCamelCase = value => /^[a-z][a-zA-Z0-9]+$/.test(value); -const isKebabCase = value => /^([a-z][a-z0-9]*)(-[a-z0-9]+)*$/.test(value); -const startsWithANumber = value => /^[0-9]/.test(value); +const isCamelCase = (value) => /^[a-z][a-zA-Z0-9]+$/.test(value); +const isKebabCase = (value) => /^([a-z][a-z0-9]*)(-[a-z0-9]+)*$/.test(value); +const startsWithANumber = (value) => /^[0-9]/.test(value); const joinBy = (joint, ...args) => { const trim = trimChars(joint); @@ -59,7 +60,7 @@ const joinBy = (joint, ...args) => { }, ''); }; -const toKebabCase = value => kebabCase(value); +const toKebabCase = (value) => kebabCase(value); module.exports = { nameToSlug, diff --git a/packages/core/utils/lib/template-configuration.js b/packages/core/utils/lib/template-configuration.js index bd375edb70..5e70290598 100644 --- a/packages/core/utils/lib/template-configuration.js +++ b/packages/core/utils/lib/template-configuration.js @@ -19,7 +19,7 @@ const templateConfiguration = (obj, configPath = '') => { !excludeConfigPaths.includes(configPath.substr(1)) && obj[key].match(regex) !== null ) { - // eslint-disable-next-line prefer-template + // eslint-disable-next-line prefer-template, no-eval acc[key] = eval('`' + obj[key] + '`'); } else { acc[key] = obj[key]; diff --git a/packages/core/utils/lib/traverse-entity.js b/packages/core/utils/lib/traverse-entity.js index e8a9026628..922dd3a90b 100644 --- a/packages/core/utils/lib/traverse-entity.js +++ b/packages/core/utils/lib/traverse-entity.js @@ -46,7 +46,7 @@ const traverseEntity = async (visitor, options, entity) => { if (isRelation) { const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph'); - const traverseTarget = entry => { + const traverseTarget = (entry) => { // Handle polymorphic relationships const targetSchemaUID = isMorphRelation ? entry.__type : attribute.target; const targetSchema = strapi.getModel(targetSchemaUID); @@ -63,7 +63,7 @@ const traverseEntity = async (visitor, options, entity) => { } if (isMedia) { - const traverseTarget = entry => { + const traverseTarget = (entry) => { const targetSchemaUID = 'plugin::upload.file'; const targetSchema = strapi.getModel(targetSchemaUID); @@ -82,7 +82,7 @@ const traverseEntity = async (visitor, options, entity) => { const targetSchema = strapi.getModel(attribute.component); const traverseOptions = { schema: targetSchema, path: newPath }; - const traverseComponent = entry => traverseEntity(visitor, traverseOptions, entry); + const traverseComponent = (entry) => traverseEntity(visitor, traverseOptions, entry); copy[key] = isArray(value) ? await Promise.all(value.map(traverseComponent)) @@ -90,7 +90,7 @@ const traverseEntity = async (visitor, options, entity) => { } if (isDynamicZone && isArray(value)) { - const visitDynamicZoneEntry = entry => { + const visitDynamicZoneEntry = (entry) => { const targetSchema = strapi.getModel(entry.__component); const traverseOptions = { schema: targetSchema, path: newPath }; diff --git a/packages/core/utils/lib/validators.js b/packages/core/utils/lib/validators.js index 59d7a4381e..f5e40d40f0 100644 --- a/packages/core/utils/lib/validators.js +++ b/packages/core/utils/lib/validators.js @@ -9,34 +9,38 @@ const printValue = require('./print-value'); const MixedSchemaType = yup.MixedSchema; -const isNotNilTest = value => !_.isNil(value); +const isNotNilTest = (value) => !_.isNil(value); function isNotNill(msg = '${path} must be defined.') { return this.test('defined', msg, isNotNilTest); } -const isNotNullTest = value => !_.isNull(value); +const isNotNullTest = (value) => !_.isNull(value); function isNotNull(msg = '${path} cannot be null.') { return this.test('defined', msg, isNotNullTest); } function isFunction(message = '${path} is not a function') { - return this.test('is a function', message, value => _.isUndefined(value) || _.isFunction(value)); + return this.test( + 'is a function', + message, + (value) => _.isUndefined(value) || _.isFunction(value) + ); } function isCamelCase(message = '${path} is not in camel case (anExampleOfCamelCase)') { - return this.test('is in camelCase', message, value => utils.isCamelCase(value)); + return this.test('is in camelCase', message, (value) => utils.isCamelCase(value)); } function isKebabCase(message = '${path} is not in kebab case (an-example-of-kebab-case)') { - return this.test('is in kebab-case', message, value => utils.isKebabCase(value)); + return this.test('is in kebab-case', message, (value) => utils.isKebabCase(value)); } function onlyContainsFunctions(message = '${path} contains values that are not functions') { return this.test( 'only contains functions', message, - value => _.isUndefined(value) || (value && Object.values(value).every(_.isFunction)) + (value) => _.isUndefined(value) || (value && Object.values(value).every(_.isFunction)) ); } @@ -65,33 +69,38 @@ const handleYupError = (error, errorMessage) => { const defaultValidationParam = { strict: true, abortEarly: false }; -const validateYupSchema = (schema, options = {}) => async (body, errorMessage) => { - try { - const optionsWithDefaults = defaults(defaultValidationParam, options); - return await schema.validate(body, optionsWithDefaults); - } catch (e) { - handleYupError(e, errorMessage); - } -}; +const validateYupSchema = + (schema, options = {}) => + async (body, errorMessage) => { + try { + const optionsWithDefaults = defaults(defaultValidationParam, options); + return await schema.validate(body, optionsWithDefaults); + } catch (e) { + handleYupError(e, errorMessage); + } + }; -const validateYupSchemaSync = (schema, options = {}) => (body, errorMessage) => { - try { - const optionsWithDefaults = defaults(defaultValidationParam, options); - return schema.validateSync(body, optionsWithDefaults); - } catch (e) { - handleYupError(e, errorMessage); - } -}; +const validateYupSchemaSync = + (schema, options = {}) => + (body, errorMessage) => { + try { + const optionsWithDefaults = defaults(defaultValidationParam, options); + return schema.validateSync(body, optionsWithDefaults); + } catch (e) { + handleYupError(e, errorMessage); + } + }; // Temporary fix of this issue : https://github.com/jquense/yup/issues/616 yup.setLocale({ mixed: { notType({ path, type, value, originalValue }) { - let isCast = originalValue != null && originalValue !== value; - let msg = + const isCast = originalValue != null && originalValue !== value; + const msg = `${path} must be a \`${type}\` type, ` + - `but the final value was: \`${printValue(value, true)}\`` + - (isCast ? ` (cast from the value \`${printValue(originalValue, true)}\`).` : '.'); + `but the final value was: \`${printValue(value, true)}\`${ + isCast ? ` (cast from the value \`${printValue(originalValue, true)}\`).` : '.' + }`; /* Remove comment that is not supposed to be seen by the enduser if (value === null) { diff --git a/packages/generators/admin/component/index.js b/packages/generators/admin/component/index.js index e7bd61640f..0575045c77 100644 --- a/packages/generators/admin/component/index.js +++ b/packages/generators/admin/component/index.js @@ -39,25 +39,25 @@ const prompts = [ type: 'input', name: 'htmlTag', message: 'Which HTML tag should be used as a base?', - when: answers => answers.styled, - validate: htmlTag => (!htmlTag ? 'The HTML tag cannot be empty.' : true), + when: (answers) => answers.styled, + validate: (htmlTag) => (!htmlTag ? 'The HTML tag cannot be empty.' : true), filter: lowerCase, }, { type: 'confirm', name: 'useI18n', message: 'Will it use i18n?', - when: answers => !answers.styled, + when: (answers) => !answers.styled, }, { type: 'confirm', name: 'useRedux', message: 'Will it use Redux?', - when: answers => !answers.styled, + when: (answers) => !answers.styled, }, ]; -const actions = answers => { +const actions = (answers) => { const { useRedux } = answers; const [pluginFolder, plugin] = answers.plugin.split('/'); answers.plugin = plugin; diff --git a/packages/generators/admin/plopfile.js b/packages/generators/admin/plopfile.js index 54b0f15d27..4aee0f43d4 100644 --- a/packages/generators/admin/plopfile.js +++ b/packages/generators/admin/plopfile.js @@ -1,12 +1,14 @@ 'use strict'; +/* eslint-disable eqeqeq */ + const { ESLint } = require('eslint'); const componentGenerator = require('./component'); // This is used to be able to indent block inside Handlebars helpers and improve templates visibility. // It's not very robust, and forces you to use 2 spaces indentation inside for your blocks. // If it become a pain don't hesitate to remove it. -const leftShift = str => str.replace(/^ {2}/gm, ''); +const leftShift = (str) => str.replace(/^ {2}/gm, ''); const evaluateExpression = (a, operator, b) => { switch (operator) { @@ -35,44 +37,45 @@ const evaluateExpression = (a, operator, b) => { } }; -// ! Don't use arrow functions to register Handlebars helpers -module.exports = function( - /** @type {import('plop').NodePlopAPI} */ - plop -) { - plop.setHelper('if', function(/* ...args, options */) { - const end = arguments.length - 1; - const { fn, inverse } = arguments[end]; - if (arguments.length === 2) { - const condition = arguments[0]; +/** + * @param {import('plop').NodePlopAPI} plop + */ +module.exports = function generator(plop) { + plop.setHelper('if', (...args) => { + const end = args.length - 1; + const { fn, inverse } = args[end]; + if (args.length === 2) { + const condition = args[0]; return leftShift(condition ? fn(this) : inverse(this)); - } else { - const [a, operator, b] = Array.from(arguments).slice(0, end); - return leftShift(evaluateExpression(a, operator, b) ? fn(this) : inverse(this)); } + const [a, operator, b] = Array.from(args).slice(0, end); + return leftShift(evaluateExpression(a, operator, b) ? fn(this) : inverse(this)); }); - plop.setHelper('unless', function(/* ...args, options */) { - const end = arguments.length - 1; - const { fn, inverse } = arguments[end]; - if (arguments.length === 2) { - const condition = arguments[0]; + + plop.setHelper('unless', (...args) => { + const end = args.length - 1; + const { fn, inverse } = args[end]; + if (args.length === 2) { + const condition = args[0]; return leftShift(!condition ? fn(this) : inverse(this)); - } else { - const [a, operator, b] = Array.from(arguments).slice(0, end); - return leftShift(!evaluateExpression(a, operator, b) ? fn(this) : inverse(this)); } + const [a, operator, b] = Array.from(args).slice(0, end); + return leftShift(!evaluateExpression(a, operator, b) ? fn(this) : inverse(this)); }); - plop.setHelper('else', function(_, { fn }) { + + plop.setHelper('else', (_, { fn }) => { return leftShift(fn(this)); }); - plop.setActionType('lint', async function(answers, config, plopfileApi) { + + plop.setActionType('lint', async (answers, config, plopfileApi) => { const { files } = config; - const patterns = files.map(file => plopfileApi.renderString(file, answers)); + const patterns = files.map((file) => plopfileApi.renderString(file, answers)); const eslint = new ESLint({ fix: true }); const results = await eslint.lintFiles(patterns); await ESLint.outputFixes(results); return 'Linting errors autofixed.'; }); + plop.setGenerator('component', componentGenerator); }; diff --git a/packages/generators/admin/utils/fileExistsInPackages.js b/packages/generators/admin/utils/fileExistsInPackages.js index 26174de5a6..c23023d2cc 100644 --- a/packages/generators/admin/utils/fileExistsInPackages.js +++ b/packages/generators/admin/utils/fileExistsInPackages.js @@ -4,7 +4,7 @@ const fs = require('fs'); const { join } = require('path'); const packagesFolder = require('./packagesFolder'); -const fileExistsInPackages = path => +const fileExistsInPackages = (path) => fs.promises .access(join(packagesFolder, path)) .then(() => true) diff --git a/packages/generators/admin/utils/getPluginList.js b/packages/generators/admin/utils/getPluginList.js index edc5cb2346..c74fafacf2 100644 --- a/packages/generators/admin/utils/getPluginList.js +++ b/packages/generators/admin/utils/getPluginList.js @@ -19,7 +19,7 @@ const getPluginList = () => { reject(err); } - const extendsAdmin = match => fileExistsInPackages(`${match}/admin/src`); + const extendsAdmin = (match) => fileExistsInPackages(`${match}/admin/src`); resolve(await asyncFilter(matches, extendsAdmin)); } diff --git a/packages/generators/app/lib/create-cli-db-project.js b/packages/generators/app/lib/create-cli-db-project.js index 5c5f6eb926..5f943ed81f 100644 --- a/packages/generators/app/lib/create-cli-db-project.js +++ b/packages/generators/app/lib/create-cli-db-project.js @@ -8,11 +8,11 @@ const clientDependencies = require('./utils/db-client-dependencies'); const getClientName = require('./utils/db-client-name'); const createProject = require('./create-project'); -module.exports = async scope => { +module.exports = async (scope) => { console.log('Creating a project from the database CLI arguments.'); await trackUsage({ event: 'didChooseCustomDatabase', scope }); - const client = scope.database.client; + const { client } = scope.database; const configuration = { client: getClientName({ client }), connection: merge({}, defaultConfigs[client] || {}, scope.database), diff --git a/packages/generators/app/lib/create-customized-project.js b/packages/generators/app/lib/create-customized-project.js index 19fca39f8c..b48aad4106 100644 --- a/packages/generators/app/lib/create-customized-project.js +++ b/packages/generators/app/lib/create-customized-project.js @@ -1,4 +1,5 @@ /* eslint-disable no-unreachable */ + 'use strict'; const { join } = require('path'); @@ -19,7 +20,7 @@ const LANGUAGES = { typescript: 'TypeScript', }; -module.exports = async scope => { +module.exports = async (scope) => { if (!scope.useTypescript) { const language = await askAboutLanguages(scope); scope.useTypescript = language === LANGUAGES.typescript; @@ -27,7 +28,7 @@ module.exports = async scope => { await trackUsage({ event: 'didChooseCustomDatabase', scope }); - const configuration = await askDbInfosAndTest(scope).catch(error => { + const configuration = await askDbInfosAndTest(scope).catch((error) => { return trackUsage({ event: 'didNotConnectDatabase', scope, error }).then(() => { throw error; }); @@ -57,7 +58,7 @@ async function askDbInfosAndTest(scope) { scope, configuration, }) - .then(result => { + .then((result) => { if (result && result.shouldRetry === true && retries < MAX_RETRIES - 1) { console.log('Retrying...'); retries++; @@ -66,14 +67,14 @@ async function askDbInfosAndTest(scope) { }) .then( () => fse.remove(scope.tmpPath), - err => { + (err) => { return fse.remove(scope.tmpPath).then(() => { throw err; }); } ) .then(() => configuration) - .catch(err => { + .catch((err) => { if (retries < MAX_RETRIES - 1) { console.log(); console.log(`⛔️ Connection test failed: ${err.message}`); @@ -137,7 +138,7 @@ async function askDatabaseInfos(scope) { }, ]); - const responses = await inquirer.prompt(dbQuestions[client].map(q => q({ scope, client }))); + const responses = await inquirer.prompt(dbQuestions[client].map((q) => q({ scope, client }))); const connection = merge({}, defaultConfigs[client] || {}, { client, @@ -151,8 +152,8 @@ async function askDatabaseInfos(scope) { } async function installDatabaseTestingDep({ scope, configuration }) { - let packageManager = scope.useYarn ? 'yarnpkg' : 'npm'; - let cmd = scope.useYarn + const packageManager = scope.useYarn ? 'yarnpkg' : 'npm'; + const cmd = scope.useYarn ? ['--cwd', scope.tmpPath, 'add'] : ['install', '--prefix', scope.tmpPath]; @@ -161,7 +162,7 @@ async function installDatabaseTestingDep({ scope, configuration }) { await fse.ensureDir(scope.tmpPath); } - const deps = Object.keys(configuration.dependencies).map(dep => { + const deps = Object.keys(configuration.dependencies).map((dep) => { return `${dep}@${configuration.dependencies[dep]}`; }); diff --git a/packages/generators/app/lib/create-project.js b/packages/generators/app/lib/create-project.js index 5d1a0b779b..8440bd3b7b 100644 --- a/packages/generators/app/lib/create-project.js +++ b/packages/generators/app/lib/create-project.js @@ -34,11 +34,11 @@ module.exports = async function createProject(scope, { client, connection, depen // copy dot files await fse.writeFile(join(rootPath, '.env'), createEnvFile()); - const copyDotFilesFromSubDirectory = subDirectory => { + const copyDotFilesFromSubDirectory = (subDirectory) => { const files = fse.readdirSync(join(resources, 'dot-files', subDirectory)); return Promise.all( - files.map(file => { + files.map((file) => { const src = join(resources, 'dot-files', subDirectory, file); const dest = join(rootPath, `.${file}`); return fse.copy(src, dest); @@ -129,10 +129,7 @@ module.exports = async function createProject(scope, { client, connection, depen const loader = ora(installPrefix).start(); const logInstall = (chunk = '') => { - loader.text = `${installPrefix} ${chunk - .toString() - .split('\n') - .join(' ')}`; + loader.text = `${installPrefix} ${chunk.toString().split('\n').join(' ')}`; }; try { diff --git a/packages/generators/app/lib/generate-new.js b/packages/generators/app/lib/generate-new.js index 82a907380f..932a309cc2 100644 --- a/packages/generators/app/lib/generate-new.js +++ b/packages/generators/app/lib/generate-new.js @@ -10,7 +10,7 @@ const createCLIDatabaseProject = require('./create-cli-db-project'); const createCustomizedProject = require('./create-customized-project'); const createQuickStartProject = require('./create-quickstart-project'); -module.exports = async scope => { +module.exports = async (scope) => { const hasDatabaseConfig = Boolean(scope.database); // check rootPath is empty diff --git a/packages/generators/app/lib/index.js b/packages/generators/app/lib/index.js index 3fb6e42d42..572e7ffec8 100644 --- a/packages/generators/app/lib/index.js +++ b/packages/generators/app/lib/index.js @@ -32,7 +32,7 @@ const generateNewApp = (projectDirectory, cliArguments) => { rootPath, name: basename(rootPath), // disable quickstart run app after creation - runQuickstartApp: cliArguments.run === false ? false : true, + runQuickstartApp: cliArguments.run !== false, // use pacakge version as strapiVersion (all packages have the same version); strapiVersion: require('../package.json').version, debug: cliArguments.debug !== undefined, @@ -58,7 +58,7 @@ const generateNewApp = (projectDirectory, cliArguments) => { useTypescript: Boolean(cliArguments.typescript), }; - sentry.configureScope(function(sentryScope) { + sentry.configureScope(function scope(sentryScope) { const tags = { os_type: os.type(), os_platform: os.platform(), @@ -68,7 +68,7 @@ const generateNewApp = (projectDirectory, cliArguments) => { docker: scope.docker, }; - Object.keys(tags).forEach(tag => { + Object.keys(tags).forEach((tag) => { sentryScope.setTag(tag, tags[tag]); }); }); @@ -76,7 +76,7 @@ const generateNewApp = (projectDirectory, cliArguments) => { parseDatabaseArguments({ scope, args: cliArguments }); initCancelCatcher(scope); - return generateNew(scope).catch(error => { + return generateNew(scope).catch((error) => { console.error(error); return captureException(error).then(() => { return trackError({ scope, error }).then(() => { @@ -94,7 +94,7 @@ function initCancelCatcher() { output: process.stdout, }); - rl.on('SIGINT', function() { + rl.on('SIGINT', function sigint() { process.emit('SIGINT'); }); } diff --git a/packages/generators/app/lib/resources/files/js/src/admin/app.example.js b/packages/generators/app/lib/resources/files/js/src/admin/app.example.js index 7d6a8ead3c..45cad61805 100644 --- a/packages/generators/app/lib/resources/files/js/src/admin/app.example.js +++ b/packages/generators/app/lib/resources/files/js/src/admin/app.example.js @@ -29,7 +29,7 @@ const config = { ], }; -const bootstrap = app => { +const bootstrap = (app) => { console.log(app); }; diff --git a/packages/generators/app/lib/resources/json/common/package.json.js b/packages/generators/app/lib/resources/json/common/package.json.js index 7760415ddb..66e04d9cae 100644 --- a/packages/generators/app/lib/resources/json/common/package.json.js +++ b/packages/generators/app/lib/resources/json/common/package.json.js @@ -5,7 +5,7 @@ * with basic info, dependencies, etc. */ -module.exports = opts => { +module.exports = (opts) => { const { strapiDependencies, additionalsDependencies, @@ -28,14 +28,13 @@ module.exports = opts => { strapi: 'strapi', }, devDependencies: {}, - dependencies: Object.assign( - {}, - strapiDependencies.reduce((acc, key) => { + dependencies: { + ...strapiDependencies.reduce((acc, key) => { acc[key] = strapiVersion; return acc; }, {}), - additionalsDependencies - ), + ...additionalsDependencies, + }, author: { name: 'A Strapi developer', }, diff --git a/packages/generators/app/lib/resources/templates/env.js b/packages/generators/app/lib/resources/templates/env.js index 09e0c584bd..1e0068ae7d 100644 --- a/packages/generators/app/lib/resources/templates/env.js +++ b/packages/generators/app/lib/resources/templates/env.js @@ -13,10 +13,7 @@ module.exports = () => { const compile = _.template(tmpl); return compile({ - appKeys: new Array(4) - .fill() - .map(generateASecret) - .join(','), + appKeys: new Array(4).fill().map(generateASecret).join(','), apiTokenSalt: generateASecret(), adminJwtToken: generateASecret(), }); diff --git a/packages/generators/app/lib/utils/check-install-path.js b/packages/generators/app/lib/utils/check-install-path.js index b5fcad8dab..06fda20977 100644 --- a/packages/generators/app/lib/utils/check-install-path.js +++ b/packages/generators/app/lib/utils/check-install-path.js @@ -8,7 +8,7 @@ const stopProcess = require('./stop-process'); * Checks if the an empty directory exists at rootPath * @param {string} rootPath */ -module.exports = async rootPath => { +module.exports = async (rootPath) => { if (await fse.pathExists(rootPath)) { const stat = await fse.stat(rootPath); diff --git a/packages/generators/app/lib/utils/check-requirements.js b/packages/generators/app/lib/utils/check-requirements.js index 09e6a91ef8..8aee891e8f 100644 --- a/packages/generators/app/lib/utils/check-requirements.js +++ b/packages/generators/app/lib/utils/check-requirements.js @@ -1,9 +1,9 @@ 'use strict'; module.exports = function checkBeforeInstall() { - var currentNodeVersion = process.versions.node; - var semver = currentNodeVersion.split('.'); - var major = semver[0]; + const currentNodeVersion = process.versions.node; + const semver = currentNodeVersion.split('.'); + const major = semver[0]; if (major < 12) { console.error(`You are running Node ${currentNodeVersion}`); diff --git a/packages/generators/app/lib/utils/merge-template.js b/packages/generators/app/lib/utils/merge-template.js index 279788eba2..849af5184a 100644 --- a/packages/generators/app/lib/utils/merge-template.js +++ b/packages/generators/app/lib/utils/merge-template.js @@ -8,8 +8,8 @@ const chalk = require('chalk'); const { getTemplatePackageInfo, downloadNpmTemplate } = require('./fetch-npm-template'); // Specify all the files and directories a template can have -const allowFile = Symbol(); -const allowChildren = Symbol(); +const allowFile = Symbol('alloFile'); +const allowChildren = Symbol('allowChildren'); const allowedTemplateContents = { 'README.md': allowFile, '.env.example': allowFile, @@ -30,7 +30,7 @@ module.exports = async function mergeTemplate(scope, rootPath) { let templatePath; let templateParentPath; let templatePackageInfo = {}; - const isLocalTemplate = ['./', '../', '/'].some(filePrefix => + const isLocalTemplate = ['./', '../', '/'].some((filePrefix) => scope.template.startsWith(filePrefix) ); diff --git a/packages/generators/app/lib/utils/parse-db-arguments.js b/packages/generators/app/lib/utils/parse-db-arguments.js index 7001507c55..6d71d9fc1d 100644 --- a/packages/generators/app/lib/utils/parse-db-arguments.js +++ b/packages/generators/app/lib/utils/parse-db-arguments.js @@ -9,8 +9,8 @@ const VALID_CLIENTS = ['sqlite', 'mysql', 'postgres']; module.exports = function parseDatabaseArguments({ scope, args }) { const argKeys = Object.keys(args); - const matchingArgs = DB_ARGS.filter(key => argKeys.includes(key)); - const missingArgs = DB_ARGS.filter(key => !argKeys.includes(key)); + const matchingArgs = DB_ARGS.filter((key) => argKeys.includes(key)); + const missingArgs = DB_ARGS.filter((key) => !argKeys.includes(key)); if (matchingArgs.length === 0) return; diff --git a/packages/generators/app/lib/utils/usage.js b/packages/generators/app/lib/utils/usage.js index 196c1c6b82..e3bae471ea 100644 --- a/packages/generators/app/lib/utils/usage.js +++ b/packages/generators/app/lib/utils/usage.js @@ -21,7 +21,7 @@ async function captureException(error) { sentry.captureException(error); await sentry.flush(); } catch (err) { - /** ignore errors*/ + /** ignore errors */ return Promise.resolve(); } } @@ -31,7 +31,7 @@ async function captureError(message) { sentry.captureMessage(message, 'error'); await sentry.flush(); } catch (err) { - /** ignore errors*/ + /** ignore errors */ return Promise.resolve(); } } @@ -41,7 +41,7 @@ function captureStderr(name, error) { error.stderr .trim() .split('\n') - .forEach(line => { + .forEach((line) => { sentry.addBreadcrumb({ category: 'stderr', message: line, @@ -69,7 +69,7 @@ function trackEvent(event, body) { headers: { 'Content-Type': 'application/json' }, }).catch(() => {}); } catch (err) { - /** ignore errors*/ + /** ignore errors */ return Promise.resolve(); } } @@ -78,7 +78,7 @@ function trackError({ scope, error }) { const { uuid } = scope; const properties = { - error: typeof error == 'string' ? error : error && error.message, + error: typeof error === 'string' ? error : error && error.message, os: os.type(), platform: os.platform(), release: os.release(), @@ -97,7 +97,7 @@ function trackError({ scope, error }) { properties: addPackageJsonStrapiMetadata(properties, scope), }); } catch (err) { - /** ignore errors*/ + /** ignore errors */ return Promise.resolve(); } } @@ -106,7 +106,7 @@ function trackUsage({ event, scope, error }) { const { uuid } = scope; const properties = { - error: typeof error == 'string' ? error : error && error.message, + error: typeof error === 'string' ? error : error && error.message, os: os.type(), os_platform: os.platform(), os_release: os.release(), @@ -126,7 +126,7 @@ function trackUsage({ event, scope, error }) { properties: addPackageJsonStrapiMetadata(properties, scope), }); } catch (err) { - /** ignore errors*/ + /** ignore errors */ return Promise.resolve(); } } diff --git a/packages/generators/generators/lib/files/js/plugin/admin/src/index.js b/packages/generators/generators/lib/files/js/plugin/admin/src/index.js index 0295d2ccd3..23240d84d2 100644 --- a/packages/generators/generators/lib/files/js/plugin/admin/src/index.js +++ b/packages/generators/generators/lib/files/js/plugin/admin/src/index.js @@ -39,7 +39,7 @@ export default { bootstrap(app) {}, async registerTrads({ locales }) { const importedTrads = await Promise.all( - locales.map(locale => { + locales.map((locale) => { return import( /* webpackChunkName: "translation-[request]" */ `./translations/${locale}.json` ) diff --git a/packages/generators/generators/lib/files/js/plugin/admin/src/utils/axiosInstance.js b/packages/generators/generators/lib/files/js/plugin/admin/src/utils/axiosInstance.js index a28d3f502f..3d03d75c18 100644 --- a/packages/generators/generators/lib/files/js/plugin/admin/src/utils/axiosInstance.js +++ b/packages/generators/generators/lib/files/js/plugin/admin/src/utils/axiosInstance.js @@ -10,7 +10,7 @@ const instance = axios.create({ }); instance.interceptors.request.use( - async config => { + async (config) => { config.headers = { Authorization: `Bearer ${auth.getToken()}`, Accept: 'application/json', @@ -19,14 +19,14 @@ instance.interceptors.request.use( return config; }, - error => { + (error) => { Promise.reject(error); } ); instance.interceptors.response.use( - response => response, - error => { + (response) => response, + (error) => { // whatever you want to do with the error if (error.response?.status === 401) { auth.clearAppStorage(); diff --git a/packages/generators/generators/lib/files/js/plugin/admin/src/utils/getTrad.js b/packages/generators/generators/lib/files/js/plugin/admin/src/utils/getTrad.js index a2b8632a8d..d0a071b26a 100644 --- a/packages/generators/generators/lib/files/js/plugin/admin/src/utils/getTrad.js +++ b/packages/generators/generators/lib/files/js/plugin/admin/src/utils/getTrad.js @@ -1,5 +1,5 @@ import pluginId from '../pluginId'; -const getTrad = id => `${pluginId}.${id}`; +const getTrad = (id) => `${pluginId}.${id}`; export default getTrad; diff --git a/packages/generators/generators/lib/index.js b/packages/generators/generators/lib/index.js index 12a4adfadd..1723cdadbd 100644 --- a/packages/generators/generators/lib/index.js +++ b/packages/generators/generators/lib/index.js @@ -8,7 +8,7 @@ const nodePlop = require('node-plop'); * Starts the Plop CLI programmatically */ const runCLI = () => { - Plop.launch({ configPath: join(__dirname, 'plopfile.js') }, env => + Plop.launch({ configPath: join(__dirname, 'plopfile.js') }, (env) => run({ ...env, dest: join(process.cwd(), 'src') }, undefined, true) ); }; diff --git a/packages/generators/generators/lib/plopfile.js b/packages/generators/generators/lib/plopfile.js index 0c386b50ef..5286b0556f 100644 --- a/packages/generators/generators/lib/plopfile.js +++ b/packages/generators/generators/lib/plopfile.js @@ -10,10 +10,10 @@ const generatePolicy = require('./plops/policy'); const generateMiddleware = require('./plops/middleware'); const generateService = require('./plops/service'); -module.exports = plop => { +module.exports = (plop) => { // Plop config plop.setWelcomeMessage('Strapi Generators'); - plop.addHelper('pluralize', text => pluralize(text)); + plop.addHelper('pluralize', (text) => pluralize(text)); // Generators generateApi(plop); diff --git a/packages/generators/generators/lib/plops/api.js b/packages/generators/generators/lib/plops/api.js index ec6126531b..c823059482 100644 --- a/packages/generators/generators/lib/plops/api.js +++ b/packages/generators/generators/lib/plops/api.js @@ -6,7 +6,7 @@ const tsUtils = require('@strapi/typescript-utils'); const validateInput = require('./utils/validate-input'); -module.exports = plop => { +module.exports = (plop) => { // API generator plop.setGenerator('api', { description: 'Generate a basic API', @@ -15,7 +15,7 @@ module.exports = plop => { type: 'input', name: 'id', message: 'API name', - validate: input => validateInput(input), + validate: (input) => validateInput(input), }, { type: 'confirm', @@ -23,7 +23,7 @@ module.exports = plop => { message: 'Is this API for a plugin?', }, { - when: answers => answers.isPluginApi, + when: (answers) => answers.isPluginApi, type: 'list', name: 'plugin', message: 'Plugin name', @@ -36,7 +36,7 @@ module.exports = plop => { } const pluginsDir = await fs.readdir(pluginsPath, { withFileTypes: true }); - const pluginsDirContent = pluginsDir.filter(fd => fd.isDirectory()); + const pluginsDirContent = pluginsDir.filter((fd) => fd.isDirectory()); if (pluginsDirContent.length === 0) { throw Error('The "plugins" directory is empty'); diff --git a/packages/generators/generators/lib/plops/content-type.js b/packages/generators/generators/lib/plops/content-type.js index 08dcf5bb7f..d6fc995e79 100644 --- a/packages/generators/generators/lib/plops/content-type.js +++ b/packages/generators/generators/lib/plops/content-type.js @@ -14,7 +14,7 @@ const draftAndPublishPrompts = require('./prompts/draft-and-publish-prompts'); const getAttributesPrompts = require('./prompts/get-attributes-prompts'); const bootstrapApiPrompts = require('./prompts/bootstrap-api-prompts'); -module.exports = plop => { +module.exports = (plop) => { // Model generator plop.setGenerator('content-type', { description: 'Generate a content type for an API', @@ -29,7 +29,7 @@ module.exports = plop => { const api = await inquirer.prompt([ ...getDestinationPrompts('model', plop.getDestBasePath()), { - when: answers => answers.destination === 'new', + when: (answers) => answers.destination === 'new', type: 'input', name: 'id', default: config.singularName, @@ -47,9 +47,9 @@ module.exports = plop => { } const apiDir = await fs.readdir(apiPath, { withFileTypes: true }); - const apiDirContent = apiDir.filter(fd => fd.isDirectory()); + const apiDirContent = apiDir.filter((fd) => fd.isDirectory()); - if (apiDirContent.findIndex(api => api.name === input) !== -1) { + if (apiDirContent.findIndex((api) => api.name === input) !== -1) { throw new Error('This name is already taken.'); } @@ -70,7 +70,7 @@ module.exports = plop => { const val = { type: answer.attributeType }; if (answer.attributeType === 'enumeration') { - val.enum = answer.enum.split(',').map(item => item.trim()); + val.enum = answer.enum.split(',').map((item) => item.trim()); } if (answer.attributeType === 'media') { diff --git a/packages/generators/generators/lib/plops/controller.js b/packages/generators/generators/lib/plops/controller.js index f048d133aa..0516b975d6 100644 --- a/packages/generators/generators/lib/plops/controller.js +++ b/packages/generators/generators/lib/plops/controller.js @@ -6,7 +6,7 @@ const getDestinationPrompts = require('./prompts/get-destination-prompts'); const getFilePath = require('./utils/get-file-path'); const validateInput = require('./utils/validate-input'); -module.exports = plop => { +module.exports = (plop) => { // Controller generator plop.setGenerator('controller', { description: 'Generate a controller for an API', @@ -15,7 +15,7 @@ module.exports = plop => { type: 'input', name: 'id', message: 'Controller name', - validate: input => validateInput(input), + validate: (input) => validateInput(input), }, ...getDestinationPrompts('controller', plop.getDestBasePath()), ], diff --git a/packages/generators/generators/lib/plops/middleware.js b/packages/generators/generators/lib/plops/middleware.js index ba780e5da8..5111484a67 100644 --- a/packages/generators/generators/lib/plops/middleware.js +++ b/packages/generators/generators/lib/plops/middleware.js @@ -6,7 +6,7 @@ const getDestinationPrompts = require('./prompts/get-destination-prompts'); const validateInput = require('./utils/validate-input'); const getFilePath = require('./utils/get-file-path'); -module.exports = plop => { +module.exports = (plop) => { // middleware generator plop.setGenerator('middleware', { description: 'Generate a middleware for an API', @@ -15,7 +15,7 @@ module.exports = plop => { type: 'input', name: 'name', message: 'Middleware name', - validate: input => validateInput(input), + validate: (input) => validateInput(input), }, ...getDestinationPrompts('middleware', plop.getDestBasePath(), { rootFolder: true }), ], diff --git a/packages/generators/generators/lib/plops/plugin.js b/packages/generators/generators/lib/plops/plugin.js index cd089a90df..0a53ddb02c 100644 --- a/packages/generators/generators/lib/plops/plugin.js +++ b/packages/generators/generators/lib/plops/plugin.js @@ -13,9 +13,7 @@ const LANGUAGES = { const logInstructions = (pluginName, { language }) => { const maxLength = ` resolve: './src/plugins/${pluginName}'`.length; - const separator = Array(maxLength) - .fill('─') - .join(''); + const separator = Array(maxLength).fill('─').join(''); const exportInstruction = language === 'js' ? 'module.exports =' : 'export default'; @@ -36,7 +34,7 @@ ${separator} `; }; -module.exports = plop => { +module.exports = (plop) => { // Plugin generator plop.setGenerator('plugin', { description: 'Generate a basic plugin', @@ -45,7 +43,7 @@ module.exports = plop => { type: 'input', name: 'pluginName', message: 'Plugin name', - validate: input => validateInput(input), + validate: (input) => validateInput(input), }, { type: 'list', diff --git a/packages/generators/generators/lib/plops/policy.js b/packages/generators/generators/lib/plops/policy.js index 54f9995671..a07089887a 100644 --- a/packages/generators/generators/lib/plops/policy.js +++ b/packages/generators/generators/lib/plops/policy.js @@ -6,7 +6,7 @@ const getDestinationPrompts = require('./prompts/get-destination-prompts'); const validateInput = require('./utils/validate-input'); const getFilePath = require('./utils/get-file-path'); -module.exports = plop => { +module.exports = (plop) => { // Policy generator plop.setGenerator('policy', { description: 'Generate a policy for an API', @@ -15,7 +15,7 @@ module.exports = plop => { type: 'input', name: 'id', message: 'Policy name', - validate: input => validateInput(input), + validate: (input) => validateInput(input), }, ...getDestinationPrompts('policy', plop.getDestBasePath(), { rootFolder: true }), ], diff --git a/packages/generators/generators/lib/plops/prompts/ct-names-prompts.js b/packages/generators/generators/lib/plops/prompts/ct-names-prompts.js index 5de1f903d7..2d490e66a2 100644 --- a/packages/generators/generators/lib/plops/prompts/ct-names-prompts.js +++ b/packages/generators/generators/lib/plops/prompts/ct-names-prompts.js @@ -9,13 +9,13 @@ module.exports = [ type: 'input', name: 'displayName', message: 'Content type display name', - validate: input => !!input, + validate: (input) => !!input, }, { type: 'input', name: 'singularName', message: 'Content type singular name', - default: answers => slugify(answers.displayName), + default: (answers) => slugify(answers.displayName), validate(input) { if (!isKebabCase(input)) { return 'Value must be in kebab-case'; @@ -28,7 +28,7 @@ module.exports = [ type: 'input', name: 'pluralName', message: 'Content type plural name', - default: answers => pluralize(answers.singularName), + default: (answers) => pluralize(answers.singularName), validate(input, answers) { if (answers.singularName === input) { return 'Singular and plural names cannot be the same'; diff --git a/packages/generators/generators/lib/plops/prompts/get-attributes-prompts.js b/packages/generators/generators/lib/plops/prompts/get-attributes-prompts.js index cd7355db7f..408fd901f6 100644 --- a/packages/generators/generators/lib/plops/prompts/get-attributes-prompts.js +++ b/packages/generators/generators/lib/plops/prompts/get-attributes-prompts.js @@ -29,7 +29,7 @@ const DEFAULT_TYPES = [ * @param {import('inquirer').Inquirer} inquirer * @returns {Promise[]>} */ -module.exports = async inquirer => { +module.exports = async (inquirer) => { const { addAttributes } = await inquirer.prompt([ { type: 'confirm', @@ -44,31 +44,31 @@ module.exports = async inquirer => { * @param {import('inquirer').Inquirer} inquirer * @returns {Promise} */ - const createNewAttributes = async inquirer => { + const createNewAttributes = async (inquirer) => { const answers = await inquirer.prompt([ { type: 'input', name: 'attributeName', message: 'Name of attribute', - validate: input => validateAttributeInput(input), + validate: (input) => validateAttributeInput(input), }, { type: 'list', name: 'attributeType', message: 'What type of attribute', pageSize: DEFAULT_TYPES.length, - choices: DEFAULT_TYPES.map(type => { + choices: DEFAULT_TYPES.map((type) => { return { name: type, value: type }; }), }, { - when: answers => answers.attributeType === 'enumeration', + when: (answers) => answers.attributeType === 'enumeration', type: 'input', name: 'enum', message: 'Add values separated by a comma', }, { - when: answers => answers.attributeType === 'media', + when: (answers) => answers.attributeType === 'media', type: 'list', name: 'multiple', message: 'Choose media type', diff --git a/packages/generators/generators/lib/plops/prompts/get-destination-prompts.js b/packages/generators/generators/lib/plops/prompts/get-destination-prompts.js index 77d9c12b99..632a484d2b 100644 --- a/packages/generators/generators/lib/plops/prompts/get-destination-prompts.js +++ b/packages/generators/generators/lib/plops/prompts/get-destination-prompts.js @@ -1,4 +1,5 @@ 'use strict'; + const { join } = require('path'); const fs = require('fs-extra'); @@ -27,7 +28,7 @@ module.exports = (action, basePath, { rootFolder = false } = {}) => { ], }, { - when: answers => answers.destination === 'api', + when: (answers) => answers.destination === 'api', type: 'list', message: 'Which API is this for?', name: 'api', @@ -40,7 +41,7 @@ module.exports = (action, basePath, { rootFolder = false } = {}) => { } const apiDir = await fs.readdir(apiPath, { withFileTypes: true }); - const apiDirContent = apiDir.filter(fd => fd.isDirectory()); + const apiDirContent = apiDir.filter((fd) => fd.isDirectory()); if (apiDirContent.length === 0) { throw Error('The "api" directory is empty'); @@ -50,7 +51,7 @@ module.exports = (action, basePath, { rootFolder = false } = {}) => { }, }, { - when: answers => answers.destination === 'plugin', + when: (answers) => answers.destination === 'plugin', type: 'list', message: 'Which plugin is this for?', name: 'plugin', @@ -63,7 +64,7 @@ module.exports = (action, basePath, { rootFolder = false } = {}) => { } const pluginsDir = await fs.readdir(pluginsPath); - const pluginsDirContent = pluginsDir.filter(api => + const pluginsDirContent = pluginsDir.filter((api) => fs.lstatSync(join(pluginsPath, api)).isDirectory() ); diff --git a/packages/generators/generators/lib/plops/prompts/kind-prompts.js b/packages/generators/generators/lib/plops/prompts/kind-prompts.js index 1ae60d911d..13e0f08d28 100644 --- a/packages/generators/generators/lib/plops/prompts/kind-prompts.js +++ b/packages/generators/generators/lib/plops/prompts/kind-prompts.js @@ -12,6 +12,6 @@ module.exports = [ { name: 'Collection Type', value: 'collectionType' }, { name: 'Single Type', value: 'singleType' }, ], - validate: input => validateInput(input), + validate: (input) => validateInput(input), }, ]; diff --git a/packages/generators/generators/lib/plops/service.js b/packages/generators/generators/lib/plops/service.js index d2604279b0..03df1279bc 100644 --- a/packages/generators/generators/lib/plops/service.js +++ b/packages/generators/generators/lib/plops/service.js @@ -5,7 +5,7 @@ const tsUtils = require('@strapi/typescript-utils'); const getDestinationPrompts = require('./prompts/get-destination-prompts'); const getFilePath = require('./utils/get-file-path'); -module.exports = plop => { +module.exports = (plop) => { // Service generator plop.setGenerator('service', { description: 'Generate a service for an API', diff --git a/packages/generators/generators/lib/plops/utils/get-file-path.js b/packages/generators/generators/lib/plops/utils/get-file-path.js index 5ed52be112..3333afe00f 100644 --- a/packages/generators/generators/lib/plops/utils/get-file-path.js +++ b/packages/generators/generators/lib/plops/utils/get-file-path.js @@ -1,6 +1,6 @@ 'use strict'; -module.exports = destination => { +module.exports = (destination) => { if (destination === 'api') { return `api/{{ api }}`; } diff --git a/packages/generators/generators/lib/plops/utils/validate-attribute-input.js b/packages/generators/generators/lib/plops/utils/validate-attribute-input.js index 7a9896689c..4e89e0a800 100644 --- a/packages/generators/generators/lib/plops/utils/validate-attribute-input.js +++ b/packages/generators/generators/lib/plops/utils/validate-attribute-input.js @@ -1,6 +1,6 @@ 'use strict'; -module.exports = input => { +module.exports = (input) => { const regex = /^[A-Za-z-|_]+$/g; if (!input) { diff --git a/packages/generators/generators/lib/plops/utils/validate-input.js b/packages/generators/generators/lib/plops/utils/validate-input.js index 3be8d9a1c4..e66c4769df 100644 --- a/packages/generators/generators/lib/plops/utils/validate-input.js +++ b/packages/generators/generators/lib/plops/utils/validate-input.js @@ -1,6 +1,6 @@ 'use strict'; -module.exports = input => { +module.exports = (input) => { const regex = /^[A-Za-z-]+$/g; if (!input) { diff --git a/packages/plugins/documentation/__tests__/build-component-schema.test.js b/packages/plugins/documentation/__tests__/build-component-schema.test.js index e0f23dd2a6..ebbd1d6ac2 100644 --- a/packages/plugins/documentation/__tests__/build-component-schema.test.js +++ b/packages/plugins/documentation/__tests__/build-component-schema.test.js @@ -79,8 +79,8 @@ describe('Build Component Schema', () => { } const schemaNames = Object.keys(schemas); - const pluginListResponseValue = schemas['UsersPermissionsRoleListResponse']; - const apiListResponseValue = schemas['RestaurantListResponse']; + const pluginListResponseValue = schemas.UsersPermissionsRoleListResponse; + const apiListResponseValue = schemas.RestaurantListResponse; const expectedShape = { type: 'object', @@ -144,8 +144,8 @@ describe('Build Component Schema', () => { } const schemaNames = Object.keys(schemas); - const pluginListResponseValue = schemas['UsersPermissionsRoleRequest']; - const apiListResponseValue = schemas['RestaurantRequest']; + const pluginListResponseValue = schemas.UsersPermissionsRoleRequest; + const apiListResponseValue = schemas.RestaurantRequest; const expectedShape = { type: 'object', @@ -192,8 +192,8 @@ describe('Build Component Schema', () => { } const schemaNames = Object.keys(schemas); - const pluginListResponseValue = schemas['UsersPermissionsRoleLocalizationResponse']; - const apiListResponseValue = schemas['RestaurantLocalizationResponse']; + const pluginListResponseValue = schemas.UsersPermissionsRoleLocalizationResponse; + const apiListResponseValue = schemas.RestaurantLocalizationResponse; const expectedShape = { type: 'object', @@ -236,8 +236,8 @@ describe('Build Component Schema', () => { } const schemaNames = Object.keys(schemas); - const pluginListResponseValue = schemas['UsersPermissionsRoleLocalizationRequest']; - const apiListResponseValue = schemas['RestaurantLocalizationRequest']; + const pluginListResponseValue = schemas.UsersPermissionsRoleLocalizationRequest; + const apiListResponseValue = schemas.RestaurantLocalizationRequest; const expectedShape = { type: 'object', diff --git a/packages/plugins/documentation/admin/src/index.js b/packages/plugins/documentation/admin/src/index.js index f963ff8dd7..b28338eeb7 100644 --- a/packages/plugins/documentation/admin/src/index.js +++ b/packages/plugins/documentation/admin/src/index.js @@ -22,7 +22,7 @@ export default { defaultMessage: 'Documentation', }, permissions: pluginPermissions.main, - Component: async () => { + async Component() { const component = await import( /* webpackChunkName: "documentation-page" */ './pages/PluginPage' ); @@ -44,7 +44,7 @@ export default { }, id: 'documentation', to: `/settings/${pluginId}`, - Component: async () => { + async Component() { const component = await import( /* webpackChunkName: "documentation-settings" */ './pages/SettingsPage' ); @@ -56,7 +56,7 @@ export default { }, async registerTrads({ locales }) { const importedTrads = await Promise.all( - locales.map(locale => { + locales.map((locale) => { return import( /* webpackChunkName: "documentation-translation-[request]" */ `./translations/${locale}.json` ) diff --git a/packages/plugins/documentation/admin/src/pages/PluginPage/index.js b/packages/plugins/documentation/admin/src/pages/PluginPage/index.js index d7276f57af..00e436f162 100755 --- a/packages/plugins/documentation/admin/src/pages/PluginPage/index.js +++ b/packages/plugins/documentation/admin/src/pages/PluginPage/index.js @@ -49,7 +49,7 @@ const PluginPage = () => { openWithNewTab(`${slash}${data?.prefix}/v${data?.currentVersion}`); }; - const handleRegenerateDoc = version => { + const handleRegenerateDoc = (version) => { regenerateDocMutation.mutate({ version, prefix: data?.prefix }); }; @@ -64,7 +64,7 @@ const PluginPage = () => { setIsConfirmButtonLoading(false); }; - const handleClickDelete = version => { + const handleClickDelete = (version) => { setVersionToDelete(version); setShowConfirmDelete(!showConfirmDelete); }; @@ -123,7 +123,7 @@ const PluginPage = () => { {data.docVersions .sort((a, b) => (a.generatedDate < b.generatedDate ? 1 : -1)) - .map(doc => ( + .map((doc) => ( {doc.version} 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 031764a15c..cf35cd938f 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 @@ -23,7 +23,7 @@ const client = new QueryClient({ }, }); -const makeApp = history => ( +const makeApp = (history) => ( diff --git a/packages/plugins/documentation/admin/src/pages/SettingsPage/index.js b/packages/plugins/documentation/admin/src/pages/SettingsPage/index.js index 65d2624c25..f1c89dde7d 100644 --- a/packages/plugins/documentation/admin/src/pages/SettingsPage/index.js +++ b/packages/plugins/documentation/admin/src/pages/SettingsPage/index.js @@ -36,7 +36,7 @@ const SettingsPage = () => { const { submitMutation, data, isLoading } = useReactQuery(); const [passwordShown, setPasswordShown] = useState(false); - const handleUpdateSettingsSubmit = body => { + const handleUpdateSettingsSubmit = (body) => { submitMutation.mutate({ prefix: data?.prefix, body, @@ -143,9 +143,9 @@ const SettingsPage = () => { } endAction={ { + onClick={(e) => { e.stopPropagation(); - setPasswordShown(prev => !prev); + setPasswordShown((prev) => !prev); }} label={formatMessage( passwordShown 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 4bb96516a9..34b45f27b7 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 @@ -23,7 +23,7 @@ const client = new QueryClient({ }, }); -const makeApp = history => ( +const makeApp = (history) => ( diff --git a/packages/plugins/documentation/admin/src/pages/utils/api.js b/packages/plugins/documentation/admin/src/pages/utils/api.js index 62347f94cc..ab4d3b9e7d 100644 --- a/packages/plugins/documentation/admin/src/pages/utils/api.js +++ b/packages/plugins/documentation/admin/src/pages/utils/api.js @@ -5,7 +5,7 @@ const deleteDoc = ({ prefix, version }) => { return request(`${prefix}/deleteDoc/${version}`, { method: 'DELETE' }); }; -const fetchDocumentationVersions = async toggleNotification => { +const fetchDocumentationVersions = async (toggleNotification) => { try { const data = await request(`/${pluginId}/getInfos`, { method: 'GET' }); diff --git a/packages/plugins/documentation/admin/src/pages/utils/useReactQuery.js b/packages/plugins/documentation/admin/src/pages/utils/useReactQuery.js index 4df81f145b..79c5f525b6 100644 --- a/packages/plugins/documentation/admin/src/pages/utils/useReactQuery.js +++ b/packages/plugins/documentation/admin/src/pages/utils/useReactQuery.js @@ -10,7 +10,7 @@ const useReactQuery = () => { fetchDocumentationVersions(toggleNotification) ); - const handleError = err => { + const handleError = (err) => { toggleNotification({ type: 'warning', message: err.response.payload.message, @@ -27,7 +27,7 @@ const useReactQuery = () => { const deleteMutation = useMutation(deleteDoc, { onSuccess: () => handleSuccess('info', 'notification.delete.success'), - onError: error => handleError(error), + onError: (error) => handleError(error), }); const submitMutation = useMutation(updateSettings, { @@ -37,7 +37,7 @@ const useReactQuery = () => { const regenerateDocMutation = useMutation(regenerateDoc, { onSuccess: () => handleSuccess('info', 'notification.generate.success'), - onError: error => handleError(error), + onError: (error) => handleError(error), }); return { data, isLoading, deleteMutation, submitMutation, regenerateDocMutation }; diff --git a/packages/plugins/documentation/admin/src/utils/getTrad.js b/packages/plugins/documentation/admin/src/utils/getTrad.js index a2b8632a8d..d0a071b26a 100644 --- a/packages/plugins/documentation/admin/src/utils/getTrad.js +++ b/packages/plugins/documentation/admin/src/utils/getTrad.js @@ -1,5 +1,5 @@ import pluginId from '../pluginId'; -const getTrad = id => `${pluginId}.${id}`; +const getTrad = (id) => `${pluginId}.${id}`; export default getTrad; diff --git a/packages/plugins/documentation/admin/src/utils/openWithNewTab.js b/packages/plugins/documentation/admin/src/utils/openWithNewTab.js index db671ef85b..277426c54e 100755 --- a/packages/plugins/documentation/admin/src/utils/openWithNewTab.js +++ b/packages/plugins/documentation/admin/src/utils/openWithNewTab.js @@ -1,6 +1,6 @@ import { startsWith } from 'lodash'; -const openWithNewTab = path => { +const openWithNewTab = (path) => { const url = (() => { if (startsWith(path, '/')) { return `${strapi.backendURL}${path}`; diff --git a/packages/plugins/documentation/server/bootstrap.js b/packages/plugins/documentation/server/bootstrap.js index d0dac9cd26..7c22d6ebfa 100755 --- a/packages/plugins/documentation/server/bootstrap.js +++ b/packages/plugins/documentation/server/bootstrap.js @@ -1,4 +1,5 @@ /* eslint-disable no-unreachable */ + 'use strict'; // Add permissions @@ -49,8 +50,5 @@ module.exports = async ({ strapi }) => { pluginStore.set({ key: 'config', value: { restrictedAccess: false } }); } - await strapi - .plugin('documentation') - .service('documentation') - .generateFullDoc(); + await strapi.plugin('documentation').service('documentation').generateFullDoc(); }; diff --git a/packages/plugins/documentation/server/controllers/documentation.js b/packages/plugins/documentation/server/controllers/documentation.js index fc27bb0136..feb987f2e4 100644 --- a/packages/plugins/documentation/server/controllers/documentation.js +++ b/packages/plugins/documentation/server/controllers/documentation.js @@ -43,10 +43,7 @@ module.exports = { const version = major && minor && patch ? `${major}.${minor}.${patch}` - : strapi - .plugin('documentation') - .service('documentation') - .getDocumentationVersion(); + : strapi.plugin('documentation').service('documentation').getDocumentationVersion(); const openAPISpecsPath = path.join( strapi.dirs.app.extensions, @@ -177,7 +174,7 @@ module.exports = { const service = strapi.service('plugin::documentation.documentation'); - const documentationVersions = service.getDocumentationVersions().map(el => el.version); + const documentationVersions = service.getDocumentationVersions().map((el) => el.version); if (_.isEmpty(version)) { return ctx.badRequest('Please provide a version.'); @@ -201,7 +198,7 @@ module.exports = { const service = strapi.service('plugin::documentation.documentation'); - const documentationVersions = service.getDocumentationVersions().map(el => el.version); + const documentationVersions = service.getDocumentationVersions().map((el) => el.version); if (_.isEmpty(version)) { return ctx.badRequest('Please provide a version.'); diff --git a/packages/plugins/documentation/server/public/index.html b/packages/plugins/documentation/server/public/index.html index eab31e9887..a465cee758 100755 --- a/packages/plugins/documentation/server/public/index.html +++ b/packages/plugins/documentation/server/public/index.html @@ -1,12 +1,27 @@ - - + + + + Swagger UI - - - + + + @@ -51,7 +64,7 @@ } - - + + diff --git a/packages/plugins/documentation/server/public/login.html b/packages/plugins/documentation/server/public/login.html index ccd28ad46e..d063f232c3 100755 --- a/packages/plugins/documentation/server/public/login.html +++ b/packages/plugins/documentation/server/public/login.html @@ -1,135 +1,145 @@ - - Login - Documentation - - - - - + + diff --git a/packages/plugins/documentation/server/routes/index.js b/packages/plugins/documentation/server/routes/index.js index 6e8821e18f..9a2ef067de 100644 --- a/packages/plugins/documentation/server/routes/index.js +++ b/packages/plugins/documentation/server/routes/index.js @@ -1,4 +1,5 @@ 'use strict'; + const restrictAccess = require('../middlewares/restrict-access'); module.exports = [ diff --git a/packages/plugins/documentation/server/services/documentation.js b/packages/plugins/documentation/server/services/documentation.js index b40d1a9bd7..bbc3383a7a 100755 --- a/packages/plugins/documentation/server/services/documentation.js +++ b/packages/plugins/documentation/server/services/documentation.js @@ -38,7 +38,7 @@ module.exports = ({ strapi }) => { getDocumentationVersions() { return fs .readdirSync(this.getFullDocumentationPath()) - .map(version => { + .map((version) => { try { const doc = JSON.parse( fs.readFileSync( @@ -52,7 +52,7 @@ module.exports = ({ strapi }) => { return null; } }) - .filter(x => x); + .filter((x) => x); }, /** @@ -99,7 +99,7 @@ module.exports = ({ strapi }) => { getPluginAndApiInfo() { const plugins = _.get(config, 'x-strapi-config.plugins'); - const pluginsToDocument = plugins.map(plugin => { + const pluginsToDocument = plugins.map((plugin) => { return { name: plugin, getter: 'plugin', @@ -107,7 +107,7 @@ module.exports = ({ strapi }) => { }; }); - const apisToDocument = Object.keys(strapi.api).map(api => { + const apisToDocument = Object.keys(strapi.api).map((api) => { return { name: api, getter: 'api', @@ -186,7 +186,7 @@ module.exports = ({ strapi }) => { const finalDoc = { ...config, paths }; - registeredDocs.forEach(doc => { + registeredDocs.forEach((doc) => { // Add tags finalDoc.tags = finalDoc.tags || []; finalDoc.tags.push(...(doc.tags || [])); diff --git a/packages/plugins/documentation/server/services/helpers/build-api-endpoint-path.js b/packages/plugins/documentation/server/services/helpers/build-api-endpoint-path.js index 156ae8bf7d..09542e447c 100644 --- a/packages/plugins/documentation/server/services/helpers/build-api-endpoint-path.js +++ b/packages/plugins/documentation/server/services/helpers/build-api-endpoint-path.js @@ -15,12 +15,12 @@ const { hasFindMethod, isLocalizedPath } = require('./utils/routes'); * @param {string} routePath - The route's path property * @returns {string} */ -const parsePathWithVariables = routePath => { +const parsePathWithVariables = (routePath) => { return pathToRegexp .parse(routePath) - .map(token => { + .map((token) => { if (_.isObject(token)) { - return token.prefix + '{' + token.name + '}'; + return `${token.prefix}{${token.name}}`; } return token; @@ -35,11 +35,11 @@ const parsePathWithVariables = routePath => { * * @returns {object } Swagger path params object */ -const getPathParams = routePath => { +const getPathParams = (routePath) => { return pathToRegexp .parse(routePath) - .filter(token => _.isObject(token)) - .map(param => { + .filter((token) => _.isObject(token)) + .map((param) => { return { name: param.name, in: 'path', @@ -83,7 +83,7 @@ const getPathWithPrefix = (prefix, route) => { */ const getPaths = ({ routeInfo, uniqueName, contentTypeInfo }) => { // Get the routes for the current content type - const contentTypeRoutes = routeInfo.routes.filter(route => { + const contentTypeRoutes = routeInfo.routes.filter((route) => { return ( route.path.includes(contentTypeInfo.pluralName) || route.path.includes(contentTypeInfo.singularName) @@ -152,7 +152,7 @@ const getPaths = ({ routeInfo, uniqueName, contentTypeInfo }) => { * * @returns {object} Open API paths */ -const getAllPathsForContentType = apiInfo => { +const getAllPathsForContentType = (apiInfo) => { let paths = {}; const pathsObject = getPaths(apiInfo); @@ -175,7 +175,7 @@ const getAllPathsForContentType = apiInfo => { * * @returns {object} */ -const buildApiEndpointPath = api => { +const buildApiEndpointPath = (api) => { // A reusable loop for building paths and component schemas // Uses the api param to build a new set of params for each content type // Passes these new params to the function provided diff --git a/packages/plugins/documentation/server/services/helpers/build-component-schema.js b/packages/plugins/documentation/server/services/helpers/build-component-schema.js index e245bddeb7..e80fd64d0e 100644 --- a/packages/plugins/documentation/server/services/helpers/build-component-schema.js +++ b/packages/plugins/documentation/server/services/helpers/build-component-schema.js @@ -1,4 +1,5 @@ 'use strict'; + const _ = require('lodash'); const cleanSchemaAttributes = require('./utils/clean-schema-attributes'); @@ -20,9 +21,11 @@ const getAllSchemasForContentType = ({ routeInfo, attributes, uniqueName }) => { // Store response and request schemas in an object let schemas = {}; // Get all the route methods - const routeMethods = routeInfo.routes.map(route => route.method); + const routeMethods = routeInfo.routes.map((route) => route.method); // Check for localized paths - const hasLocalizationPath = routeInfo.routes.filter(route => isLocalizedPath(route.path)).length; + const hasLocalizationPath = routeInfo.routes.filter((route) => + isLocalizedPath(route.path) + ).length; // When the route methods contain any post or put requests if (routeMethods.includes('POST') || routeMethods.includes('PUT')) { const attributesToOmit = [ @@ -89,7 +92,7 @@ const getAllSchemasForContentType = ({ routeInfo, attributes, uniqueName }) => { } // Check for routes that need to return a list - const hasListOfEntities = routeInfo.routes.filter(route => hasFindMethod(route.handler)).length; + const hasListOfEntities = routeInfo.routes.filter((route) => hasFindMethod(route.handler)).length; if (hasListOfEntities) { // Build the list response schema schemas = { @@ -146,7 +149,7 @@ const getAllSchemasForContentType = ({ routeInfo, attributes, uniqueName }) => { return schemas; }; -const buildComponentSchema = api => { +const buildComponentSchema = (api) => { // A reusable loop for building paths and component schemas // Uses the api param to build a new set of params for each content type // Passes these new params to the function provided diff --git a/packages/plugins/documentation/server/services/helpers/utils/clean-schema-attributes.js b/packages/plugins/documentation/server/services/helpers/utils/clean-schema-attributes.js index 0c8bc4a467..f952ff3ef5 100644 --- a/packages/plugins/documentation/server/services/helpers/utils/clean-schema-attributes.js +++ b/packages/plugins/documentation/server/services/helpers/utils/clean-schema-attributes.js @@ -13,7 +13,7 @@ const getSchemaData = require('./get-schema-data'); const cleanSchemaAttributes = (attributes, { typeMap = new Map(), isRequest = false } = {}) => { const attributesCopy = _.cloneDeep(attributes); - for (const prop in attributesCopy) { + for (const prop of Object.keys(attributesCopy)) { const attribute = attributesCopy[prop]; if (attribute.default) { delete attributesCopy[prop].default; @@ -113,7 +113,7 @@ const cleanSchemaAttributes = (attributes, { typeMap = new Map(), isRequest = fa break; } case 'dynamiczone': { - const components = attribute.components.map(component => { + const components = attribute.components.map((component) => { const componentAttributes = strapi.components[component].attributes; return { type: 'object', diff --git a/packages/plugins/documentation/server/services/helpers/utils/loop-content-type-names.js b/packages/plugins/documentation/server/services/helpers/utils/loop-content-type-names.js index 67d37b46d3..aa2f700087 100644 --- a/packages/plugins/documentation/server/services/helpers/utils/loop-content-type-names.js +++ b/packages/plugins/documentation/server/services/helpers/utils/loop-content-type-names.js @@ -1,4 +1,5 @@ 'use strict'; + const _ = require('lodash'); /** diff --git a/packages/plugins/documentation/server/services/helpers/utils/pascal-case.js b/packages/plugins/documentation/server/services/helpers/utils/pascal-case.js index 6f33c8cc0a..eddeb55ab5 100644 --- a/packages/plugins/documentation/server/services/helpers/utils/pascal-case.js +++ b/packages/plugins/documentation/server/services/helpers/utils/pascal-case.js @@ -2,7 +2,7 @@ const _ = require('lodash'); -const pascalCase = string => { +const pascalCase = (string) => { return _.upperFirst(_.camelCase(string)); }; diff --git a/packages/plugins/documentation/server/services/helpers/utils/routes.js b/packages/plugins/documentation/server/services/helpers/utils/routes.js index f5db74d0dd..0a06900a7a 100644 --- a/packages/plugins/documentation/server/services/helpers/utils/routes.js +++ b/packages/plugins/documentation/server/services/helpers/utils/routes.js @@ -1,8 +1,8 @@ 'use strict'; -const hasFindMethod = handler => handler.split('.').pop() === 'find'; +const hasFindMethod = (handler) => handler.split('.').pop() === 'find'; -const isLocalizedPath = routePath => routePath.includes('localizations'); +const isLocalizedPath = (routePath) => routePath.includes('localizations'); module.exports = { isLocalizedPath, diff --git a/packages/plugins/graphql/admin/src/index.js b/packages/plugins/graphql/admin/src/index.js index 8867387e34..04fa0025f8 100644 --- a/packages/plugins/graphql/admin/src/index.js +++ b/packages/plugins/graphql/admin/src/index.js @@ -14,7 +14,7 @@ export default { bootstrap() {}, async registerTrads({ locales }) { const importedTrads = await Promise.all( - locales.map(locale => { + locales.map((locale) => { return import( /* webpackChunkName: "graphql-translation-[request]" */ `./translations/${locale}.json` ) diff --git a/packages/plugins/graphql/jest.config.js b/packages/plugins/graphql/jest.config.js index 636254a96c..f6c9937187 100644 --- a/packages/plugins/graphql/jest.config.js +++ b/packages/plugins/graphql/jest.config.js @@ -1,7 +1,7 @@ 'use strict'; const baseConfig = require('../../../jest.base-config'); -const pkg = require('./package'); +const pkg = require('./package.json'); module.exports = { ...baseConfig, diff --git a/packages/plugins/graphql/server/bootstrap.js b/packages/plugins/graphql/server/bootstrap.js index cf10468464..458227e4c8 100644 --- a/packages/plugins/graphql/server/bootstrap.js +++ b/packages/plugins/graphql/server/bootstrap.js @@ -18,12 +18,26 @@ const merge = mergeWith((a, b) => { } }); +/** + * Register the upload middleware powered by graphql-upload in Strapi + * @param {object} strapi + * @param {string} path + */ +const useUploadMiddleware = (strapi, path) => { + const uploadMiddleware = graphqlUploadKoa(); + + strapi.server.app.use((ctx, next) => { + if (ctx.path === path) { + return uploadMiddleware(ctx, next); + } + + return next(); + }); +}; + module.exports = async ({ strapi }) => { // Generate the GraphQL schema for the content API - const schema = strapi - .plugin('graphql') - .service('content-api') - .buildSchema(); + const schema = strapi.plugin('graphql').service('content-api').buildSchema(); if (isEmpty(schema)) { strapi.log.warn('The GraphQL schema has not been generated because it is empty'); @@ -138,20 +152,3 @@ module.exports = async ({ strapi }) => { await server.stop(); }; }; - -/** - * Register the upload middleware powered by graphql-upload in Strapi - * @param {object} strapi - * @param {string} path - */ -const useUploadMiddleware = (strapi, path) => { - const uploadMiddleware = graphqlUploadKoa(); - - strapi.server.app.use((ctx, next) => { - if (ctx.path === path) { - return uploadMiddleware(ctx, next); - } - - return next(); - }); -}; diff --git a/packages/plugins/graphql/server/format-graphql-error.js b/packages/plugins/graphql/server/format-graphql-error.js index bfd946fa63..e5d318b484 100644 --- a/packages/plugins/graphql/server/format-graphql-error.js +++ b/packages/plugins/graphql/server/format-graphql-error.js @@ -1,13 +1,8 @@ 'use strict'; const { toUpper, snakeCase, pick, isEmpty } = require('lodash/fp'); -const { - HttpError, - ForbiddenError, - UnauthorizedError, - ApplicationError, - ValidationError, -} = require('@strapi/utils').errors; +const { HttpError, ForbiddenError, UnauthorizedError, ApplicationError, ValidationError } = + require('@strapi/utils').errors; const { ApolloError, UserInputError: ApolloUserInputError, @@ -15,10 +10,10 @@ const { } = require('apollo-server-koa'); const { GraphQLError } = require('graphql'); -const formatToCode = name => `STRAPI_${toUpper(snakeCase(name))}`; -const formatErrorToExtension = error => ({ error: pick(['name', 'message', 'details'])(error) }); +const formatToCode = (name) => `STRAPI_${toUpper(snakeCase(name))}`; +const formatErrorToExtension = (error) => ({ error: pick(['name', 'message', 'details'])(error) }); -const formatGraphqlError = error => { +const formatGraphqlError = (error) => { const { originalError } = error; if (isEmpty(originalError)) { diff --git a/packages/plugins/graphql/server/services/builders/dynamic-zones.js b/packages/plugins/graphql/server/services/builders/dynamic-zones.js index 2ad05a41c9..f1ac86701f 100644 --- a/packages/plugins/graphql/server/services/builders/dynamic-zones.js +++ b/packages/plugins/graphql/server/services/builders/dynamic-zones.js @@ -10,7 +10,7 @@ module.exports = ({ strapi }) => { const { ERROR_TYPE_NAME } = strapi.plugin('graphql').service('constants'); const isEmpty = components.length === 0; - const componentsTypeNames = components.map(componentUID => { + const componentsTypeNames = components.map((componentUID) => { const component = strapi.components[componentUID]; if (!component) { @@ -40,15 +40,15 @@ module.exports = ({ strapi }) => { }; const buildInputDefinition = (name, components) => { - const parseData = value => { + const parseData = (value) => { const component = Object.values(strapi.components).find( - component => component.globalId === value.__typename + (component) => component.globalId === value.__typename ); if (!component) { throw new ApplicationError( `Component not found. expected one of: ${components - .map(uid => strapi.components[uid].globalId) + .map((uid) => strapi.components[uid].globalId) .join(', ')}` ); } @@ -62,9 +62,9 @@ module.exports = ({ strapi }) => { return scalarType({ name, - serialize: value => value, + serialize: (value) => value, - parseValue: value => parseData(value), + parseValue: (value) => parseData(value), parseLiteral(ast, variables) { if (ast.kind !== Kind.OBJECT) { diff --git a/packages/plugins/graphql/server/services/builders/entity-meta.js b/packages/plugins/graphql/server/services/builders/entity-meta.js index 4d7c3aff49..8a525ca130 100644 --- a/packages/plugins/graphql/server/services/builders/entity-meta.js +++ b/packages/plugins/graphql/server/services/builders/entity-meta.js @@ -1,6 +1,6 @@ 'use strict'; -function buildEntityMetaDefinition(/*contentType*/) {} +function buildEntityMetaDefinition(/* contentType */) {} module.exports = () => ({ buildEntityMetaDefinition, diff --git a/packages/plugins/graphql/server/services/builders/filters/content-type.js b/packages/plugins/graphql/server/services/builders/filters/content-type.js index 75511ac578..da044d8620 100644 --- a/packages/plugins/graphql/server/services/builders/filters/content-type.js +++ b/packages/plugins/graphql/server/services/builders/filters/content-type.js @@ -9,63 +9,6 @@ module.exports = ({ strapi }) => { return [operators.and, operators.or, operators.not]; }; - const buildContentTypeFilters = contentType => { - const utils = strapi.plugin('graphql').service('utils'); - const extension = strapi.plugin('graphql').service('extension'); - - const { getFiltersInputTypeName, getScalarFilterInputTypeName } = utils.naming; - const { isStrapiScalar, isRelation, isComponent } = utils.attributes; - - const { attributes } = contentType; - - const filtersTypeName = getFiltersInputTypeName(contentType); - - return inputObjectType({ - name: filtersTypeName, - - definition(t) { - const validAttributes = Object.entries(attributes).filter(([attributeName]) => - extension - .shadowCRUD(contentType.uid) - .field(attributeName) - .hasFiltersEnabeld() - ); - - const isIDFilterEnabled = extension - .shadowCRUD(contentType.uid) - .field('id') - .hasFiltersEnabeld(); - // Add an ID filter to the collection types - if (contentType.kind === 'collectionType' && isIDFilterEnabled) { - t.field('id', { type: getScalarFilterInputTypeName('ID') }); - } - - // Add every defined attribute - for (const [attributeName, attribute] of validAttributes) { - // Handle scalars - if (isStrapiScalar(attribute)) { - addScalarAttribute(t, attributeName, attribute); - } - - // Handle relations - else if (isRelation(attribute)) { - addRelationalAttribute(t, attributeName, attribute); - } - - // Handle components - else if (isComponent(attribute)) { - addComponentAttribute(t, attributeName, attribute); - } - } - - // Conditional clauses - for (const operator of rootLevelOperators()) { - operator.add(t, filtersTypeName); - } - }, - }); - }; - const addScalarAttribute = (builder, attributeName, attribute) => { const { naming, mappers } = strapi.plugin('graphql').service('utils'); @@ -108,6 +51,60 @@ module.exports = ({ strapi }) => { builder.field(attributeName, { type: getFiltersInputTypeName(component) }); }; + const buildContentTypeFilters = (contentType) => { + const utils = strapi.plugin('graphql').service('utils'); + const extension = strapi.plugin('graphql').service('extension'); + + const { getFiltersInputTypeName, getScalarFilterInputTypeName } = utils.naming; + const { isStrapiScalar, isRelation, isComponent } = utils.attributes; + + const { attributes } = contentType; + + const filtersTypeName = getFiltersInputTypeName(contentType); + + return inputObjectType({ + name: filtersTypeName, + + definition(t) { + const validAttributes = Object.entries(attributes).filter(([attributeName]) => + extension.shadowCRUD(contentType.uid).field(attributeName).hasFiltersEnabeld() + ); + + const isIDFilterEnabled = extension + .shadowCRUD(contentType.uid) + .field('id') + .hasFiltersEnabeld(); + // Add an ID filter to the collection types + if (contentType.kind === 'collectionType' && isIDFilterEnabled) { + t.field('id', { type: getScalarFilterInputTypeName('ID') }); + } + + // Add every defined attribute + for (const [attributeName, attribute] of validAttributes) { + // Handle scalars + if (isStrapiScalar(attribute)) { + addScalarAttribute(t, attributeName, attribute); + } + + // Handle relations + else if (isRelation(attribute)) { + addRelationalAttribute(t, attributeName, attribute); + } + + // Handle components + else if (isComponent(attribute)) { + addComponentAttribute(t, attributeName, attribute); + } + } + + // Conditional clauses + for (const operator of rootLevelOperators()) { + operator.add(t, filtersTypeName); + } + }, + }); + }; + return { buildContentTypeFilters, }; diff --git a/packages/plugins/graphql/server/services/builders/filters/index.js b/packages/plugins/graphql/server/services/builders/filters/index.js index a70b629107..2f378b36f8 100644 --- a/packages/plugins/graphql/server/services/builders/filters/index.js +++ b/packages/plugins/graphql/server/services/builders/filters/index.js @@ -2,6 +2,6 @@ const contentType = require('./content-type'); -module.exports = context => ({ +module.exports = (context) => ({ ...contentType(context), }); diff --git a/packages/plugins/graphql/server/services/builders/filters/operators/index.js b/packages/plugins/graphql/server/services/builders/filters/operators/index.js index be5b5a022b..377074d669 100644 --- a/packages/plugins/graphql/server/services/builders/filters/operators/index.js +++ b/packages/plugins/graphql/server/services/builders/filters/operators/index.js @@ -36,4 +36,4 @@ const operators = { }; // Instantiate every operator with the Strapi instance -module.exports = context => mapValues(opCtor => opCtor(context), operators); +module.exports = (context) => mapValues((opCtor) => opCtor(context), operators); diff --git a/packages/plugins/graphql/server/services/builders/index.js b/packages/plugins/graphql/server/services/builders/index.js index c611241d10..7606d4c79c 100644 --- a/packages/plugins/graphql/server/services/builders/index.js +++ b/packages/plugins/graphql/server/services/builders/index.js @@ -55,7 +55,7 @@ module.exports = ({ strapi }) => { const builders = pipe( // Create a new instance of every builders - map(factory => factory(context)), + map((factory) => factory(context)), // Merge every builder into the same object reduce(merge, {}) ).call(null, buildersFactories); diff --git a/packages/plugins/graphql/server/services/builders/input.js b/packages/plugins/graphql/server/services/builders/input.js index 4e53eec744..03671e269d 100644 --- a/packages/plugins/graphql/server/services/builders/input.js +++ b/packages/plugins/graphql/server/services/builders/input.js @@ -5,18 +5,14 @@ const { contentTypes: { isWritableAttribute }, } = require('@strapi/utils'); -module.exports = context => { +module.exports = (context) => { const { strapi } = context; const { naming, mappers, attributes } = strapi.plugin('graphql').service('utils'); const extension = strapi.plugin('graphql').service('extension'); - const { - getComponentInputName, - getContentTypeInputName, - getEnumName, - getDynamicZoneInputName, - } = naming; + const { getComponentInputName, getContentTypeInputName, getEnumName, getDynamicZoneInputName } = + naming; const { isStrapiScalar, @@ -32,20 +28,16 @@ module.exports = context => { buildInputType(contentType) { const { attributes, modelType } = contentType; - const name = (modelType === 'component' - ? getComponentInputName - : getContentTypeInputName + const name = ( + modelType === 'component' ? getComponentInputName : getContentTypeInputName ).call(null, contentType); return inputObjectType({ name, definition(t) { - const isFieldEnabled = fieldName => { - return extension - .shadowCRUD(contentType.uid) - .field(fieldName) - .hasInputEnabled(); + const isFieldEnabled = (fieldName) => { + return extension.shadowCRUD(contentType.uid).field(fieldName).hasInputEnabled(); }; const validAttributes = Object.entries(attributes).filter(([attributeName]) => { @@ -80,7 +72,11 @@ module.exports = context => { return; } - isMultiple ? t.list.id(attributeName) : t.id(attributeName); + if (isMultiple) { + t.list.id(attributeName); + } else { + t.id(attributeName); + } } // Regular Relations (ignore polymorphic relations) @@ -91,7 +87,11 @@ module.exports = context => { const isToManyRelation = attribute.relation.endsWith('Many'); - isToManyRelation ? t.list.id(attributeName) : t.id(attributeName); + if (isToManyRelation) { + t.list.id(attributeName); + } else { + t.id(attributeName); + } } // Components diff --git a/packages/plugins/graphql/server/services/builders/mutations/collection-type.js b/packages/plugins/graphql/server/services/builders/mutations/collection-type.js index 618a63d4ea..e7cefb4eb5 100644 --- a/packages/plugins/graphql/server/services/builders/mutations/collection-type.js +++ b/packages/plugins/graphql/server/services/builders/mutations/collection-type.js @@ -149,7 +149,7 @@ module.exports = ({ strapi }) => { return extension.use({ resolversConfig: { [action]: { auth } } }); }; - const isActionEnabled = action => { + const isActionEnabled = (action) => { return extension.shadowCRUD(contentType.uid).isActionEnabled(action); }; diff --git a/packages/plugins/graphql/server/services/builders/mutations/index.js b/packages/plugins/graphql/server/services/builders/mutations/index.js index b2b6241da9..915f185f6e 100644 --- a/packages/plugins/graphql/server/services/builders/mutations/index.js +++ b/packages/plugins/graphql/server/services/builders/mutations/index.js @@ -3,7 +3,7 @@ const createCollectionTypeMutationsBuilder = require('./collection-type'); const createSingleTypeMutationsBuilder = require('./single-type'); -module.exports = context => ({ +module.exports = (context) => ({ ...createCollectionTypeMutationsBuilder(context), ...createSingleTypeMutationsBuilder(context), }); diff --git a/packages/plugins/graphql/server/services/builders/mutations/single-type.js b/packages/plugins/graphql/server/services/builders/mutations/single-type.js index 3ecc14a677..0027fc0513 100644 --- a/packages/plugins/graphql/server/services/builders/mutations/single-type.js +++ b/packages/plugins/graphql/server/services/builders/mutations/single-type.js @@ -108,7 +108,7 @@ module.exports = ({ strapi }) => { return extension.use({ resolversConfig: { [action]: { auth } } }); }; - const isActionEnabled = action => { + const isActionEnabled = (action) => { return extension.shadowCRUD(contentType.uid).isActionEnabled(action); }; diff --git a/packages/plugins/graphql/server/services/builders/queries/collection-type.js b/packages/plugins/graphql/server/services/builders/queries/collection-type.js index acf648473a..4192f1a2c2 100644 --- a/packages/plugins/graphql/server/services/builders/queries/collection-type.js +++ b/packages/plugins/graphql/server/services/builders/queries/collection-type.js @@ -16,7 +16,7 @@ module.exports = ({ strapi }) => { getEntityResponseCollectionName, } = naming; - const buildCollectionTypeQueries = contentType => { + const buildCollectionTypeQueries = (contentType) => { const findOneQueryName = `Query.${getFindOneQueryName(contentType)}`; const findQueryName = `Query.${getFindQueryName(contentType)}`; @@ -26,7 +26,7 @@ module.exports = ({ strapi }) => { return extension.use({ resolversConfig: { [action]: { auth } } }); }; - const isActionEnabled = action => { + const isActionEnabled = (action) => { return extension.shadowCRUD(contentType.uid).isActionEnabled(action); }; diff --git a/packages/plugins/graphql/server/services/builders/queries/index.js b/packages/plugins/graphql/server/services/builders/queries/index.js index f625ea090e..6fc1b072f7 100644 --- a/packages/plugins/graphql/server/services/builders/queries/index.js +++ b/packages/plugins/graphql/server/services/builders/queries/index.js @@ -3,7 +3,7 @@ const createCollectionTypeQueriesBuilder = require('./collection-type'); const createSingleTypeQueriesBuilder = require('./single-type'); -module.exports = context => ({ +module.exports = (context) => ({ ...createCollectionTypeQueriesBuilder(context), ...createSingleTypeQueriesBuilder(context), }); diff --git a/packages/plugins/graphql/server/services/builders/queries/single-type.js b/packages/plugins/graphql/server/services/builders/queries/single-type.js index b936d9bec1..9482259a13 100644 --- a/packages/plugins/graphql/server/services/builders/queries/single-type.js +++ b/packages/plugins/graphql/server/services/builders/queries/single-type.js @@ -11,7 +11,7 @@ module.exports = ({ strapi }) => { const { getFindOneQueryName, getEntityResponseName } = naming; - const buildSingleTypeQueries = contentType => { + const buildSingleTypeQueries = (contentType) => { const findQueryName = `Query.${getFindOneQueryName(contentType)}`; const extension = getService('extension'); @@ -20,7 +20,7 @@ module.exports = ({ strapi }) => { return extension.use({ resolversConfig: { [action]: { auth } } }); }; - const isActionEnabled = action => { + const isActionEnabled = (action) => { return extension.shadowCRUD(contentType.uid).isActionEnabled(action); }; diff --git a/packages/plugins/graphql/server/services/builders/resolvers/association.js b/packages/plugins/graphql/server/services/builders/resolvers/association.js index cb9006b674..f7463bf7bb 100644 --- a/packages/plugins/graphql/server/services/builders/resolvers/association.js +++ b/packages/plugins/graphql/server/services/builders/resolvers/association.js @@ -33,7 +33,7 @@ module.exports = ({ strapi }) => { const targetContentType = strapi.getModel(targetUID); - return async (parent, args = {}, context) => { + return async (parent, args = {}, context = {}) => { const { auth } = context.state; const transformedArgs = transformArgs(args, { @@ -58,8 +58,8 @@ module.exports = ({ strapi }) => { // so that the sanitize util can work properly. if (isMorphAttribute) { // Helpers used for the data cleanup - const wrapData = dataToWrap => ({ [attributeName]: dataToWrap }); - const sanitizeData = dataToSanitize => { + const wrapData = (dataToWrap) => ({ [attributeName]: dataToWrap }); + const sanitizeData = (dataToSanitize) => { return sanitize.contentAPI.output(dataToSanitize, contentType, { auth }); }; const unwrapData = get(attributeName); @@ -72,7 +72,7 @@ module.exports = ({ strapi }) => { // If this is a to-many relation, it returns an object that // matches what the entity-response-collection's resolvers expect - else if (isToMany) { + if (isToMany) { return toEntityResponseCollection(data, info); } diff --git a/packages/plugins/graphql/server/services/builders/resolvers/dynamic-zone.js b/packages/plugins/graphql/server/services/builders/resolvers/dynamic-zone.js index b8be0e14c0..69ce8ab8eb 100644 --- a/packages/plugins/graphql/server/services/builders/resolvers/dynamic-zone.js +++ b/packages/plugins/graphql/server/services/builders/resolvers/dynamic-zone.js @@ -2,7 +2,7 @@ module.exports = ({ strapi }) => ({ buildDynamicZoneResolver({ contentTypeUID, attributeName }) { - return async parent => { + return async (parent) => { return strapi.entityService.load(contentTypeUID, parent, attributeName); }; }, diff --git a/packages/plugins/graphql/server/services/builders/resolvers/index.js b/packages/plugins/graphql/server/services/builders/resolvers/index.js index 919bea485a..93a0792d26 100644 --- a/packages/plugins/graphql/server/services/builders/resolvers/index.js +++ b/packages/plugins/graphql/server/services/builders/resolvers/index.js @@ -6,7 +6,7 @@ const mutationsResolvers = require('./mutation'); const componentResolvers = require('./component'); const dynamicZoneResolvers = require('./dynamic-zone'); -module.exports = context => ({ +module.exports = (context) => ({ // Generics ...associationResolvers(context), diff --git a/packages/plugins/graphql/server/services/builders/type.js b/packages/plugins/graphql/server/services/builders/type.js index 24202aeade..cf3f8491a7 100644 --- a/packages/plugins/graphql/server/services/builders/type.js +++ b/packages/plugins/graphql/server/services/builders/type.js @@ -16,7 +16,7 @@ const { contentTypes } = require('@strapi/utils'); * @property {object} context.strapi * @property {object} context.registry */ -module.exports = context => { +module.exports = (context) => { const { strapi } = context; const getGraphQLService = strapi.plugin('graphql').service; @@ -48,6 +48,8 @@ module.exports = context => { * @param {TypeBuildersOptions} options */ const addComponentAttribute = ({ builder, attributeName, contentType, attribute }) => { + let localBuilder = builder; + const { naming } = getGraphQLService('utils'); const { getContentTypeArgs } = getGraphQLService('builders').utils; const { buildComponentResolver } = getGraphQLService('builders').get('content-api'); @@ -55,7 +57,7 @@ module.exports = context => { const type = naming.getComponentNameFromAttribute(attribute); if (attribute.repeatable) { - builder = builder.list; + localBuilder = localBuilder.list; } const targetComponent = strapi.getModel(attribute.component); @@ -68,7 +70,7 @@ module.exports = context => { const args = getContentTypeArgs(targetComponent, { multiple: !!attribute.repeatable }); - builder.field(attributeName, { type, resolve, args }); + localBuilder.field(attributeName, { type, resolve, args }); }; /** @@ -124,13 +126,13 @@ module.exports = context => { * Add a media attribute to the type definition * @param {TypeBuildersOptions} options */ - const addMediaAttribute = options => { + const addMediaAttribute = (options) => { const { naming } = getGraphQLService('utils'); const { getContentTypeArgs } = getGraphQLService('builders').utils; const { buildAssociationResolver } = getGraphQLService('builders').get('content-api'); const extension = getGraphQLService('extension'); - let { builder } = options; + const { builder } = options; const { attributeName, attribute, contentType } = options; const fileUID = 'plugin::upload.file'; @@ -158,7 +160,7 @@ module.exports = context => { * Add a polymorphic relational attribute to the type definition * @param {TypeBuildersOptions} options */ - const addPolymorphicRelationalAttribute = options => { + const addPolymorphicRelationalAttribute = (options) => { const { GENERIC_MORPH_TYPENAME } = getGraphQLService('constants'); const { naming } = getGraphQLService('utils'); const { buildAssociationResolver } = getGraphQLService('builders').get('content-api'); @@ -201,13 +203,13 @@ module.exports = context => { * Add a regular relational attribute to the type definition * @param {TypeBuildersOptions} options */ - const addRegularRelationalAttribute = options => { + const addRegularRelationalAttribute = (options) => { const { naming } = getGraphQLService('utils'); const { getContentTypeArgs } = getGraphQLService('builders').utils; const { buildAssociationResolver } = getGraphQLService('builders').get('content-api'); const extension = getGraphQLService('extension'); - let { builder } = options; + const { builder } = options; const { attributeName, attribute, contentType } = options; if (extension.shadowCRUD(attribute.target).isDisabled()) { @@ -238,15 +240,12 @@ module.exports = context => { builder.field(attributeName, { type, resolve, args }); }; - const isNotPrivate = contentType => attributeName => { + const isNotPrivate = (contentType) => (attributeName) => { return !contentTypes.isPrivateAttribute(contentType, attributeName); }; - const isNotDisabled = contentType => attributeName => { - return extension - .shadowCRUD(contentType.uid) - .field(attributeName) - .hasOutputEnabled(); + const isNotDisabled = (contentType) => (attributeName) => { + return extension.shadowCRUD(contentType.uid).field(attributeName).hasOutputEnabled(); }; return { @@ -306,7 +305,7 @@ module.exports = context => { // Ignore disabled fields (from extension service) .filter(isNotDisabled(contentType)) // Add each attribute to the type definition - .forEach(attributeName => { + .forEach((attributeName) => { const attribute = attributes[attributeName]; // We create a copy of the builder (t) to apply custom diff --git a/packages/plugins/graphql/server/services/builders/utils.js b/packages/plugins/graphql/server/services/builders/utils.js index cb6c15f30a..1734d22b12 100644 --- a/packages/plugins/graphql/server/services/builders/utils.js +++ b/packages/plugins/graphql/server/services/builders/utils.js @@ -35,7 +35,7 @@ module.exports = ({ strapi }) => { } // Collection Types - else if (kind === 'collectionType') { + if (kind === 'collectionType') { if (!multiple) { return { id: 'ID' }; } @@ -54,7 +54,7 @@ module.exports = ({ strapi }) => { } // Single Types - else if (kind === 'singleType') { + if (kind === 'singleType') { const params = {}; if (hasDraftAndPublish(contentType)) { @@ -85,7 +85,7 @@ module.exports = ({ strapi }) => { * @param {object} attributes - The attributes object to transform * @return {Object} */ - scalarAttributesToFiltersMap: mapValues(attribute => { + scalarAttributesToFiltersMap: mapValues((attribute) => { const { mappers, naming } = getService('utils'); const gqlScalar = mappers.strapiScalarToGraphQLScalar(attribute.type); diff --git a/packages/plugins/graphql/server/services/content-api/index.js b/packages/plugins/graphql/server/services/content-api/index.js index b2271002bb..8782752abb 100644 --- a/packages/plugins/graphql/server/services/content-api/index.js +++ b/packages/plugins/graphql/server/services/content-api/index.js @@ -127,9 +127,9 @@ module.exports = ({ strapi }) => { contentTypes .map(prop('uid')) .filter(startsWith('admin::')) - .forEach(uid => extensionService.shadowCRUD(uid).disable()); + .forEach((uid) => extensionService.shadowCRUD(uid).disable()); - const contentTypesWithShadowCRUD = contentTypes.filter(ct => + const contentTypesWithShadowCRUD = contentTypes.filter((ct) => extensionService.shadowCRUD(ct.uid).isEnabled() ); @@ -144,7 +144,7 @@ module.exports = ({ strapi }) => { * Register needed GraphQL types for every content type * @param {object[]} contentTypes */ - const registerAPITypes = contentTypes => { + const registerAPITypes = (contentTypes) => { for (const contentType of contentTypes) { const { kind, modelType } = contentType; @@ -174,7 +174,7 @@ module.exports = ({ strapi }) => { } }; - const registerMorphTypes = contentTypes => { + const registerMorphTypes = (contentTypes) => { // Create & register a union type that includes every type or component registered const genericMorphType = builders.buildGenericMorphDefinition(); registry.register(GENERIC_MORPH_TYPENAME, genericMorphType, { kind: KINDS.morph }); diff --git a/packages/plugins/graphql/server/services/content-api/register-functions/collection-type.js b/packages/plugins/graphql/server/services/content-api/register-functions/collection-type.js index bc23e4260b..9f80c517cb 100644 --- a/packages/plugins/graphql/server/services/content-api/register-functions/collection-type.js +++ b/packages/plugins/graphql/server/services/content-api/register-functions/collection-type.js @@ -19,7 +19,7 @@ const registerCollectionType = (contentType, { registry, strapi, builders }) => mutations: naming.getEntityMutationsTypeName(contentType), }; - const getConfig = kind => ({ kind, contentType }); + const getConfig = (kind) => ({ kind, contentType }); // Type definition registry.register(types.base, builders.buildTypeDefinition(contentType), getConfig(KINDS.type)); diff --git a/packages/plugins/graphql/server/services/content-api/register-functions/content-type/dynamic-zones.js b/packages/plugins/graphql/server/services/content-api/register-functions/content-type/dynamic-zones.js index 8b6493a29c..003d9a00df 100644 --- a/packages/plugins/graphql/server/services/content-api/register-functions/content-type/dynamic-zones.js +++ b/packages/plugins/graphql/server/services/content-api/register-functions/content-type/dynamic-zones.js @@ -11,7 +11,7 @@ const registerDynamicZonesDefinition = (contentType, { registry, strapi, builder const { attributes } = contentType; - const dynamicZoneAttributes = Object.keys(attributes).filter(attributeName => + const dynamicZoneAttributes = Object.keys(attributes).filter((attributeName) => isDynamicZone(attributes[attributeName]) ); diff --git a/packages/plugins/graphql/server/services/content-api/register-functions/content-type/enums.js b/packages/plugins/graphql/server/services/content-api/register-functions/content-type/enums.js index c198894280..ee358b12b6 100644 --- a/packages/plugins/graphql/server/services/content-api/register-functions/content-type/enums.js +++ b/packages/plugins/graphql/server/services/content-api/register-functions/content-type/enums.js @@ -11,7 +11,7 @@ const registerEnumsDefinition = (contentType, { registry, strapi, builders }) => const { attributes } = contentType; - const enumAttributes = Object.keys(attributes).filter(attributeName => + const enumAttributes = Object.keys(attributes).filter((attributeName) => isEnumeration(attributes[attributeName]) ); diff --git a/packages/plugins/graphql/server/services/content-api/register-functions/polymorphic.js b/packages/plugins/graphql/server/services/content-api/register-functions/polymorphic.js index c38a3cb254..a4f578aad0 100644 --- a/packages/plugins/graphql/server/services/content-api/register-functions/polymorphic.js +++ b/packages/plugins/graphql/server/services/content-api/register-functions/polymorphic.js @@ -31,9 +31,9 @@ const registerPolymorphicContentType = (contentType, { registry, strapi }) => { // Transform target UIDs into types names const members = target // Get content types definitions - .map(uid => strapi.getModel(uid)) + .map((uid) => strapi.getModel(uid)) // Resolve types names - .map(contentType => naming.getTypeName(contentType)); + .map((contentType) => naming.getTypeName(contentType)); // Register the new polymorphic union type registry.register( diff --git a/packages/plugins/graphql/server/services/content-api/register-functions/single-type.js b/packages/plugins/graphql/server/services/content-api/register-functions/single-type.js index 545b853bb1..571236af7c 100644 --- a/packages/plugins/graphql/server/services/content-api/register-functions/single-type.js +++ b/packages/plugins/graphql/server/services/content-api/register-functions/single-type.js @@ -18,7 +18,7 @@ const registerSingleType = (contentType, { registry, strapi, builders }) => { mutations: naming.getEntityMutationsTypeName(contentType), }; - const getConfig = kind => ({ kind, contentType }); + const getConfig = (kind) => ({ kind, contentType }); // Single type's definition registry.register(types.base, builders.buildTypeDefinition(contentType), getConfig(KINDS.type)); diff --git a/packages/plugins/graphql/server/services/content-api/wrap-resolvers.js b/packages/plugins/graphql/server/services/content-api/wrap-resolvers.js index 627c45650e..d1ce5cb40e 100644 --- a/packages/plugins/graphql/server/services/content-api/wrap-resolvers.js +++ b/packages/plugins/graphql/server/services/content-api/wrap-resolvers.js @@ -15,6 +15,37 @@ const introspectionQueries = [ '__Directive', ]; +/** + * Get & parse middlewares definitions from the resolver's config + * @param {object} resolverConfig + * @param {object} strapi + * @return {function[]} + */ +const parseMiddlewares = (resolverConfig, strapi) => { + const resolverMiddlewares = getOr([], 'middlewares', resolverConfig); + + // TODO: [v4] to factorize with compose endpoints (routes) + return resolverMiddlewares.map((middleware) => { + if (isFunction(middleware)) { + return middleware; + } + + if (typeof middleware === 'string') { + return strapi.middleware(middleware); + } + + if (typeof middleware === 'object') { + const { name, options = {} } = middleware; + + return strapi.middleware(name)(options); + } + + throw new Error( + `Invalid middleware type, expected (function,string,object), received ${typeof middleware}` + ); + }); +}; + /** * Wrap the schema's resolvers if they've been * customized using the GraphQL extension service @@ -114,31 +145,4 @@ const wrapResolvers = ({ schema, strapi, extension = {} }) => { return schema; }; -/** - * Get & parse middlewares definitions from the resolver's config - * @param {object} resolverConfig - * @param {object} strapi - * @return {function[]} - */ -const parseMiddlewares = (resolverConfig, strapi) => { - const resolverMiddlewares = getOr([], 'middlewares', resolverConfig); - - // TODO: [v4] to factorize with compose endpoints (routes) - return resolverMiddlewares.map(middleware => { - if (isFunction(middleware)) { - return middleware; - } - - if (typeof middleware === 'string') { - return strapi.middleware(middleware); - } - - if (typeof middleware === 'object') { - const { name, options = {} } = middleware; - - return strapi.middleware(name)(options); - } - }); -}; - module.exports = { wrapResolvers }; diff --git a/packages/plugins/graphql/server/services/extension/extension.js b/packages/plugins/graphql/server/services/extension/extension.js index 0dcec14289..52080f717f 100644 --- a/packages/plugins/graphql/server/services/extension/extension.js +++ b/packages/plugins/graphql/server/services/extension/extension.js @@ -50,15 +50,14 @@ const createExtension = ({ strapi } = {}) => { * @return {object} */ generate({ typeRegistry }) { - const resolveConfig = config => { + const resolveConfig = (config) => { return typeof config === 'function' ? config({ strapi, nexus, typeRegistry }) : config; }; // Evaluate & merge every registered configuration object, then return the result return configs.reduce((acc, configuration) => { - const { types, typeDefs, resolvers, resolversConfig, plugins } = resolveConfig( - configuration - ); + const { types, typeDefs, resolvers, resolversConfig, plugins } = + resolveConfig(configuration); // Register type definitions if (typeof typeDefs === 'string') { diff --git a/packages/plugins/graphql/server/services/extension/shadow-crud-manager.js b/packages/plugins/graphql/server/services/extension/shadow-crud-manager.js index 9f3118680c..7a3408cc83 100644 --- a/packages/plugins/graphql/server/services/extension/shadow-crud-manager.js +++ b/packages/plugins/graphql/server/services/extension/shadow-crud-manager.js @@ -24,7 +24,7 @@ const ALL_ACTIONS = '*'; module.exports = () => { const configs = new Map(); - return uid => { + return (uid) => { if (!configs.has(uid)) { configs.set(uid, getDefaultContentTypeConfig()); } @@ -57,7 +57,9 @@ module.exports = () => { isActionEnabled(action) { const matchingActions = [action, ALL_ACTIONS]; - return configs.get(uid).disabledActions.every(action => !matchingActions.includes(action)); + return configs + .get(uid) + .disabledActions.every((action) => !matchingActions.includes(action)); }, isActionDisabled(action) { @@ -93,7 +95,7 @@ module.exports = () => { }, disableActions(actions = []) { - actions.forEach(action => this.disableAction(action)); + actions.forEach((action) => this.disableAction(action)); return this; }, diff --git a/packages/plugins/graphql/server/services/format/index.js b/packages/plugins/graphql/server/services/format/index.js index 31395c7e3e..3fcbc60bfc 100644 --- a/packages/plugins/graphql/server/services/format/index.js +++ b/packages/plugins/graphql/server/services/format/index.js @@ -2,6 +2,6 @@ const returnTypes = require('./return-types'); -module.exports = context => ({ +module.exports = (context) => ({ returnTypes: returnTypes(context), }); diff --git a/packages/plugins/graphql/server/services/internals/args/index.js b/packages/plugins/graphql/server/services/internals/args/index.js index 62b44bee71..265b2c71da 100644 --- a/packages/plugins/graphql/server/services/internals/args/index.js +++ b/packages/plugins/graphql/server/services/internals/args/index.js @@ -4,7 +4,7 @@ const SortArg = require('./sort'); const publicationState = require('./publication-state'); const PaginationArg = require('./pagination'); -module.exports = context => ({ +module.exports = (context) => ({ SortArg, PaginationArg, PublicationStateArg: publicationState(context), diff --git a/packages/plugins/graphql/server/services/internals/helpers/get-enabled-scalars.js b/packages/plugins/graphql/server/services/internals/helpers/get-enabled-scalars.js index 31782e8af0..77618bdd46 100644 --- a/packages/plugins/graphql/server/services/internals/helpers/get-enabled-scalars.js +++ b/packages/plugins/graphql/server/services/internals/helpers/get-enabled-scalars.js @@ -2,14 +2,16 @@ const { first } = require('lodash/fp'); -module.exports = ({ strapi }) => () => { - const { GRAPHQL_SCALAR_OPERATORS } = strapi.plugin('graphql').service('constants'); +module.exports = + ({ strapi }) => + () => { + const { GRAPHQL_SCALAR_OPERATORS } = strapi.plugin('graphql').service('constants'); - return ( - Object.entries(GRAPHQL_SCALAR_OPERATORS) - // To be valid, a GraphQL scalar must have at least one operator enabled - .filter(([, value]) => value.length > 0) - // Only keep the key (the scalar name) - .map(first) - ); -}; + return ( + Object.entries(GRAPHQL_SCALAR_OPERATORS) + // To be valid, a GraphQL scalar must have at least one operator enabled + .filter(([, value]) => value.length > 0) + // Only keep the key (the scalar name) + .map(first) + ); + }; diff --git a/packages/plugins/graphql/server/services/internals/helpers/index.js b/packages/plugins/graphql/server/services/internals/helpers/index.js index 61b815d69f..51b8d716ff 100644 --- a/packages/plugins/graphql/server/services/internals/helpers/index.js +++ b/packages/plugins/graphql/server/services/internals/helpers/index.js @@ -2,6 +2,6 @@ const getEnabledScalars = require('./get-enabled-scalars'); -module.exports = context => ({ +module.exports = (context) => ({ getEnabledScalars: getEnabledScalars(context), }); diff --git a/packages/plugins/graphql/server/services/internals/index.js b/packages/plugins/graphql/server/services/internals/index.js index 697ac23e08..29d24c3588 100644 --- a/packages/plugins/graphql/server/services/internals/index.js +++ b/packages/plugins/graphql/server/services/internals/index.js @@ -5,7 +5,7 @@ const scalars = require('./scalars'); const types = require('./types'); const helpers = require('./helpers'); -module.exports = context => ({ +module.exports = (context) => ({ args: args(context), scalars: scalars(context), buildInternalTypes: types(context), diff --git a/packages/plugins/graphql/server/services/internals/scalars/date.js b/packages/plugins/graphql/server/services/internals/scalars/date.js index af415fab66..7097c2f374 100644 --- a/packages/plugins/graphql/server/services/internals/scalars/date.js +++ b/packages/plugins/graphql/server/services/internals/scalars/date.js @@ -2,15 +2,17 @@ const { GraphQLDate } = require('graphql-scalars'); -const parseAndCast = parseFn => (...args) => { - const parsedValue = parseFn(...args); +const parseAndCast = + (parseFn) => + (...args) => { + const parsedValue = parseFn(...args); - if (parsedValue instanceof Date) { - return parsedValue.toISOString().split('T')[0]; - } + if (parsedValue instanceof Date) { + return parsedValue.toISOString().split('T')[0]; + } - return parsedValue; -}; + return parsedValue; + }; // GraphQLDate casts the date string to new Date, we want to keep it as a string so we cast it back to a string // see https://github.com/excitement-engineer/graphql-iso-date/issues/106 diff --git a/packages/plugins/graphql/server/services/internals/scalars/time.js b/packages/plugins/graphql/server/services/internals/scalars/time.js index 06134f2fd9..201d9b2fa2 100644 --- a/packages/plugins/graphql/server/services/internals/scalars/time.js +++ b/packages/plugins/graphql/server/services/internals/scalars/time.js @@ -27,7 +27,7 @@ const TimeScalar = new GraphQLScalarType({ throw new ValidationError('Time cannot represent non string type'); } - const value = ast.value; + const { value } = ast; return parseType({ type: 'time', value }); }, diff --git a/packages/plugins/graphql/server/services/internals/types/filters.js b/packages/plugins/graphql/server/services/internals/types/filters.js index efadc7b315..47f9bd1838 100644 --- a/packages/plugins/graphql/server/services/internals/types/filters.js +++ b/packages/plugins/graphql/server/services/internals/types/filters.js @@ -34,6 +34,6 @@ const buildScalarFilters = ({ strapi }) => { }, {}); }; -module.exports = context => ({ +module.exports = (context) => ({ scalars: buildScalarFilters(context), }); diff --git a/packages/plugins/graphql/server/services/internals/types/index.js b/packages/plugins/graphql/server/services/internals/types/index.js index f4253898e7..79820d52a7 100644 --- a/packages/plugins/graphql/server/services/internals/types/index.js +++ b/packages/plugins/graphql/server/services/internals/types/index.js @@ -6,7 +6,7 @@ const publicationState = require('./publication-state'); const filters = require('./filters'); const error = require('./error'); -module.exports = context => () => { +module.exports = (context) => () => { const { strapi } = context; const { KINDS } = strapi.plugin('graphql').service('constants'); diff --git a/packages/plugins/graphql/server/services/utils/attributes.js b/packages/plugins/graphql/server/services/utils/attributes.js index efef6daee8..1fb328b320 100644 --- a/packages/plugins/graphql/server/services/utils/attributes.js +++ b/packages/plugins/graphql/server/services/utils/attributes.js @@ -8,11 +8,8 @@ module.exports = ({ strapi }) => { * @param {object} attribute * @return {boolean} */ - const isStrapiScalar = attribute => { - return strapi - .plugin('graphql') - .service('constants') - .STRAPI_SCALARS.includes(attribute.type); + const isStrapiScalar = (attribute) => { + return strapi.plugin('graphql').service('constants').STRAPI_SCALARS.includes(attribute.type); }; /** @@ -20,11 +17,8 @@ module.exports = ({ strapi }) => { * @param {object} attribute * @return {boolean} */ - const isGraphQLScalar = attribute => { - return strapi - .plugin('graphql') - .service('constants') - .GRAPHQL_SCALARS.includes(attribute.type); + const isGraphQLScalar = (attribute) => { + return strapi.plugin('graphql').service('constants').GRAPHQL_SCALARS.includes(attribute.type); }; /** @@ -32,7 +26,7 @@ module.exports = ({ strapi }) => { * @param {object} attribute * @return {boolean} */ - const isMorphRelation = attribute => { + const isMorphRelation = (attribute) => { return isRelation(attribute) && attribute.relation.includes('morph'); }; diff --git a/packages/plugins/graphql/server/services/utils/index.js b/packages/plugins/graphql/server/services/utils/index.js index db4bbeda9b..0b3bd843bf 100644 --- a/packages/plugins/graphql/server/services/utils/index.js +++ b/packages/plugins/graphql/server/services/utils/index.js @@ -4,7 +4,7 @@ const mappers = require('./mappers'); const attributes = require('./attributes'); const naming = require('./naming'); -module.exports = context => ({ +module.exports = (context) => ({ naming: naming(context), attributes: attributes(context), mappers: mappers(context), diff --git a/packages/plugins/graphql/server/services/utils/mappers/entity-to-response-entity.js b/packages/plugins/graphql/server/services/utils/mappers/entity-to-response-entity.js index 58bc1d7d42..44b4f86aab 100644 --- a/packages/plugins/graphql/server/services/utils/mappers/entity-to-response-entity.js +++ b/packages/plugins/graphql/server/services/utils/mappers/entity-to-response-entity.js @@ -2,7 +2,7 @@ const { map } = require('lodash/fp'); -const entityToResponseEntity = entity => ({ id: entity.id, attributes: entity }); +const entityToResponseEntity = (entity) => ({ id: entity.id, attributes: entity }); const entitiesToResponseEntities = map(entityToResponseEntity); diff --git a/packages/plugins/graphql/server/services/utils/mappers/graphql-filters-to-strapi-query.js b/packages/plugins/graphql/server/services/utils/mappers/graphql-filters-to-strapi-query.js index 52b1b4d758..b03399b52e 100644 --- a/packages/plugins/graphql/server/services/utils/mappers/graphql-filters-to-strapi-query.js +++ b/packages/plugins/graphql/server/services/utils/mappers/graphql-filters-to-strapi-query.js @@ -8,7 +8,7 @@ const virtualScalarAttributes = ['id']; module.exports = ({ strapi }) => { const { service: getService } = strapi.plugin('graphql'); - const recursivelyReplaceScalarOperators = data => { + const recursivelyReplaceScalarOperators = (data) => { const { operators } = getService('builders').filters; if (Array.isArray(data)) { @@ -54,7 +54,7 @@ module.exports = ({ strapi }) => { // If filters is a collection, then apply the transformation to every item of the list if (Array.isArray(filters)) { - return filters.map(filtersItem => + return filters.map((filtersItem) => this.graphQLFiltersToStrapiQuery(filtersItem, contentType) ); } @@ -62,7 +62,7 @@ module.exports = ({ strapi }) => { const resultMap = {}; const { attributes } = contentType; - const isAttribute = attributeName => { + const isAttribute = (attributeName) => { return virtualScalarAttributes.includes(attributeName) || has(attributeName, attributes); }; diff --git a/packages/plugins/graphql/server/services/utils/mappers/graphql-scalar-to-operators.js b/packages/plugins/graphql/server/services/utils/mappers/graphql-scalar-to-operators.js index 68a01b67a7..66e3e6b4fd 100644 --- a/packages/plugins/graphql/server/services/utils/mappers/graphql-scalar-to-operators.js +++ b/packages/plugins/graphql/server/services/utils/mappers/graphql-scalar-to-operators.js @@ -8,7 +8,7 @@ module.exports = ({ strapi }) => ({ const { operators } = strapi.plugin('graphql').service('builders').filters; const associations = mapValues( - map(operatorName => operators[operatorName]), + map((operatorName) => operators[operatorName]), GRAPHQL_SCALAR_OPERATORS ); diff --git a/packages/plugins/graphql/server/services/utils/mappers/index.js b/packages/plugins/graphql/server/services/utils/mappers/index.js index 9013277876..dd099aa0bd 100644 --- a/packages/plugins/graphql/server/services/utils/mappers/index.js +++ b/packages/plugins/graphql/server/services/utils/mappers/index.js @@ -5,7 +5,7 @@ const graphQLFiltersToStrapiQuery = require('./graphql-filters-to-strapi-query') const graphqlScalarToOperators = require('./graphql-scalar-to-operators'); const entityToResponseEntity = require('./entity-to-response-entity'); -module.exports = context => ({ +module.exports = (context) => ({ ...strapiScalarToGraphQLScalar(context), ...graphQLFiltersToStrapiQuery(context), ...graphqlScalarToOperators(context), diff --git a/packages/plugins/graphql/server/services/utils/naming.js b/packages/plugins/graphql/server/services/utils/naming.js index 5762daafc3..d082792f46 100644 --- a/packages/plugins/graphql/server/services/utils/naming.js +++ b/packages/plugins/graphql/server/services/utils/naming.js @@ -50,7 +50,7 @@ module.exports = ({ strapi }) => { * @param {object} contentType * @return {string} */ - const getEntityName = contentType => { + const getEntityName = (contentType) => { return `${getTypeName(contentType)}Entity`; }; @@ -59,7 +59,7 @@ module.exports = ({ strapi }) => { * @param {object} contentType * @return {string} */ - const getEntityMetaName = contentType => { + const getEntityMetaName = (contentType) => { return `${getEntityName(contentType)}Meta`; }; @@ -68,7 +68,7 @@ module.exports = ({ strapi }) => { * @param {object} contentType * @return {string} */ - const getEntityResponseName = contentType => { + const getEntityResponseName = (contentType) => { return `${getEntityName(contentType)}Response`; }; @@ -77,7 +77,7 @@ module.exports = ({ strapi }) => { * @param {object} contentType * @return {string} */ - const getEntityResponseCollectionName = contentType => { + const getEntityResponseCollectionName = (contentType) => { return `${getEntityName(contentType)}ResponseCollection`; }; @@ -86,7 +86,7 @@ module.exports = ({ strapi }) => { * @param {object} contentType * @return {string} */ - const getRelationResponseCollectionName = contentType => { + const getRelationResponseCollectionName = (contentType) => { return `${getTypeName(contentType)}RelationResponseCollection`; }; @@ -95,7 +95,7 @@ module.exports = ({ strapi }) => { * @param {object} contentType * @return {string} */ - const getComponentName = contentType => { + const getComponentName = (contentType) => { return contentType.globalId; }; @@ -104,7 +104,7 @@ module.exports = ({ strapi }) => { * @param {object} attribute * @return {string} */ - const getComponentNameFromAttribute = attribute => { + const getComponentNameFromAttribute = (attribute) => { return strapi.components[attribute.component].globalId; }; @@ -139,7 +139,7 @@ module.exports = ({ strapi }) => { * @param {object} contentType * @return {string} */ - const getComponentInputName = contentType => { + const getComponentInputName = (contentType) => { const componentName = getComponentName(contentType); return `${componentName}Input`; @@ -150,7 +150,7 @@ module.exports = ({ strapi }) => { * @param {object} contentType * @return {string} */ - const getContentTypeInputName = contentType => { + const getContentTypeInputName = (contentType) => { const typeName = getTypeName(contentType); return `${typeName}Input`; @@ -161,7 +161,7 @@ module.exports = ({ strapi }) => { * @param {object} contentType * @return {string} */ - const getEntityQueriesTypeName = contentType => { + const getEntityQueriesTypeName = (contentType) => { return `${getEntityName(contentType)}Queries`; }; @@ -170,7 +170,7 @@ module.exports = ({ strapi }) => { * @param {object} contentType * @return {string} */ - const getEntityMutationsTypeName = contentType => { + const getEntityMutationsTypeName = (contentType) => { return `${getEntityName(contentType)}Mutations`; }; @@ -179,7 +179,7 @@ module.exports = ({ strapi }) => { * @param {object} contentType * @return {string} */ - const getFiltersInputTypeName = contentType => { + const getFiltersInputTypeName = (contentType) => { const isComponent = contentType.modelType === 'component'; const baseName = isComponent ? getComponentName(contentType) : getTypeName(contentType); @@ -192,7 +192,7 @@ module.exports = ({ strapi }) => { * @param {NexusGenScalars} scalarType * @return {string} */ - const getScalarFilterInputTypeName = scalarType => { + const getScalarFilterInputTypeName = (scalarType) => { return `${scalarType}FilterInput`; }; @@ -229,11 +229,11 @@ module.exports = ({ strapi }) => { } const getCustomTypeName = pipe( - ct => getTypeName(ct, { plurality }), + (ct) => getTypeName(ct, { plurality }), firstLetterCase === 'upper' ? upperFirst : lowerFirst ); - return contentType => `${prefix}${getCustomTypeName(contentType)}${suffix}`; + return (contentType) => `${prefix}${getCustomTypeName(contentType)}${suffix}`; }; const getFindQueryName = buildCustomTypeNameGenerator({ diff --git a/packages/plugins/graphql/tests/crud.test.e2e.js b/packages/plugins/graphql/tests/crud.test.e2e.js index e8873debdb..f17060c1a4 100644 --- a/packages/plugins/graphql/tests/crud.test.e2e.js +++ b/packages/plugins/graphql/tests/crud.test.e2e.js @@ -42,7 +42,7 @@ describe('Test Graphql API End to End', () => { strapi = await createStrapiInstance(); rq = await createAuthRequest({ strapi }); - graphqlQuery = body => { + graphqlQuery = (body) => { return rq({ url: '/graphql', method: 'POST', @@ -61,11 +61,11 @@ describe('Test Graphql API End to End', () => { { name: 'post 1', bigint: 1316130638171, nullable: 'value', category: 'BLOG' }, { name: 'post 2', bigint: 1416130639261, nullable: null, category: 'PRODUCT' }, ]; - let data = { + const data = { posts: [], }; - test.each(postsPayload)('Create Post %o', async post => { + test.each(postsPayload)('Create Post %o', async (post) => { const res = await graphqlQuery({ query: /* GraphQL */ ` mutation createPost($data: PostInput!) { @@ -125,7 +125,7 @@ describe('Test Graphql API End to End', () => { expect(body).toMatchObject({ data: { posts: { - data: postsPayload.map(entry => ({ + data: postsPayload.map((entry) => ({ id: expect.any(String), attributes: omit('id', entry), })), @@ -192,7 +192,7 @@ describe('Test Graphql API End to End', () => { `, }); - const expectedPosts = [...data.posts].reverse().map(entry => ({ + const expectedPosts = [...data.posts].reverse().map((entry) => ({ id: expect.any(String), attributes: omit('id', entry), })); @@ -394,12 +394,12 @@ describe('Test Graphql API End to End', () => { expect(posts.length).toBe(expected.length); // all the posts returned are in the expected array - posts.map(prop('attributes')).forEach(post => { + posts.map(prop('attributes')).forEach((post) => { expect(expected.map(omit('id'))).toEqual(expect.arrayContaining([post])); }); // all expected values are in the result - expected.forEach(expectedPost => { + expected.forEach((expectedPost) => { expect(posts.map(prop('attributes'))).toEqual( expect.arrayContaining([omit('id', expectedPost)]) ); @@ -487,7 +487,7 @@ describe('Test Graphql API End to End', () => { }); test('Delete Posts', async () => { - for (let post of data.posts) { + for (const post of data.posts) { const res = await graphqlQuery({ query: /* GraphQL */ ` mutation deletePost($id: ID!) { diff --git a/packages/plugins/graphql/tests/fields/date.test.e2e.js b/packages/plugins/graphql/tests/fields/date.test.e2e.js index b19a79a66c..240613ffdb 100644 --- a/packages/plugins/graphql/tests/fields/date.test.e2e.js +++ b/packages/plugins/graphql/tests/fields/date.test.e2e.js @@ -30,7 +30,7 @@ describe('Test Graphql API End to End', () => { strapi = await createStrapiInstance(); rq = await createAuthRequest({ strapi }); - graphqlQuery = body => { + graphqlQuery = (body) => { return rq({ url: '/graphql', method: 'POST', @@ -45,7 +45,7 @@ describe('Test Graphql API End to End', () => { }); describe('GraphQL - Date field', () => { - test.each(['2022-03-17', null])('Can create an entity with date equals: %s', async value => { + test.each(['2022-03-17', null])('Can create an entity with date equals: %s', async (value) => { const res = await graphqlQuery({ query: /* GraphQL */ ` mutation createPost($data: PostInput!) { @@ -81,7 +81,7 @@ describe('Test Graphql API End to End', () => { test.each(['2022-03-17T15:06:57.878Z', {}, [], 'something'])( 'Cannot create an entity with date equals: %s', - async value => { + async (value) => { const res = await graphqlQuery({ query: /* GraphQL */ ` mutation createPost($data: PostInput!) { @@ -114,7 +114,7 @@ describe('Test Graphql API End to End', () => { } ); - test.each(['2022-03-17'])('Can filter query with date: %s', async value => { + test.each(['2022-03-17'])('Can filter query with date: %s', async (value) => { const res = await graphqlQuery({ query: /* GraphQL */ ` query posts($myDate: Date!) { diff --git a/packages/plugins/graphql/tests/fields/datetime.test.e2e.js b/packages/plugins/graphql/tests/fields/datetime.test.e2e.js index 76162f524f..80aa02490e 100644 --- a/packages/plugins/graphql/tests/fields/datetime.test.e2e.js +++ b/packages/plugins/graphql/tests/fields/datetime.test.e2e.js @@ -30,7 +30,7 @@ describe('Test Graphql API End to End', () => { strapi = await createStrapiInstance(); rq = await createAuthRequest({ strapi }); - graphqlQuery = body => { + graphqlQuery = (body) => { return rq({ url: '/graphql', method: 'POST', @@ -47,7 +47,7 @@ describe('Test Graphql API End to End', () => { describe('GraphQL - Datetime field', () => { test.each(['2022-03-17T15:06:57.000Z', null])( 'Can create an entity with datetime equals: %s', - async value => { + async (value) => { const res = await graphqlQuery({ query: /* GraphQL */ ` mutation createPost($data: PostInput!) { @@ -84,7 +84,7 @@ describe('Test Graphql API End to End', () => { test.each(['2022-03-17', {}, [], 'something'])( 'Cannot create an entity with datetime equals: %s', - async value => { + async (value) => { const res = await graphqlQuery({ query: /* GraphQL */ ` mutation createPost($data: PostInput!) { @@ -117,7 +117,7 @@ describe('Test Graphql API End to End', () => { } ); - test.each(['2022-03-17T15:06:57.878Z'])('Can filter query with datetime: %s', async value => { + test.each(['2022-03-17T15:06:57.878Z'])('Can filter query with datetime: %s', async (value) => { const res = await graphqlQuery({ query: /* GraphQL */ ` query posts($myDatetime: DateTime!) { diff --git a/packages/plugins/graphql/tests/relations.test.e2e.js b/packages/plugins/graphql/tests/relations.test.e2e.js index 51047fc89a..8a64578fbd 100644 --- a/packages/plugins/graphql/tests/relations.test.e2e.js +++ b/packages/plugins/graphql/tests/relations.test.e2e.js @@ -119,7 +119,7 @@ describe('Test Graphql Relations API End to End', () => { strapi = await createStrapiInstance(); rq = await createAuthRequest({ strapi }); - graphqlQuery = body => { + graphqlQuery = (body) => { return rq({ url: '/graphql', method: 'POST', @@ -134,7 +134,7 @@ describe('Test Graphql Relations API End to End', () => { }); describe('Test relations features', () => { - let data = { + const data = { labels: [], documents: [], people: [], @@ -147,7 +147,7 @@ describe('Test Graphql Relations API End to End', () => { ]; const documentsPayload = [{ name: 'document 1' }, { name: 'document 2' }]; - test.each(labelsPayload)('Create label %o', async label => { + test.each(labelsPayload)('Create label %o', async (label) => { const res = await graphqlQuery({ query: /* GraphQL */ ` mutation createLabel($data: LabelInput!) { @@ -211,7 +211,7 @@ describe('Test Graphql Relations API End to End', () => { expect(body).toMatchObject({ data: { labels: { - data: labelsPayload.map(label => ({ id: expect.any(String), attributes: label })), + data: labelsPayload.map((label) => ({ id: expect.any(String), attributes: label })), }, }, }); @@ -220,7 +220,7 @@ describe('Test Graphql Relations API End to End', () => { data.labels = data.labels.concat(res.body.data.labels.data); }); - test.each(documentsPayload)('Create document linked to every labels %o', async document => { + test.each(documentsPayload)('Create document linked to every labels %o', async (document) => { const res = await graphqlQuery({ query: /* GraphQL */ ` mutation createDocument($data: DocumentInput!) { @@ -251,7 +251,7 @@ describe('Test Graphql Relations API End to End', () => { variables: { data: { ...document, - labels: data.labels.map(t => t.id), + labels: data.labels.map((t) => t.id), }, }, }); @@ -361,13 +361,13 @@ describe('Test Graphql Relations API End to End', () => { data: { labels: { data: expect.arrayContaining( - data.labels.map(label => ({ + data.labels.map((label) => ({ id: label.id, attributes: { ...label.attributes, documents: { data: expect.arrayContaining( - data.documents.map(document => ({ + data.documents.map((document) => ({ id: document.id, attributes: selectFields(document.attributes), })) @@ -459,7 +459,7 @@ describe('Test Graphql Relations API End to End', () => { variables: { id: document.id, data: { - labels: labels.map(label => label.id), + labels: labels.map((label) => label.id), }, }, }); @@ -472,7 +472,7 @@ describe('Test Graphql Relations API End to End', () => { attributes: { ...selectFields(document.attributes), labels: { - data: labels.map(label => ({ + data: labels.map((label) => ({ id: label.id, attributes: { ...selectFields(label.attributes), @@ -488,7 +488,7 @@ describe('Test Graphql Relations API End to End', () => { }); test('Delete Labels and test Documents relations', async () => { - for (let label of data.labels) { + for (const label of data.labels) { const res = await graphqlQuery({ query: /* GraphQL */ ` mutation deleteLabel($id: ID!) { @@ -565,7 +565,7 @@ describe('Test Graphql Relations API End to End', () => { data: { documents: { data: expect.arrayContaining( - data.documents.map(document => ({ + data.documents.map((document) => ({ id: document.id, attributes: { ...selectFields(document.attributes), @@ -579,7 +579,7 @@ describe('Test Graphql Relations API End to End', () => { }); test('Delete Documents', async () => { - for (let document of data.documents) { + for (const document of data.documents) { const res = await graphqlQuery({ query: /* GraphQL */ ` mutation deleteDocument($id: ID!) { @@ -799,7 +799,7 @@ describe('Test Graphql Relations API End to End', () => { const queryRes = await graphqlQuery({ query: /* GraphQL */ ` - query($id: ID!) { + query ($id: ID!) { car(id: $id) { data { attributes { diff --git a/packages/plugins/graphql/tests/single-type.test.e2e.js b/packages/plugins/graphql/tests/single-type.test.e2e.js index c5148e692a..ff6d9511f9 100644 --- a/packages/plugins/graphql/tests/single-type.test.e2e.js +++ b/packages/plugins/graphql/tests/single-type.test.e2e.js @@ -23,7 +23,7 @@ const homePageModel = { }, }; -const updateContent = data => { +const updateContent = (data) => { return graphqlQuery({ query: /* GraphQL */ ` mutation updateHomePage($data: HomePageInput!) { @@ -45,7 +45,7 @@ describe('Single type Graphql support', () => { strapi = await createStrapiInstance(); rq = await createAuthRequest({ strapi }); - graphqlQuery = body => { + graphqlQuery = (body) => { return rq({ url: '/graphql', method: 'POST', 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 50e51eb1a4..86e3fe376d 100644 --- a/packages/plugins/i18n/admin/src/components/CMEditViewInjectedComponents/CMEditViewCopyLocale/index.js +++ b/packages/plugins/i18n/admin/src/components/CMEditViewInjectedComponents/CMEditViewCopyLocale/index.js @@ -31,7 +31,7 @@ const CenteredTypography = styled(Typography)` text-align: center; `; -const CMEditViewCopyLocale = props => { +const CMEditViewCopyLocale = (props) => { if (!props.localizations.length) { return null; } @@ -64,7 +64,7 @@ const Content = ({ appLocales, currentLocale, localizations, readPermissions }) const { data: response } = await axiosInstance.get(requestURL); const cleanedData = cleanData(response, allLayoutData, localizations); - ['createdBy', 'updatedBy', 'publishedAt', 'id', 'createdAt'].forEach(key => { + ['createdBy', 'updatedBy', 'publishedAt', 'id', 'createdAt'].forEach((key) => { if (!initialData[key]) return; cleanedData[key] = initialData[key]; }); @@ -94,12 +94,12 @@ const Content = ({ appLocales, currentLocale, localizations, readPermissions }) } }; - const handleChange = value => { + const handleChange = (value) => { setValue(value); }; const handleToggle = () => { - setIsOpen(prev => !prev); + setIsOpen((prev) => !prev); }; return ( diff --git a/packages/plugins/i18n/admin/src/components/CMEditViewInjectedComponents/CMEditViewCopyLocale/utils/generateOptions.js b/packages/plugins/i18n/admin/src/components/CMEditViewInjectedComponents/CMEditViewCopyLocale/utils/generateOptions.js index e8338bdf57..10494f0643 100644 --- a/packages/plugins/i18n/admin/src/components/CMEditViewInjectedComponents/CMEditViewCopyLocale/utils/generateOptions.js +++ b/packages/plugins/i18n/admin/src/components/CMEditViewInjectedComponents/CMEditViewCopyLocale/utils/generateOptions.js @@ -11,10 +11,10 @@ const generateOptions = (appLocales, currentLocale, localizations, permissions) .filter(({ code }) => { return permissions.some(({ properties }) => get(properties, 'locales', []).includes(code)); }) - .map(locale => { + .map((locale) => { return { label: locale.name, - value: localizations.find(loc => locale.code === loc.locale).id, + value: localizations.find((loc) => locale.code === loc.locale).id, }; }); }; 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 cf43c90b09..3e89f2e41a 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 @@ -10,7 +10,7 @@ const removePasswordAndRelationsFieldFromData = (data, contentTypeSchema, compon const isRepeatable = getOtherInfos(schema, [current, 'repeatable']); if (attrType === 'dynamiczone') { - acc[current] = value.map(componentValue => { + acc[current] = value.map((componentValue) => { const subCleanedData = recursiveCleanData( componentValue, componentSchema[componentValue.__component] @@ -26,7 +26,7 @@ const removePasswordAndRelationsFieldFromData = (data, contentTypeSchema, compon if (isRepeatable) { /* eslint-disable indent */ acc[current] = value - ? value.map(compoData => { + ? value.map((compoData) => { const subCleanedData = recursiveCleanData(compoData, componentSchema[component]); return subCleanedData; 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 989e92d361..b6f7d8af1b 100644 --- a/packages/plugins/i18n/admin/src/components/CMEditViewInjectedComponents/CMEditViewLocalePicker/index.js +++ b/packages/plugins/i18n/admin/src/components/CMEditViewInjectedComponents/CMEditViewLocalePicker/index.js @@ -33,12 +33,12 @@ const CMEditViewLocalePicker = ({ const { push } = useHistory(); - const handleChange = value => { + const handleChange = (value) => { if (value === currentLocale) { return; } - const nextLocale = options.find(option => { + const nextLocale = options.find((option) => { return option.value === value; }); @@ -121,7 +121,7 @@ const CMEditViewLocalePicker = ({ > {value?.label} - {filteredOptions.map(option => { + {filteredOptions.map((option) => { return (