mirror of
https://github.com/strapi/strapi.git
synced 2025-10-01 11:21:01 +00:00
Merge branch 'master' into fix/5038
This commit is contained in:
commit
eb6fc3578d
@ -2,7 +2,9 @@
|
||||
**/build/**
|
||||
**/dist/**
|
||||
testApp/**
|
||||
packages/strapi-plugin-users-permissions/admin/**
|
||||
packages/strapi-plugin-upload/admin/**
|
||||
packages/strapi-generate-plugin/files/admin/src/**
|
||||
packages/strapi-helper-plugin/**
|
||||
packages/strapi-plugin-users-permissions/admin/**
|
||||
.eslintrc.js
|
||||
.eslintrc.front.js
|
||||
.eslintrc.back.js
|
||||
|
22
.eslintrc.back.js
Normal file
22
.eslintrc.back.js
Normal file
@ -0,0 +1,22 @@
|
||||
module.exports = {
|
||||
extends: [
|
||||
'eslint:recommended',
|
||||
'prettier',
|
||||
'plugin:import/errors',
|
||||
'plugin:import/warnings',
|
||||
'plugin:node/recommended',
|
||||
],
|
||||
env: {
|
||||
es6: true,
|
||||
node: true,
|
||||
jest: true,
|
||||
},
|
||||
globals: {
|
||||
strapi: false,
|
||||
},
|
||||
rules: {
|
||||
'node/no-unpublished-require': 0,
|
||||
'require-atomic-updates': 0,
|
||||
'no-process-exit': 0,
|
||||
},
|
||||
};
|
132
.eslintrc.front.js
Normal file
132
.eslintrc.front.js
Normal file
@ -0,0 +1,132 @@
|
||||
module.exports = {
|
||||
parser: 'babel-eslint',
|
||||
extends: [
|
||||
'eslint:recommended',
|
||||
'plugin:react/recommended',
|
||||
'plugin:redux-saga/recommended',
|
||||
'prettier',
|
||||
],
|
||||
plugins: ['react', 'redux-saga', 'react-hooks', 'import', 'jsx-a11y'],
|
||||
env: {
|
||||
browser: true,
|
||||
commonjs: true,
|
||||
es6: true,
|
||||
jest: true,
|
||||
mocha: true,
|
||||
},
|
||||
parserOptions: {
|
||||
ecmaVersion: 2018,
|
||||
ecmaFeatures: {
|
||||
jsx: true,
|
||||
},
|
||||
sourceType: 'module',
|
||||
},
|
||||
globals: {
|
||||
strapi: false,
|
||||
window: false,
|
||||
cy: false,
|
||||
Cypress: false,
|
||||
expect: false,
|
||||
assert: false,
|
||||
chai: false,
|
||||
// TODO: put all this in process.env in webpack to avoid having to set them here
|
||||
REMOTE_URL: true,
|
||||
BACKEND_URL: true,
|
||||
PUBLIC_PATH: true,
|
||||
MODE: true,
|
||||
NODE_ENV: true,
|
||||
},
|
||||
extends: ['airbnb'],
|
||||
settings: {
|
||||
react: {
|
||||
version: '16.5.2',
|
||||
},
|
||||
},
|
||||
rules: {
|
||||
'generator-star-spacing': 0,
|
||||
'no-console': 0,
|
||||
'require-atomic-updates': 0,
|
||||
'react-hooks/rules-of-hooks': 'error',
|
||||
'react-hooks/exhaustive-deps': 'warn',
|
||||
'arrow-body-style': 0,
|
||||
'arrow-parens': 0,
|
||||
camelcase: 0,
|
||||
'comma-dangle': 0,
|
||||
'consistent-return': [
|
||||
2,
|
||||
{
|
||||
treatUndefinedAsUnspecified: true,
|
||||
},
|
||||
],
|
||||
indent: [
|
||||
2,
|
||||
2,
|
||||
{
|
||||
flatTernaryExpressions: false,
|
||||
SwitchCase: 1,
|
||||
ignoredNodes: [
|
||||
'ConditionalExpression',
|
||||
"VariableDeclarator[kind='const']",
|
||||
],
|
||||
},
|
||||
],
|
||||
'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,
|
||||
'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 }],
|
||||
'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/jsx-props-no-spreading': 0,
|
||||
'react/jsx-one-expression-per-line': 0,
|
||||
'react/state-in-constructor': 0,
|
||||
'react/static-property-placement': 0,
|
||||
},
|
||||
};
|
146
.eslintrc.js
146
.eslintrc.js
@ -1,140 +1,24 @@
|
||||
const frontPaths = [
|
||||
'packages/**/admin/src/**/**/*.js',
|
||||
'packages/strapi-helper-plugin/**/*.js',
|
||||
'cypress/**/*.js',
|
||||
'packages/**/test/front/**/*.js',
|
||||
'test/config/front/**/*.js',
|
||||
];
|
||||
|
||||
module.exports = {
|
||||
parser: 'babel-eslint',
|
||||
extends: [
|
||||
'eslint:recommended',
|
||||
'plugin:react/recommended',
|
||||
'plugin:redux-saga/recommended',
|
||||
'prettier',
|
||||
],
|
||||
plugins: ['react', 'redux-saga', 'react-hooks', 'import', 'jsx-a11y'],
|
||||
env: {
|
||||
browser: true,
|
||||
commonjs: true,
|
||||
es6: true,
|
||||
node: true,
|
||||
jest: true,
|
||||
mocha: true,
|
||||
},
|
||||
parserOptions: {
|
||||
ecmaVersion: 2018,
|
||||
ecmaFeatures: {
|
||||
jsx: true,
|
||||
},
|
||||
sourceType: 'module',
|
||||
},
|
||||
// all readonly
|
||||
globals: {
|
||||
strapi: false,
|
||||
window: false,
|
||||
cy: false,
|
||||
Cypress: false,
|
||||
expect: false,
|
||||
assert: false,
|
||||
chai: false,
|
||||
// TODO: put all this in process.env in webpack to avoid having to set them here
|
||||
REMOTE_URL: true,
|
||||
BACKEND_URL: true,
|
||||
PUBLIC_PATH: true,
|
||||
MODE: true,
|
||||
NODE_ENV: true,
|
||||
},
|
||||
rules: {
|
||||
'generator-star-spacing': 0,
|
||||
'no-console': 0,
|
||||
'require-atomic-updates': 0,
|
||||
'react-hooks/rules-of-hooks': 'error',
|
||||
'react-hooks/exhaustive-deps': 'warn',
|
||||
},
|
||||
settings: {
|
||||
react: {
|
||||
version: '16.5.2',
|
||||
},
|
||||
},
|
||||
overrides: [
|
||||
{
|
||||
files: ['packages/**/admin/src/**/**/*.js'],
|
||||
extends: ['airbnb'],
|
||||
rules: {
|
||||
'arrow-body-style': 0,
|
||||
'arrow-parens': 0,
|
||||
camelcase: 0,
|
||||
'comma-dangle': 0,
|
||||
'consistent-return': [
|
||||
2,
|
||||
{
|
||||
treatUndefinedAsUnspecified: true,
|
||||
},
|
||||
],
|
||||
indent: [
|
||||
2,
|
||||
2,
|
||||
{
|
||||
flatTernaryExpressions: false,
|
||||
SwitchCase: 1,
|
||||
ignoredNodes: [
|
||||
'ConditionalExpression',
|
||||
"VariableDeclarator[kind='const']",
|
||||
],
|
||||
},
|
||||
],
|
||||
'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,
|
||||
'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-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 }],
|
||||
'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/jsx-props-no-spreading': 0,
|
||||
'react/jsx-one-expression-per-line': 0,
|
||||
'react/state-in-constructor': 0,
|
||||
'react/static-property-placement': 0,
|
||||
},
|
||||
files: ['packages/**/*.js', 'test/**/*.js', 'scripts/**/*.js'],
|
||||
excludedFiles: frontPaths,
|
||||
...require('./.eslintrc.back.js'),
|
||||
},
|
||||
{
|
||||
files: frontPaths,
|
||||
...require('./.eslintrc.front.js'),
|
||||
},
|
||||
],
|
||||
};
|
||||
|
@ -11,7 +11,7 @@
|
||||
// This function is called when a project is opened or re-opened (e.g. due to
|
||||
// the project's config changing)
|
||||
|
||||
module.exports = (/*on, config*/) => {
|
||||
module.exports = (/* on, config */) => {
|
||||
// `on` is used to hook into various events Cypress emits
|
||||
// `config` is the resolved Cypress config
|
||||
};
|
||||
|
@ -162,6 +162,7 @@ Cypress.Commands.add('deleteApi', (model, jwt) => {
|
||||
|
||||
Cypress.Commands.add('login', () => {
|
||||
cy.createUser();
|
||||
|
||||
return cy
|
||||
.request({
|
||||
url: `${backendUrl}/admin/auth/local`,
|
||||
|
@ -14,7 +14,7 @@
|
||||
// ***********************************************************
|
||||
|
||||
// Import commands.js using ES2015 syntax:
|
||||
import './commands'
|
||||
import './commands';
|
||||
|
||||
// Alternatively you can use CommonJS syntax:
|
||||
// require('./commands')
|
||||
@ -28,6 +28,8 @@ Cypress.on('before:browser:launch', (browser = {}, args) => {
|
||||
if (browser.name === 'chrome') {
|
||||
args.push('--disable-site-isolation-trials');
|
||||
|
||||
return args
|
||||
return args;
|
||||
}
|
||||
})
|
||||
|
||||
return args;
|
||||
});
|
||||
|
@ -245,7 +245,7 @@ You can configure these global headers by updating the file at `./config/environ
|
||||
{
|
||||
"webhooks": {
|
||||
"defaultHeaders": {
|
||||
"Authroization": "Bearer my-very-secured-token"
|
||||
"Authorization": "Bearer my-very-secured-token"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -259,7 +259,7 @@ You can configure these global headers by updating the file at `./config/environ
|
||||
{
|
||||
"webhooks": {
|
||||
"defaultHeaders": {
|
||||
"Authroization": "Bearer ${ process.env.WEBHOOK_TOKEN }"
|
||||
"Authorization": "Bearer ${ process.env.WEBHOOK_TOKEN }"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -213,7 +213,7 @@ And for your files, they have to be prefixed by `files`.
|
||||
Example here with cover attribute `files.cover`.
|
||||
|
||||
::: tip
|
||||
If you want to upload files for a component, you will have to specify the inidex of the item you wan to add the file.
|
||||
If you want to upload files for a component, you will have to specify the index of the item you want to add the file.
|
||||
Example `files.my_component_name[the_index].attribute_name`
|
||||
:::
|
||||
|
||||
|
@ -10,7 +10,7 @@
|
||||
"strapi": "strapi"
|
||||
},
|
||||
"dependencies": {
|
||||
"knex": "^0.16.5",
|
||||
"knex": "^0.20.0",
|
||||
"lodash": "^4.17.5",
|
||||
"mysql": "^2.17.1",
|
||||
"pg": "^7.10.0",
|
||||
|
@ -6,6 +6,7 @@
|
||||
"@testing-library/react": "^9.1.0",
|
||||
"@testing-library/react-hooks": "^2.0.0",
|
||||
"babel-eslint": "^10.0.0",
|
||||
"chokidar": "3.3.1",
|
||||
"cross-env": "^5.2.0",
|
||||
"cypress": "3.1.2",
|
||||
"enzyme": "^3.9.0",
|
||||
@ -16,10 +17,13 @@
|
||||
"eslint-config-prettier": "^6.2.0",
|
||||
"eslint-plugin-import": "^2.19.1",
|
||||
"eslint-plugin-jsx-a11y": "^6.2.3",
|
||||
"eslint-plugin-node": "11.0.0",
|
||||
"eslint-plugin-react": "^7.14.0",
|
||||
"eslint-plugin-react-hooks": "^2.0.0",
|
||||
"eslint-plugin-redux-saga": "^1.1.0",
|
||||
"execa": "^1.0.0",
|
||||
"fs-extra": "8.1.0",
|
||||
"glob": "7.1.6",
|
||||
"husky": "^3.0.0",
|
||||
"istanbul": "~0.4.2",
|
||||
"jest": "^24.5.0",
|
||||
@ -31,9 +35,12 @@
|
||||
"react-test-renderer": "^16.9.0",
|
||||
"request": "^2.87.0",
|
||||
"request-promise-native": "^1.0.7",
|
||||
"rimraf": "3.0.0",
|
||||
"snyk": "^1.99.0",
|
||||
"wait-on": "^3.2.0",
|
||||
"yargs": "^13.2.2"
|
||||
"yargs": "^13.2.2",
|
||||
"strapi": "3.0.0-beta.18.6",
|
||||
"strapi-generate-new": "3.0.0-beta.18.6"
|
||||
},
|
||||
"scripts": {
|
||||
"setup": "yarn && yarn build",
|
||||
|
@ -37,6 +37,8 @@ program
|
||||
|
||||
if (projectName === undefined) {
|
||||
console.error('Please specify the <directory> of your project');
|
||||
|
||||
// eslint-disable-next-line no-process-exit
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
|
@ -213,5 +213,9 @@
|
||||
"Auth.link.forgot-password": "Esqueceu sua senha?",
|
||||
"Auth.link.ready": "Pronto para entrar?",
|
||||
"app.containers.App.notification.error.init": "Ocorreu um erro ao solicitar a API",
|
||||
"components.Input.error.password.noMatch": "As senhas não conferem"
|
||||
"components.Input.error.password.noMatch": "As senhas não conferem",
|
||||
"form.button.done": "Terminar",
|
||||
"form.button.finish": "Finalizar",
|
||||
"notification.form.error.fields": "O formulário contém alguns erros",
|
||||
"global.prompt.unsaved": "Você tem certeza que deseja sair desta página? Todas as suas modificacões serão perdidas"
|
||||
}
|
||||
|
@ -43,6 +43,7 @@
|
||||
"cross-env": "^5.0.5",
|
||||
"css-loader": "^2.1.1",
|
||||
"duplicate-package-checker-webpack-plugin": "^3.0.0",
|
||||
"execa": "^1.0.0",
|
||||
"file-loader": "^3.0.1",
|
||||
"font-awesome": "^4.7.0",
|
||||
"friendly-errors-webpack-plugin": "^1.7.0",
|
||||
@ -55,6 +56,7 @@
|
||||
"intl": "^1.2.5",
|
||||
"invariant": "^2.2.4",
|
||||
"is-wsl": "^2.0.0",
|
||||
"lodash": "^4.17.11",
|
||||
"match-sorter": "^4.0.2",
|
||||
"mini-css-extract-plugin": "^0.6.0",
|
||||
"moment": "^2.24.0",
|
||||
|
@ -24,6 +24,9 @@
|
||||
"rimraf": "^2.6.3",
|
||||
"strapi-utils": "3.0.0-beta.18.6"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"knex": "^0.20.0"
|
||||
},
|
||||
"strapi": {
|
||||
"dependencies": [
|
||||
"knex"
|
||||
|
@ -58,6 +58,7 @@ module.exports = function(strapi) {
|
||||
useUnifiedTopology,
|
||||
} = connection.settings;
|
||||
|
||||
// eslint-disable-next-line node/no-deprecated-api
|
||||
const uriOptions = uri ? url.parse(uri, true).query : {};
|
||||
const { authenticationDatabase, ssl, debug } = _.defaults(
|
||||
connection.options,
|
||||
|
@ -229,7 +229,8 @@ module.exports = ({ models, target, plugin = false }, ctx) => {
|
||||
const refToStrapiRef = obj => {
|
||||
const ref = obj.ref;
|
||||
|
||||
let plainData = typeof ref.toJSON === 'function' ? ref.toJSON() : ref;
|
||||
let plainData =
|
||||
ref && typeof ref.toJSON === 'function' ? ref.toJSON() : ref;
|
||||
|
||||
if (typeof plainData !== 'object') return ref;
|
||||
|
||||
|
@ -28,6 +28,7 @@
|
||||
},
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"lodash": "^4.17.11",
|
||||
"verror": "^1.10.0"
|
||||
}
|
||||
}
|
||||
|
@ -5,7 +5,7 @@
|
||||
* to run scheduled jobs.
|
||||
*
|
||||
* The cron format consists of:
|
||||
* [MINUTE] [HOUR] [DAY OF MONTH] [MONTH OF YEAR] [DAY OF WEEK] [YEAR (optional)]
|
||||
* [SECOND (optional)] [MINUTE] [HOUR] [DAY OF MONTH] [MONTH OF YEAR] [DAY OF WEEK]
|
||||
*
|
||||
* See more details here: https://strapi.io/documentation/3.0.0-beta.x/concepts/configurations.html#cron-tasks
|
||||
*/
|
||||
|
@ -24,6 +24,7 @@ const CircleButton = styled.button`
|
||||
}
|
||||
`;
|
||||
}
|
||||
|
||||
return css`
|
||||
&:after {
|
||||
content: '\f067';
|
||||
|
@ -136,7 +136,7 @@ class GlobalPagination extends React.Component {
|
||||
onClick={this.handlePreviousPageClick}
|
||||
disabled={this.isFirstPage()}
|
||||
>
|
||||
<i className="fa fa-angle-left" aria-hidden="true"></i>
|
||||
<i className="fa fa-angle-left" aria-hidden="true" />
|
||||
</a>
|
||||
<nav className="navWrapper">
|
||||
<ul className="navUl">{this.renderLinks()}</ul>
|
||||
@ -147,7 +147,7 @@ class GlobalPagination extends React.Component {
|
||||
onClick={this.handleNextPageClick}
|
||||
disabled={this.isLastPage()}
|
||||
>
|
||||
<i className="fa fa-angle-right" aria-hidden="true"></i>
|
||||
<i className="fa fa-angle-right" aria-hidden="true" />
|
||||
</a>
|
||||
</div>
|
||||
</Wrapper>
|
||||
|
@ -38,8 +38,6 @@ function HeaderNav({ links, style }) {
|
||||
onClick={e => {
|
||||
if (link.disabled) {
|
||||
e.preventDefault();
|
||||
|
||||
return;
|
||||
}
|
||||
}}
|
||||
>
|
||||
|
@ -180,9 +180,9 @@ class ImgPreview extends React.Component {
|
||||
|
||||
const containerStyle = isEmpty(imgURL)
|
||||
? {
|
||||
display: 'flex',
|
||||
zIndex: 9999,
|
||||
}
|
||||
display: 'flex',
|
||||
zIndex: 9999,
|
||||
}
|
||||
: {};
|
||||
|
||||
return (
|
||||
|
@ -95,6 +95,7 @@ class InputCheckbox extends React.Component {
|
||||
</FormattedMessage>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<Wrapper
|
||||
className={cn('form-check', !isEmpty(className) && className)}
|
||||
|
@ -23,6 +23,7 @@ class InputCheckboxWithErrors extends React.Component {
|
||||
componentDidMount() {
|
||||
// Display input error if it already has some
|
||||
const { errors } = this.props;
|
||||
|
||||
if (!isEmpty(errors)) {
|
||||
this.setState({ errors });
|
||||
}
|
||||
@ -63,7 +64,7 @@ class InputCheckboxWithErrors extends React.Component {
|
||||
value,
|
||||
} = this.props;
|
||||
|
||||
const handleBlur = onBlur ? onBlur : () => {};
|
||||
const handleBlur = onBlur || (() => {});
|
||||
let inputTitle = '';
|
||||
|
||||
let spacer = !isEmpty(inputDescription) ? <InputSpacer /> : <div />;
|
||||
|
@ -51,8 +51,7 @@ function InputDate(props) {
|
||||
name: props.name,
|
||||
value: moment,
|
||||
},
|
||||
})
|
||||
}
|
||||
})}
|
||||
onChange={moment =>
|
||||
props.onChange({
|
||||
target: {
|
||||
@ -60,8 +59,7 @@ function InputDate(props) {
|
||||
value: moment,
|
||||
type: 'date',
|
||||
},
|
||||
})
|
||||
}
|
||||
})}
|
||||
onFocus={props.onFocus}
|
||||
ref={props.inputRef}
|
||||
tabIndex={props.tabIndex}
|
||||
|
@ -25,6 +25,7 @@ function InputDescription(props) {
|
||||
if (isFunction(props.message)) {
|
||||
content = props.message();
|
||||
}
|
||||
|
||||
return (
|
||||
<Div
|
||||
className={cn(!isEmpty(props.className) && props.className)}
|
||||
|
@ -40,7 +40,7 @@ class InputPassword extends React.Component {
|
||||
: { color: '#9EA7B8' };
|
||||
|
||||
return (
|
||||
<Fragment>
|
||||
<>
|
||||
<FormattedMessage
|
||||
id={formattedPlaceholder}
|
||||
defaultMessage={formattedPlaceholder}
|
||||
@ -77,7 +77,7 @@ class InputPassword extends React.Component {
|
||||
<i className="fa fa-eye" />
|
||||
</div>
|
||||
</EyeWrapper>
|
||||
</Fragment>
|
||||
</>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -51,9 +51,9 @@ function InputSelect(props) {
|
||||
{option.label}
|
||||
</option>
|
||||
);
|
||||
} else {
|
||||
return <SelectOption key={key} {...option} />;
|
||||
}
|
||||
|
||||
return <SelectOption key={key} {...option} />;
|
||||
}
|
||||
|
||||
return (
|
||||
|
@ -22,6 +22,7 @@ class InputSelectWithErrors extends React.Component {
|
||||
|
||||
componentDidMount() {
|
||||
const { errors } = this.props;
|
||||
|
||||
// Display input error if it already has some
|
||||
if (!isEmpty(errors)) {
|
||||
this.setState({ errors });
|
||||
|
@ -18,6 +18,7 @@ import Container from './Container';
|
||||
|
||||
class InputToggleWithErrors extends React.Component {
|
||||
state = { errors: [] };
|
||||
|
||||
componentDidMount() {
|
||||
const { errors } = this.props;
|
||||
|
||||
|
@ -63,7 +63,7 @@ function LeftMenuHeader({ count, search, searchable, setSearch, title }) {
|
||||
) : (
|
||||
<div className="search-wrapper">
|
||||
<FontAwesomeIcon icon="search" />
|
||||
<button onClick={toggleSearch}></button>
|
||||
<button onClick={toggleSearch} />
|
||||
<Search
|
||||
ref={ref}
|
||||
onChange={handleChange}
|
||||
|
@ -26,6 +26,7 @@ function LeftMenuList({ customLink, links, title, searchable }) {
|
||||
return acc + current.links.length;
|
||||
}, 0);
|
||||
}
|
||||
|
||||
return links.length;
|
||||
};
|
||||
|
||||
@ -38,6 +39,7 @@ function LeftMenuList({ customLink, links, title, searchable }) {
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
return matchSorter(links, search, { keys: ['title'] });
|
||||
};
|
||||
|
||||
|
@ -49,6 +49,7 @@ const LeftMenuSubList = ({
|
||||
<ul>
|
||||
{links.map(link => {
|
||||
const { name, title } = link;
|
||||
|
||||
return (
|
||||
<li key={name}>
|
||||
<LeftMenuLink {...link}>{title}</LeftMenuLink>
|
||||
|
@ -19,9 +19,7 @@ function ListHeader({
|
||||
return (
|
||||
<Wrapper style={style}>
|
||||
{button && <Button {...button} />}
|
||||
{children ? (
|
||||
children
|
||||
) : (
|
||||
{children || (
|
||||
<FormattedMessage id={title} values={titleValues}>
|
||||
{msg => <Title>{msg}</Title>}
|
||||
</FormattedMessage>
|
||||
|
@ -18,7 +18,7 @@ function PageFooter(props) {
|
||||
<form className="form-inline">
|
||||
<div className="pageFooterSelectWrapper">
|
||||
<select
|
||||
className={`form-control`}
|
||||
className="form-control"
|
||||
id="params._limit"
|
||||
name="params._limit"
|
||||
onChange={e => {
|
||||
|
@ -10,10 +10,8 @@ import { reduce } from 'lodash';
|
||||
|
||||
// Plugin identifier based on the package.json `name` value
|
||||
const pluginPkg = require('../../../../package.json');
|
||||
const pluginId = pluginPkg.name.replace(
|
||||
/^strapi-plugin-/i,
|
||||
''
|
||||
);
|
||||
|
||||
const pluginId = pluginPkg.name.replace(/^strapi-plugin-/i, '');
|
||||
|
||||
/**
|
||||
* Add plugin identifier as translation message prefix,
|
||||
@ -22,11 +20,16 @@ const pluginId = pluginPkg.name.replace(
|
||||
*
|
||||
* @param messages
|
||||
*/
|
||||
const formatMessages = messages => reduce(messages, (result, value, key) => {
|
||||
result[`${pluginId}.${key}`] = value;
|
||||
const formatMessages = messages =>
|
||||
reduce(
|
||||
messages,
|
||||
(result, value, key) => {
|
||||
result[`${pluginId}.${key}`] = value;
|
||||
|
||||
return result;
|
||||
}, {});
|
||||
return result;
|
||||
},
|
||||
{}
|
||||
);
|
||||
|
||||
/**
|
||||
* Try to require translation file.
|
||||
@ -37,8 +40,9 @@ const requireTranslations = language => {
|
||||
try {
|
||||
return require(`translations/${language}.json`); // eslint-disable-line global-require
|
||||
} catch (error) {
|
||||
console.error(`Unable to load "${language}" translation for the plugin ${pluginId}. Please make sure "${language}.json" file exists in "pluginPath/admin/src/translations" folder.`);
|
||||
return;
|
||||
console.error(
|
||||
`Unable to load "${language}" translation for the plugin ${pluginId}. Please make sure "${language}.json" file exists in "pluginPath/admin/src/translations" folder.`
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
@ -46,10 +50,14 @@ const requireTranslations = language => {
|
||||
* Dynamically generate `translationsMessages object`.
|
||||
*/
|
||||
|
||||
const translationMessages = reduce(strapi.languages, (result, language) => {
|
||||
result[language] = formatMessages(requireTranslations(language));
|
||||
const translationMessages = reduce(
|
||||
strapi.languages,
|
||||
(result, language) => {
|
||||
result[language] = formatMessages(requireTranslations(language));
|
||||
|
||||
return result;
|
||||
}, {});
|
||||
return result;
|
||||
},
|
||||
{}
|
||||
);
|
||||
|
||||
export { translationMessages };
|
||||
|
@ -5,7 +5,7 @@ const Close = props => (
|
||||
<path
|
||||
d="M10.0719417,0.127226812 C10.1612888,0.127226812 10.2403266,0.161591074 10.3090551,0.230319596 L10.3090551,0.230319596 L10.8245191,0.745783513 C10.8932476,0.814512036 10.9276118,0.893549837 10.9276118,0.982896916 C10.9276118,1.07224399 10.8932476,1.1512818 10.8245191,1.22001032 L10.8245191,1.22001032 L6.77297267,5.27155671 L10.8245191,9.3231031 C10.8932476,9.39183162 10.9276118,9.47086942 10.9276118,9.5602165 C10.9276118,9.64956358 10.8932476,9.72860138 10.8245191,9.79732991 L10.8245191,9.79732991 L10.3090551,10.3127938 C10.2403266,10.3815223 10.1612888,10.4158866 10.0719417,10.4158866 C9.98259466,10.4158866 9.90355686,10.3815223 9.83482834,10.3127938 L9.83482834,10.3127938 L5.92809485,6.40509433 C4.98802554,7.34516364 3.68545904,8.64773014 2.02039535,10.3127938 C1.95166683,10.3815223 1.87262903,10.4158866 1.78328195,10.4158866 C1.69393487,10.4158866 1.61489707,10.3815223 1.54616855,10.3127938 L1.03070463,9.79732991 C0.961976106,9.72860138 0.927611845,9.64956358 0.927611845,9.5602165 C0.927611845,9.47086942 0.961976106,9.39183162 1.03070463,9.3231031 L5.08225102,5.27155671 L1.03070463,1.22001032 C0.961976106,1.1512818 0.927611845,1.07224399 0.927611845,0.982896916 C0.927611845,0.893549837 0.961976106,0.814512036 1.03070463,0.745783513 L1.54616855,0.230319596 C1.61489707,0.161591074 1.69393487,0.127226812 1.78328195,0.127226812 C1.87262903,0.127226812 1.95166683,0.161591074 2.02039535,0.230319596 L5.92761184,4.13822681 L9.83482834,0.230319596 C9.88637473,0.178773204 9.94372009,0.146556709 10.0068644,0.133670111 Z"
|
||||
fillRule="nonzero"
|
||||
></path>
|
||||
/>
|
||||
</svg>
|
||||
);
|
||||
|
||||
|
@ -23,7 +23,7 @@ const auth = {
|
||||
if (localStorage) {
|
||||
const videos = auth.get('videos');
|
||||
const onboarding = auth.get('onboarding');
|
||||
|
||||
|
||||
localStorage.clear();
|
||||
localStorage.setItem('videos', JSON.stringify(videos));
|
||||
localStorage.setItem('onboarding', onboarding);
|
||||
|
@ -2,12 +2,18 @@ import { isArray, isObject } from 'lodash';
|
||||
|
||||
const cleanData = (value, key, secondKey) => {
|
||||
if (isArray(value)) {
|
||||
return value.map(obj => obj[key] ? obj[key] : obj);
|
||||
} else if (isObject(value)) {
|
||||
return value[key] || value[`_${key}`] || value[secondKey] || value[`_${secondKey}`];
|
||||
} else {
|
||||
return value;
|
||||
return value.map(obj => (obj[key] ? obj[key] : obj));
|
||||
}
|
||||
if (isObject(value)) {
|
||||
return (
|
||||
value[key] ||
|
||||
value[`_${key}`] ||
|
||||
value[secondKey] ||
|
||||
value[`_${secondKey}`]
|
||||
);
|
||||
}
|
||||
|
||||
return value;
|
||||
};
|
||||
|
||||
export default cleanData;
|
||||
|
@ -1,13 +1,19 @@
|
||||
const subtractLight = (color, amount) => {
|
||||
const cc = parseInt(color,16) - amount;
|
||||
let c = (cc < 0) ? 0 : (cc);
|
||||
c = (c.toString(16).length > 1 ) ? c.toString(16) : `0${c.toString(16)}`;
|
||||
const cc = parseInt(color, 16) - amount;
|
||||
let c = cc < 0 ? 0 : cc;
|
||||
c = c.toString(16).length > 1 ? c.toString(16) : `0${c.toString(16)}`;
|
||||
|
||||
return c;
|
||||
};
|
||||
|
||||
export const darken = (colour, amount) => {
|
||||
let color = (colour.indexOf("#")>=0) ? colour.substring(1,colour.length) : colour;
|
||||
const percentage = parseInt((255*amount)/100, 10);
|
||||
color = `#${subtractLight(color.substring(0,2), percentage)}${subtractLight(color.substring(2,4), percentage)}${subtractLight(color.substring(4,6), percentage)}`;
|
||||
let color =
|
||||
colour.indexOf('#') >= 0 ? colour.substring(1, colour.length) : colour;
|
||||
const percentage = parseInt((255 * amount) / 100, 10);
|
||||
color = `#${subtractLight(color.substring(0, 2), percentage)}${subtractLight(
|
||||
color.substring(2, 4),
|
||||
percentage
|
||||
)}${subtractLight(color.substring(4, 6), percentage)}`;
|
||||
|
||||
return color;
|
||||
};
|
||||
|
@ -1,6 +1,6 @@
|
||||
import 'whatwg-fetch';
|
||||
import auth from './auth';
|
||||
import _ from 'lodash';
|
||||
import auth from './auth';
|
||||
|
||||
/**
|
||||
* Parses the JSON returned by a network request
|
||||
@ -170,6 +170,7 @@ export default function request(...args) {
|
||||
if (shouldWatchServerRestart) {
|
||||
// Display the global OverlayBlocker
|
||||
strapi.lockApp(shouldWatchServerRestart);
|
||||
|
||||
return serverRestartWatcher(response);
|
||||
}
|
||||
|
||||
|
@ -22,4 +22,4 @@ const storeData = {
|
||||
},
|
||||
};
|
||||
|
||||
export default storeData;
|
||||
export default storeData;
|
||||
|
@ -1,10 +1,10 @@
|
||||
import { isPlainObject, isString, isArray } from 'lodash';
|
||||
|
||||
const templateObject = function (obj, variables) {
|
||||
const templateObject = function(obj, variables) {
|
||||
// Allow values which looks like such as
|
||||
// an ES6 literal string without parenthesis inside (aka function call).
|
||||
const regex = /\$\{[\S]*\}/g;
|
||||
const replacer = (match) => {
|
||||
const replacer = match => {
|
||||
const key = match.substring(0, match.length - 1).replace('${', '');
|
||||
|
||||
return variables[key];
|
||||
|
@ -78,7 +78,6 @@ module.exports = function(strapi) {
|
||||
redis.on('error', err => {
|
||||
strapi.log.error(err);
|
||||
process.exit(0);
|
||||
return;
|
||||
});
|
||||
|
||||
// Utils function.
|
||||
|
@ -30,7 +30,9 @@ function createDefaultMainField(schema) {
|
||||
if (!schema) return 'id';
|
||||
|
||||
const mainField = Object.keys(schema.attributes).find(
|
||||
key => schema.attributes[key].type === 'string' && key !== schema.primaryKey
|
||||
key =>
|
||||
schema.attributes[key].type === 'string' &&
|
||||
!['id', schema.primaryKey].includes(key)
|
||||
);
|
||||
|
||||
return mainField || 'id';
|
||||
|
@ -15,6 +15,7 @@ describe('Testing build and schema core_store', () => {
|
||||
cy.login()
|
||||
.then(data => {
|
||||
jwt = data.jwt;
|
||||
|
||||
return cy.createCTMApis(data.jwt);
|
||||
})
|
||||
.wait(1000);
|
||||
|
@ -36,7 +36,7 @@ describe('Testing Content Manager ListPages', function() {
|
||||
|
||||
it('Should have the Id default sort', () => {
|
||||
cy.get(
|
||||
`a[href="/admin/plugins/content-manager/product?source=content-manager"]`
|
||||
'a[href="/admin/plugins/content-manager/product?source=content-manager"]'
|
||||
)
|
||||
.click()
|
||||
.wait(frontLoadingDelay);
|
||||
@ -160,7 +160,7 @@ describe('Testing Content Manager ListPages', function() {
|
||||
|
||||
it('Should apply filters for product data', () => {
|
||||
cy.get(
|
||||
`a[href="/admin/plugins/content-manager/product?source=content-manager"]`
|
||||
'a[href="/admin/plugins/content-manager/product?source=content-manager"]'
|
||||
)
|
||||
.click()
|
||||
.wait(frontLoadingDelay);
|
||||
|
@ -29,6 +29,7 @@
|
||||
"strapi-generate": "3.0.0-beta.18.6",
|
||||
"strapi-generate-api": "3.0.0-beta.18.6",
|
||||
"strapi-helper-plugin": "3.0.0-beta.18.6",
|
||||
"strapi-utils": "3.0.0-beta.18.6",
|
||||
"yup": "^0.27.0"
|
||||
},
|
||||
"author": {
|
||||
|
@ -16,7 +16,9 @@ describe('Test CTB', () => {
|
||||
context('Check create and update API', () => {
|
||||
beforeEach(() => {
|
||||
cy.server();
|
||||
cy.route(`${backendUrl}/content-type-builder/autoReload`).as('initContentTypeBuilder');
|
||||
cy.route(`${backendUrl}/content-type-builder/autoReload`).as(
|
||||
'initContentTypeBuilder'
|
||||
);
|
||||
cy.login().then(data => {
|
||||
jwt = data.jwt;
|
||||
userId = data.user._id || data.user.id;
|
||||
@ -58,8 +60,12 @@ describe('Test CTB', () => {
|
||||
it('Should create a TAG API', function() {
|
||||
cy.server();
|
||||
cy.route('GET', `${backendUrl}/content-type-builder/models`).as('models');
|
||||
cy.route('POST', `${backendUrl}/content-type-builder/models`).as('createModel');
|
||||
cy.route('DELETE', `${backendUrl}/content-type-builder/models/tag`).as('deleteTag');
|
||||
cy.route('POST', `${backendUrl}/content-type-builder/models`).as(
|
||||
'createModel'
|
||||
);
|
||||
cy.route('DELETE', `${backendUrl}/content-type-builder/models/tag`).as(
|
||||
'deleteTag'
|
||||
);
|
||||
|
||||
cy.get('a[href="/admin/plugins/content-type-builder"')
|
||||
.click()
|
||||
@ -75,7 +81,7 @@ describe('Test CTB', () => {
|
||||
cy.get('.modal').invoke('show');
|
||||
|
||||
// Fill the form
|
||||
Object.keys(TAG_API).map(key => {
|
||||
Object.keys(TAG_API).forEach(key => {
|
||||
cy.log(key);
|
||||
cy.get(`#${key}`).type(TAG_API[key]);
|
||||
});
|
||||
@ -133,8 +139,12 @@ describe('Test CTB', () => {
|
||||
it('Should update PRODUCT API field and visit the create product page', () => {
|
||||
cy.server();
|
||||
cy.createProductAndTagApis(jwt);
|
||||
cy.route(`${backendUrl}/content-type-builder/models/product?`).as('getProductModel');
|
||||
cy.route('PUT', `${backendUrl}/content-type-builder/models/product`).as('updateProductModel');
|
||||
cy.route(`${backendUrl}/content-type-builder/models/product?`).as(
|
||||
'getProductModel'
|
||||
);
|
||||
cy.route('PUT', `${backendUrl}/content-type-builder/models/product`).as(
|
||||
'updateProductModel'
|
||||
);
|
||||
|
||||
cy.visit(
|
||||
'/admin/plugins/content-type-builder/models/product#editproduct::attributestring::baseSettings::0'
|
||||
@ -161,7 +171,9 @@ describe('Test CTB', () => {
|
||||
.wait(frontLoadingDelay);
|
||||
|
||||
// Check that we can still go to the create page
|
||||
cy.get('a[href="/admin/plugins/content-manager/product?source=content-manager"')
|
||||
cy.get(
|
||||
'a[href="/admin/plugins/content-manager/product?source=content-manager"'
|
||||
)
|
||||
.click()
|
||||
.get('button[label="content-manager.containers.List.addAnEntry"')
|
||||
.click();
|
||||
@ -198,8 +210,12 @@ describe('Test CTB', () => {
|
||||
it('Should update PRODUCT API name and visit the create product page', () => {
|
||||
cy.server();
|
||||
// cy.createProductAndTagApis(jwt);
|
||||
cy.route(`${backendUrl}/content-type-builder/models/product?`).as('getProductModel');
|
||||
cy.route('PUT', `${backendUrl}/content-type-builder/models/product`).as('updateProductModel');
|
||||
cy.route(`${backendUrl}/content-type-builder/models/product?`).as(
|
||||
'getProductModel'
|
||||
);
|
||||
cy.route('PUT', `${backendUrl}/content-type-builder/models/product`).as(
|
||||
'updateProductModel'
|
||||
);
|
||||
|
||||
cy.visit(
|
||||
'/admin/plugins/content-type-builder/models/product#editproduct::contentType::baseSettings'
|
||||
@ -218,7 +234,9 @@ describe('Test CTB', () => {
|
||||
.wait(frontLoadingDelay);
|
||||
|
||||
// Check that we can still go to the create page
|
||||
cy.get('a[href="/admin/plugins/content-manager/produit?source=content-manager"')
|
||||
cy.get(
|
||||
'a[href="/admin/plugins/content-manager/produit?source=content-manager"'
|
||||
)
|
||||
.click()
|
||||
.wait(frontLoadingDelay)
|
||||
.get('button[label="content-manager.containers.List.addAnEntry"')
|
||||
|
@ -12,6 +12,7 @@
|
||||
"test": "echo \"no tests yet\""
|
||||
},
|
||||
"dependencies": {
|
||||
"lodash": "^4.17.11",
|
||||
"strapi-provider-email-sendmail": "3.0.0-beta.18.6",
|
||||
"strapi-utils": "3.0.0-beta.18.6"
|
||||
},
|
||||
|
@ -1,3 +1,4 @@
|
||||
// eslint-disable-next-line node/no-extraneous-require
|
||||
const loadUtils = require('strapi/lib/load');
|
||||
const _ = require('lodash');
|
||||
|
||||
|
@ -22,6 +22,7 @@
|
||||
"graphql-type-json": "0.3.1",
|
||||
"graphql-type-long": "^0.1.1",
|
||||
"koa-compose": "^4.1.0",
|
||||
"lodash": "^4.17.11",
|
||||
"pluralize": "^7.0.0",
|
||||
"strapi-utils": "3.0.0-beta.18.6"
|
||||
},
|
||||
|
@ -185,6 +185,7 @@ module.exports = {
|
||||
request: Object.assign(_.clone(context.request), {
|
||||
graphql: null,
|
||||
}),
|
||||
response: _.clone(context.response),
|
||||
});
|
||||
|
||||
// Execute policies stack.
|
||||
|
@ -246,6 +246,7 @@ module.exports = {
|
||||
request: Object.assign(_.clone(context.request), {
|
||||
graphql: null,
|
||||
}),
|
||||
response: _.clone(context.response),
|
||||
});
|
||||
|
||||
// Note: we've to used the Object.defineProperties to reset the prototype. It seems that the cloning the context
|
||||
|
@ -30,6 +30,7 @@ class EditForm extends React.Component {
|
||||
value: get(this.props.settings, ['providers', current, 'provider']),
|
||||
};
|
||||
acc.push(option);
|
||||
|
||||
return acc;
|
||||
},
|
||||
[]
|
||||
|
@ -51,6 +51,8 @@ const StyledLi = styled.li`
|
||||
}
|
||||
`;
|
||||
}
|
||||
|
||||
return '';
|
||||
}}
|
||||
`;
|
||||
|
||||
|
@ -16,6 +16,8 @@ import FileIcon from '../FileIcon';
|
||||
import { StyledLi, Truncate, Wrapper, Checked } from './components';
|
||||
|
||||
/* eslint-disable react/no-string-refs */
|
||||
/* eslint-disable react/sort-comp */
|
||||
/* eslint-disable react/no-array-index-key */
|
||||
class Li extends React.Component {
|
||||
static contextType = HomePageContext;
|
||||
|
||||
|
@ -10,6 +10,9 @@ import PropTypes from 'prop-types';
|
||||
|
||||
import StyledLi from './StyledLi';
|
||||
|
||||
/* eslint-disable jsx-a11y/no-static-element-interactions */
|
||||
/* eslint-disable react/no-array-index-key */
|
||||
|
||||
function ListHeader({ changeSort, sort }) {
|
||||
const titles = [
|
||||
'hash',
|
||||
|
@ -46,6 +46,8 @@ const Label = styled.label`
|
||||
border: 2px dashed rgba(28, 93, 231, 0.1) !important;
|
||||
`;
|
||||
}
|
||||
|
||||
return '';
|
||||
}}
|
||||
|
||||
${({ showLoader }) => {
|
||||
@ -55,6 +57,8 @@ const Label = styled.label`
|
||||
linear infinite;
|
||||
`;
|
||||
}
|
||||
|
||||
return '';
|
||||
}}
|
||||
`;
|
||||
|
||||
|
@ -20,6 +20,8 @@ import reducer from './reducer';
|
||||
import saga from './saga';
|
||||
import selectConfigPage from './selectors';
|
||||
|
||||
/* eslint-disable */
|
||||
|
||||
class ConfigPage extends React.Component {
|
||||
static contextType = GlobalContext;
|
||||
|
||||
|
@ -64,6 +64,7 @@ export function getDataSuccess(data, entriesNumber) {
|
||||
export function onDrop({ dataTransfer: { files } }) {
|
||||
const formData = Object.keys(files).reduce((acc, current) => {
|
||||
acc.append('files', files[current]);
|
||||
|
||||
return acc;
|
||||
}, new FormData());
|
||||
|
||||
|
@ -28,6 +28,8 @@ import List from '../../components/List';
|
||||
import PluginInputFile from '../../components/PluginInputFile';
|
||||
import { EntriesWrapper, Wrapper } from './components';
|
||||
|
||||
/* eslint-disable */
|
||||
|
||||
import {
|
||||
changeParams,
|
||||
deleteData,
|
||||
|
@ -2,9 +2,10 @@ import { Map } from 'immutable';
|
||||
import { isEmpty, get, isObject } from 'lodash';
|
||||
import { all, call, fork, put, select, takeLatest } from 'redux-saga/effects';
|
||||
import { request } from 'strapi-helper-plugin';
|
||||
|
||||
import pluginId from '../../pluginId';
|
||||
|
||||
/* eslint-disable */
|
||||
|
||||
import {
|
||||
deleteSuccess,
|
||||
dropSuccess,
|
||||
|
@ -1,42 +0,0 @@
|
||||
const frontLoadingDelay = Cypress.config('frontLoadingDelay');
|
||||
const userData = {
|
||||
identifier: 'admin',
|
||||
password: 'pcw123',
|
||||
};
|
||||
|
||||
describe('Test login', () => {
|
||||
let userId;
|
||||
let jwt;
|
||||
|
||||
// Create a user if there's none
|
||||
before(() => {
|
||||
cy.createUser();
|
||||
});
|
||||
|
||||
// Delete the user to test other features
|
||||
after(() => {
|
||||
if (userId) {
|
||||
cy.deleteUser(userId, jwt);
|
||||
}
|
||||
});
|
||||
|
||||
it('Should login the user', () => {
|
||||
cy.visit('/admin/users-permissions/auth/login').wait(frontLoadingDelay);
|
||||
|
||||
Object.keys(userData).map(key => {
|
||||
return cy.get(`#${key}`).type(userData[key]);
|
||||
});
|
||||
|
||||
cy.submitForm()
|
||||
.window()
|
||||
.should(win => {
|
||||
const userInfo = JSON.parse(win.localStorage.getItem('userInfo'));
|
||||
|
||||
jwt = JSON.parse(win.localStorage.getItem('jwtToken'));
|
||||
userId = userInfo._id || userInfo.id;
|
||||
expect(win.localStorage.getItem('jwtToken')).to.be.ok;
|
||||
});
|
||||
|
||||
cy.url().should('equal', `${Cypress.config('baseUrl')}/admin/`);
|
||||
});
|
||||
});
|
@ -1,49 +0,0 @@
|
||||
const frontLoadingDelay = Cypress.config('frontLoadingDelay');
|
||||
const registerData = {
|
||||
username: 'admin',
|
||||
email: 'admin@strapi.io',
|
||||
password: 'pcw123',
|
||||
confirmPassword: 'pcw123',
|
||||
};
|
||||
let jwt;
|
||||
let userId;
|
||||
const frontEndUrl = Cypress.config('baseUrl');
|
||||
|
||||
describe('Test register page', () => {
|
||||
after(() => {
|
||||
if (userId) {
|
||||
cy.deleteUser(userId, jwt);
|
||||
}
|
||||
});
|
||||
|
||||
it('Visits /admin and should be redirected to register page', () => {
|
||||
cy.visit('/admin').wait(frontLoadingDelay);
|
||||
|
||||
// Check if the user is being redirected to /register
|
||||
cy.url().should('include', '/users-permissions/auth/register');
|
||||
});
|
||||
|
||||
it('Should redirect to /register when trying to hit /login', () => {
|
||||
cy.visit('/admin/plugins/users-permissions/auth/login').wait(frontLoadingDelay);
|
||||
|
||||
cy.url().should('include', '/users-permissions/auth/register');
|
||||
});
|
||||
|
||||
it('Should register the admin user', () => {
|
||||
Object.keys(registerData).map(key => {
|
||||
return cy.get(`#${key}`).type(registerData[key]);
|
||||
});
|
||||
|
||||
// Submit form
|
||||
cy.submitForm()
|
||||
.window()
|
||||
.should(win => {
|
||||
const userInfo = JSON.parse(win.sessionStorage.getItem('userInfo'));
|
||||
|
||||
jwt = JSON.parse(win.sessionStorage.getItem('jwtToken'));
|
||||
userId = userInfo._id || userInfo.id;
|
||||
expect(win.sessionStorage.getItem('jwtToken')).to.be.ok;
|
||||
});
|
||||
cy.url().should('equal', `${frontEndUrl}/admin/`);
|
||||
});
|
||||
});
|
@ -76,7 +76,7 @@ module.exports = {
|
||||
S3.upload(
|
||||
{
|
||||
Key: `${path}${file.hash}${file.ext}`,
|
||||
Body: new Buffer(file.buffer, 'binary'),
|
||||
Body: Buffer.from(file.buffer, 'binary'),
|
||||
ACL: 'public-read',
|
||||
ContentType: file.mime,
|
||||
},
|
||||
|
@ -4,7 +4,6 @@
|
||||
"description": "Shared utilities for the Strapi packages",
|
||||
"homepage": "http://strapi.io",
|
||||
"keywords": [
|
||||
"knex",
|
||||
"strapi",
|
||||
"utilities",
|
||||
"utils",
|
||||
@ -16,7 +15,6 @@
|
||||
"main": "./lib",
|
||||
"dependencies": {
|
||||
"date-fns": "^2.8.1",
|
||||
"knex": "^0.16.5",
|
||||
"lodash": "^4.17.11",
|
||||
"pino": "^4.7.1",
|
||||
"pluralize": "^7.0.0",
|
||||
|
@ -4,6 +4,7 @@ const path = require('path');
|
||||
const fs = require('fs-extra');
|
||||
const _ = require('lodash');
|
||||
const { green, yellow } = require('chalk');
|
||||
// eslint-disable-next-line node/no-extraneous-require
|
||||
const strapiAdmin = require('strapi-admin');
|
||||
const loadConfigFile = require('../load/load-config-files');
|
||||
const addSlash = require('../utils/addSlash');
|
||||
|
@ -69,7 +69,6 @@ module.exports = async function({ build, watchAdmin }) {
|
||||
case 'stop':
|
||||
worker.kill();
|
||||
process.exit(1);
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
@ -1,5 +1,3 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
|
@ -1,5 +1,3 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
|
@ -1,5 +1,3 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
@ -26,55 +24,113 @@ const logger = require('strapi-utils').logger;
|
||||
|
||||
/* eslint-disable prefer-template */
|
||||
/* eslint-disable no-console */
|
||||
module.exports = function () {
|
||||
const HOME = process.env[process.platform === 'win32' ? 'USERPROFILE' : 'HOME'];
|
||||
module.exports = function() {
|
||||
const HOME =
|
||||
process.env[process.platform === 'win32' ? 'USERPROFILE' : 'HOME'];
|
||||
|
||||
fs.access(path.resolve(HOME, '.strapirc'), fs.F_OK | fs.R_OK | fs.W_OK, err => {
|
||||
if (err) {
|
||||
if (err.code === 'ENOENT') {
|
||||
logger.error('No `.strapirc` file detected at `' + HOME + '`.');
|
||||
logger.error('Execute `$ strapi config` to create one.');
|
||||
} else if (err.code === 'EACCES') {
|
||||
logger.error('Impossible to access the `.strapirc` file at `' + HOME + '`.');
|
||||
logger.error('Please check read/write permissions before execute `$ strapi update`.');
|
||||
}
|
||||
process.exit(1);
|
||||
} else {
|
||||
const config = JSON.parse(fs.readFileSync(path.resolve(HOME, '.strapirc')));
|
||||
_.forEach(config.generators, (info, name) => {
|
||||
try {
|
||||
process.chdir(path.resolve(__dirname, '..', 'node_modules', 'strapi-generate-' + name));
|
||||
logger.debug('Pulling the latest updates of `strapi-generate-' + name + '`.');
|
||||
shell.exec(`git pull ${info.remote} ${info.branch}`, (code) => {
|
||||
if (code) {
|
||||
logger.error('Impossible to update `strapi-generate-' + name + '`.');
|
||||
} else {
|
||||
logger.info('Successfully updated `strapi-generate-' + name + '`.');
|
||||
}
|
||||
});
|
||||
} catch (err) {
|
||||
process.chdir(path.resolve(__dirname, '..', 'node_modules'));
|
||||
logger.debug('Cloning the `strapi-generate-' + name + '` repository for the first time...');
|
||||
shell.exec(`git clone ${info.repository} strapi-generate-${name}`, (code, stdout, stderr) => {
|
||||
if (code) {
|
||||
logger.error('Impossible to clone the `strapi-generate-' + name + '` repository.');
|
||||
console.log(stderr);
|
||||
} else {
|
||||
logger.info('Successfully cloned the `strapi-generate-' + name + '` repository.');
|
||||
process.chdir(path.resolve(__dirname, '..', 'node_modules', 'strapi-generate-' + name));
|
||||
logger.debug('Installing dependencies for `strapi-generate-' + name + '`...');
|
||||
shell.exec('npm install', (code, stdout, stderr) => {
|
||||
fs.access(
|
||||
path.resolve(HOME, '.strapirc'),
|
||||
fs.F_OK | fs.R_OK | fs.W_OK,
|
||||
err => {
|
||||
if (err) {
|
||||
if (err.code === 'ENOENT') {
|
||||
logger.error('No `.strapirc` file detected at `' + HOME + '`.');
|
||||
logger.error('Execute `$ strapi config` to create one.');
|
||||
} else if (err.code === 'EACCES') {
|
||||
logger.error(
|
||||
'Impossible to access the `.strapirc` file at `' + HOME + '`.'
|
||||
);
|
||||
logger.error(
|
||||
'Please check read/write permissions before execute `$ strapi update`.'
|
||||
);
|
||||
}
|
||||
process.exit(1);
|
||||
} else {
|
||||
const config = JSON.parse(
|
||||
fs.readFileSync(path.resolve(HOME, '.strapirc'))
|
||||
);
|
||||
_.forEach(config.generators, (info, name) => {
|
||||
try {
|
||||
process.chdir(
|
||||
path.resolve(
|
||||
__dirname,
|
||||
'..',
|
||||
'node_modules',
|
||||
'strapi-generate-' + name
|
||||
)
|
||||
);
|
||||
logger.debug(
|
||||
'Pulling the latest updates of `strapi-generate-' + name + '`.'
|
||||
);
|
||||
shell.exec(`git pull ${info.remote} ${info.branch}`, code => {
|
||||
if (code) {
|
||||
logger.error(
|
||||
'Impossible to update `strapi-generate-' + name + '`.'
|
||||
);
|
||||
} else {
|
||||
logger.info(
|
||||
'Successfully updated `strapi-generate-' + name + '`.'
|
||||
);
|
||||
}
|
||||
});
|
||||
} catch (err) {
|
||||
process.chdir(path.resolve(__dirname, '..', 'node_modules'));
|
||||
logger.debug(
|
||||
'Cloning the `strapi-generate-' +
|
||||
name +
|
||||
'` repository for the first time...'
|
||||
);
|
||||
shell.exec(
|
||||
`git clone ${info.repository} strapi-generate-${name}`,
|
||||
(code, stdout, stderr) => {
|
||||
if (code) {
|
||||
logger.error('Impossible to install dependencies for `strapi-generate-' + name + '`.');
|
||||
logger.error(
|
||||
'Impossible to clone the `strapi-generate-' +
|
||||
name +
|
||||
'` repository.'
|
||||
);
|
||||
console.log(stderr);
|
||||
} else {
|
||||
logger.info('Successfully installed dependencies for `strapi-generate-' + name + '`.');
|
||||
logger.info(
|
||||
'Successfully cloned the `strapi-generate-' +
|
||||
name +
|
||||
'` repository.'
|
||||
);
|
||||
process.chdir(
|
||||
path.resolve(
|
||||
__dirname,
|
||||
'..',
|
||||
'node_modules',
|
||||
'strapi-generate-' + name
|
||||
)
|
||||
);
|
||||
logger.debug(
|
||||
'Installing dependencies for `strapi-generate-' +
|
||||
name +
|
||||
'`...'
|
||||
);
|
||||
shell.exec('npm install', (code, stdout, stderr) => {
|
||||
if (code) {
|
||||
logger.error(
|
||||
'Impossible to install dependencies for `strapi-generate-' +
|
||||
name +
|
||||
'`.'
|
||||
);
|
||||
console.log(stderr);
|
||||
} else {
|
||||
logger.info(
|
||||
'Successfully installed dependencies for `strapi-generate-' +
|
||||
name +
|
||||
'`.'
|
||||
);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
);
|
||||
};
|
||||
|
@ -1,5 +1,6 @@
|
||||
/* eslint-disable no-useless-escape */
|
||||
const path = require('path');
|
||||
// eslint-disable-next-line node/no-extraneous-require
|
||||
const strapiAdmin = require('strapi-admin');
|
||||
const _ = require('lodash');
|
||||
|
||||
|
@ -1,4 +1,3 @@
|
||||
#!/usr/bin/env node
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
@ -10,18 +9,23 @@ const { machineIdSync } = require('node-machine-id');
|
||||
|
||||
/*
|
||||
* No need to worry about this file, we only retrieve anonymous data here.
|
||||
* It allows us to know on how many times the package has been installed globally.
|
||||
* It allows us to know on how many times the package has been installed globally.
|
||||
*/
|
||||
|
||||
try {
|
||||
if (process.env.npm_config_global === 'true' || JSON.parse(process.env.npm_config_argv).original.includes('global')) {
|
||||
if (
|
||||
process.env.npm_config_global === 'true' ||
|
||||
JSON.parse(process.env.npm_config_argv).original.includes('global')
|
||||
) {
|
||||
fetch('https://analytics.strapi.io/track', {
|
||||
method: 'POST',
|
||||
body: JSON.stringify({ event: 'didInstallStrapi', deviceId: machineIdSync() }),
|
||||
headers: { 'Content-Type': 'application/json' }
|
||||
})
|
||||
.catch(() => {});
|
||||
body: JSON.stringify({
|
||||
event: 'didInstallStrapi',
|
||||
deviceId: machineIdSync(),
|
||||
}),
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
}).catch(() => {});
|
||||
}
|
||||
} catch (e) {
|
||||
//...
|
||||
}
|
||||
} catch (e) {
|
||||
//...
|
||||
}
|
||||
|
213
yarn.lock
213
yarn.lock
@ -2464,11 +2464,6 @@
|
||||
resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.18.tgz#6a60435d4663e290f3709898a4f75014f279c4d6"
|
||||
integrity sha512-OTPWHmsyW18BhrnG5x8F7PzeZ2nFxmHGb42bZn79P9hl+GI5cMzyPgQTwNjbem0lJhoru/8vtjAFCUOu3+gE2w==
|
||||
|
||||
"@types/bluebird@^3.5.26":
|
||||
version "3.5.27"
|
||||
resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.27.tgz#61eb4d75dc6bfbce51cf49ee9bbebe941b2cb5d0"
|
||||
integrity sha512-6BmYWSBea18+tSjjSC3QIyV93ZKAeNWGM7R6aYt1ryTZXrlHF+QLV0G2yV0viEGVyRkyQsWfMoJ0k/YghBX5sQ==
|
||||
|
||||
"@types/body-parser@*":
|
||||
version "1.17.1"
|
||||
resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.17.1.tgz#18fcf61768fb5c30ccc508c21d6fd2e8b3bf7897"
|
||||
@ -4028,11 +4023,16 @@ bluebird@3.5.1:
|
||||
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9"
|
||||
integrity sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==
|
||||
|
||||
bluebird@^3.1.1, bluebird@^3.5.0, bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.4, bluebird@^3.5.5:
|
||||
bluebird@^3.1.1, bluebird@^3.5.0, bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5:
|
||||
version "3.7.0"
|
||||
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.0.tgz#56a6a886e03f6ae577cffedeb524f8f2450293cf"
|
||||
integrity sha512-aBQ1FxIa7kSWCcmKHlcHFlT2jt6J/l4FzC7KcPELkOJOsPOb/bccdhmIrKDfXhwFrmc7vDoDrrepFvGqjyXGJg==
|
||||
|
||||
bluebird@^3.7.2:
|
||||
version "3.7.2"
|
||||
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
|
||||
integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
|
||||
|
||||
bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
|
||||
version "4.11.8"
|
||||
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
|
||||
@ -4584,6 +4584,21 @@ cheerio@^1.0.0-rc.2, cheerio@^1.0.0-rc.3:
|
||||
lodash "^4.15.0"
|
||||
parse5 "^3.0.1"
|
||||
|
||||
chokidar@3.3.1:
|
||||
version "3.3.1"
|
||||
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450"
|
||||
integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==
|
||||
dependencies:
|
||||
anymatch "~3.1.1"
|
||||
braces "~3.0.2"
|
||||
glob-parent "~5.1.0"
|
||||
is-binary-path "~2.1.0"
|
||||
is-glob "~4.0.1"
|
||||
normalize-path "~3.0.0"
|
||||
readdirp "~3.3.0"
|
||||
optionalDependencies:
|
||||
fsevents "~2.1.2"
|
||||
|
||||
chokidar@^2.0.2, chokidar@^2.1.2, chokidar@^2.1.8:
|
||||
version "2.1.8"
|
||||
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917"
|
||||
@ -4885,10 +4900,10 @@ color@^3.0.0:
|
||||
color-convert "^1.9.1"
|
||||
color-string "^1.5.2"
|
||||
|
||||
colorette@1.0.7:
|
||||
version "1.0.7"
|
||||
resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.0.7.tgz#7adf43c445ee63a541b4a4aef7d13f03df1e0cc0"
|
||||
integrity sha512-KeK4klsvAgdODAjFPm6QLzvStizJqlxMBtVo4KQMCgk5tt/tf9rAzxmxLHNRynJg3tJjkKGKbHx3j4HLox27Lw==
|
||||
colorette@1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.1.0.tgz#1f943e5a357fac10b4e0f5aaef3b14cdc1af6ec7"
|
||||
integrity sha512-6S062WDQUXi6hOfkO/sBPVwE5ASXY4G2+b4atvhJfSsuUUhIaUKlkjLe9692Ipyt5/a+IPF5aVTu3V5gvXq5cg==
|
||||
|
||||
colors@^1.1.2, colors@^1.3.3:
|
||||
version "1.4.0"
|
||||
@ -4940,6 +4955,11 @@ commander@^2.11.0, commander@^2.19.0, commander@^2.20.0:
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
|
||||
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
|
||||
|
||||
commander@^4.1.0:
|
||||
version "4.1.0"
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.0.tgz#545983a0603fe425bc672d66c9e3c89c42121a83"
|
||||
integrity sha512-NIQrwvv9V39FHgGFm36+U9SMQzbiHvU79k+iADraJTpmrFFfx7Ds0IvDoAdZsDrknlkRk14OYoWXb57uTh7/sw==
|
||||
|
||||
commander@~2.19.0:
|
||||
version "2.19.0"
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
|
||||
@ -6756,6 +6776,14 @@ eslint-module-utils@^2.4.1:
|
||||
debug "^2.6.9"
|
||||
pkg-dir "^2.0.0"
|
||||
|
||||
eslint-plugin-es@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.0.tgz#98cb1bc8ab0aa807977855e11ad9d1c9422d014b"
|
||||
integrity sha512-6/Jb/J/ZvSebydwbBJO1R9E5ky7YeElfK56Veh7e4QGFHCXoIXGH9HhVz+ibJLM3XJ1XjP+T7rKBLUa/Y7eIng==
|
||||
dependencies:
|
||||
eslint-utils "^2.0.0"
|
||||
regexpp "^3.0.0"
|
||||
|
||||
eslint-plugin-import@^2.19.1:
|
||||
version "2.19.1"
|
||||
resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.19.1.tgz#5654e10b7839d064dd0d46cd1b88ec2133a11448"
|
||||
@ -6789,6 +6817,18 @@ eslint-plugin-jsx-a11y@^6.2.3:
|
||||
has "^1.0.3"
|
||||
jsx-ast-utils "^2.2.1"
|
||||
|
||||
eslint-plugin-node@11.0.0:
|
||||
version "11.0.0"
|
||||
resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.0.0.tgz#365944bb0804c5d1d501182a9bc41a0ffefed726"
|
||||
integrity sha512-chUs/NVID+sknFiJzxoN9lM7uKSOEta8GC8365hw1nDfwIPIjjpRSwwPvQanWv8dt/pDe9EV4anmVSwdiSndNg==
|
||||
dependencies:
|
||||
eslint-plugin-es "^3.0.0"
|
||||
eslint-utils "^2.0.0"
|
||||
ignore "^5.1.1"
|
||||
minimatch "^3.0.4"
|
||||
resolve "^1.10.1"
|
||||
semver "^6.1.0"
|
||||
|
||||
eslint-plugin-react-hooks@^2.0.0:
|
||||
version "2.1.2"
|
||||
resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-2.1.2.tgz#1358d2acb2c5e02b7e90c37e611ac258a488e3a7"
|
||||
@ -6837,6 +6877,13 @@ eslint-utils@^1.4.2:
|
||||
dependencies:
|
||||
eslint-visitor-keys "^1.0.0"
|
||||
|
||||
eslint-utils@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.0.0.tgz#7be1cc70f27a72a76cd14aa698bcabed6890e1cd"
|
||||
integrity sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==
|
||||
dependencies:
|
||||
eslint-visitor-keys "^1.1.0"
|
||||
|
||||
eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2"
|
||||
@ -6885,6 +6932,11 @@ eslint@^6.3.0:
|
||||
text-table "^0.2.0"
|
||||
v8-compile-cache "^2.0.3"
|
||||
|
||||
esm@^3.2.25:
|
||||
version "3.2.25"
|
||||
resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10"
|
||||
integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==
|
||||
|
||||
espree@^6.1.1:
|
||||
version "6.1.1"
|
||||
resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.1.tgz#7f80e5f7257fc47db450022d723e356daeb1e5de"
|
||||
@ -7619,6 +7671,15 @@ fs-extra@4.0.1:
|
||||
jsonfile "^3.0.0"
|
||||
universalify "^0.1.0"
|
||||
|
||||
fs-extra@8.1.0, fs-extra@^8.0.1, fs-extra@^8.1.0:
|
||||
version "8.1.0"
|
||||
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
|
||||
integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==
|
||||
dependencies:
|
||||
graceful-fs "^4.2.0"
|
||||
jsonfile "^4.0.0"
|
||||
universalify "^0.1.0"
|
||||
|
||||
fs-extra@^7.0.0, fs-extra@^7.0.1:
|
||||
version "7.0.1"
|
||||
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9"
|
||||
@ -7628,15 +7689,6 @@ fs-extra@^7.0.0, fs-extra@^7.0.1:
|
||||
jsonfile "^4.0.0"
|
||||
universalify "^0.1.0"
|
||||
|
||||
fs-extra@^8.0.1, fs-extra@^8.1.0:
|
||||
version "8.1.0"
|
||||
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
|
||||
integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==
|
||||
dependencies:
|
||||
graceful-fs "^4.2.0"
|
||||
jsonfile "^4.0.0"
|
||||
universalify "^0.1.0"
|
||||
|
||||
fs-minipass@^1.2.5:
|
||||
version "1.2.7"
|
||||
resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7"
|
||||
@ -7672,6 +7724,11 @@ fsevents@~2.1.0:
|
||||
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.1.tgz#74c64e21df71721845d0c44fe54b7f56b82995a9"
|
||||
integrity sha512-4FRPXWETxtigtJW/gxzEDsX1LVbPAM93VleB83kZB+ellqbHMkyt2aJfuzNLRvFPnGi6bcE5SvfxgbXPeKteJw==
|
||||
|
||||
fsevents@~2.1.2:
|
||||
version "2.1.2"
|
||||
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805"
|
||||
integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==
|
||||
|
||||
ftp@~0.3.10:
|
||||
version "0.3.10"
|
||||
resolved "https://registry.yarnpkg.com/ftp/-/ftp-0.3.10.tgz#9197d861ad8142f3e63d5a83bfe4c59f7330885d"
|
||||
@ -7850,10 +7907,10 @@ get-value@^2.0.3, get-value@^2.0.6:
|
||||
resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
|
||||
integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=
|
||||
|
||||
getopts@2.2.3:
|
||||
version "2.2.3"
|
||||
resolved "https://registry.yarnpkg.com/getopts/-/getopts-2.2.3.tgz#11d229775e2ec2067ed8be6fcc39d9b4bf39cf7d"
|
||||
integrity sha512-viEcb8TpgeG05+Nqo5EzZ8QR0hxdyrYDp6ZSTZqe2M/h53Bk036NmqG38Vhf5RGirC/Of9Xql+v66B2gp256SQ==
|
||||
getopts@2.2.5:
|
||||
version "2.2.5"
|
||||
resolved "https://registry.yarnpkg.com/getopts/-/getopts-2.2.5.tgz#67a0fe471cacb9c687d817cab6450b96dde8313b"
|
||||
integrity sha512-9jb7AW5p3in+IiJWhQiZmmwkpLaR/ccTWdWQCtZM66HJcHHLegowh4q4tSD7gouUyeNvFWRavfK9GXosQHDpFA==
|
||||
|
||||
getos@3.1.0:
|
||||
version "3.1.0"
|
||||
@ -7958,6 +8015,18 @@ glob@7.1.2:
|
||||
once "^1.3.0"
|
||||
path-is-absolute "^1.0.0"
|
||||
|
||||
glob@7.1.6:
|
||||
version "7.1.6"
|
||||
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
|
||||
integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
|
||||
dependencies:
|
||||
fs.realpath "^1.0.0"
|
||||
inflight "^1.0.4"
|
||||
inherits "2"
|
||||
minimatch "^3.0.4"
|
||||
once "^1.3.0"
|
||||
path-is-absolute "^1.0.0"
|
||||
|
||||
glob@^5.0.15:
|
||||
version "5.0.15"
|
||||
resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
|
||||
@ -8863,7 +8932,7 @@ inflight@^1.0.4:
|
||||
once "^1.3.0"
|
||||
wrappy "1"
|
||||
|
||||
inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
|
||||
inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4:
|
||||
version "2.0.4"
|
||||
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
|
||||
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
|
||||
@ -8924,11 +8993,16 @@ internal-ip@^4.3.0:
|
||||
default-gateway "^4.2.0"
|
||||
ipaddr.js "^1.9.0"
|
||||
|
||||
interpret@1.2.0, interpret@^1.0.0, interpret@^1.2.0:
|
||||
interpret@1.2.0, interpret@^1.0.0:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296"
|
||||
integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==
|
||||
|
||||
interpret@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.0.0.tgz#b783ffac0b8371503e9ab39561df223286aa5433"
|
||||
integrity sha512-e0/LknJ8wpMMhTiWcjivB+ESwIuvHnBSlBbmP/pSb8CQJldoj1p2qv7xGZ/+BtbTziYRFSz8OsvdbiX45LtYQA==
|
||||
|
||||
intl-format-cache@^2.0.5:
|
||||
version "2.2.9"
|
||||
resolved "https://registry.yarnpkg.com/intl-format-cache/-/intl-format-cache-2.2.9.tgz#fb560de20c549cda20b569cf1ffb6dc62b5b93b4"
|
||||
@ -10253,28 +10327,27 @@ kleur@^3.0.3:
|
||||
resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
|
||||
integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
|
||||
|
||||
knex@^0.16.5:
|
||||
version "0.16.5"
|
||||
resolved "https://registry.yarnpkg.com/knex/-/knex-0.16.5.tgz#8ba3806289a5d543dd42ed21420a31c578476993"
|
||||
integrity sha512-1RVxMU8zGOBqgmXlAvs8vohg9MD14iiRZZPe0IeQXd554n4xxPmoMkbH4hlFeqfM6eOdFE3AVqVSncL3YuocqA==
|
||||
knex@^0.20.0:
|
||||
version "0.20.8"
|
||||
resolved "https://registry.yarnpkg.com/knex/-/knex-0.20.8.tgz#b41c72773185e1032f4a77074198413521827860"
|
||||
integrity sha512-fLiSg5PIBisORs0M+UGjg2s1P/E1BrYvb/NkSVk6Y90HJujkqLufSC6ag+hDgXqW73mFAF283M6+q3/NW0TrHw==
|
||||
dependencies:
|
||||
"@babel/polyfill" "^7.4.3"
|
||||
"@types/bluebird" "^3.5.26"
|
||||
bluebird "^3.5.4"
|
||||
colorette "1.0.7"
|
||||
commander "^2.20.0"
|
||||
bluebird "^3.7.2"
|
||||
colorette "1.1.0"
|
||||
commander "^4.1.0"
|
||||
debug "4.1.1"
|
||||
getopts "2.2.3"
|
||||
inherits "~2.0.3"
|
||||
interpret "^1.2.0"
|
||||
esm "^3.2.25"
|
||||
getopts "2.2.5"
|
||||
inherits "~2.0.4"
|
||||
interpret "^2.0.0"
|
||||
liftoff "3.1.0"
|
||||
lodash "^4.17.11"
|
||||
lodash "^4.17.15"
|
||||
mkdirp "^0.5.1"
|
||||
pg-connection-string "2.0.0"
|
||||
tarn "^1.1.5"
|
||||
tildify "1.2.0"
|
||||
uuid "^3.3.2"
|
||||
v8flags "^3.1.2"
|
||||
pg-connection-string "2.1.0"
|
||||
tarn "^2.0.0"
|
||||
tildify "2.0.0"
|
||||
uuid "^3.3.3"
|
||||
v8flags "^3.1.3"
|
||||
|
||||
koa-body@^4.1.0:
|
||||
version "4.1.1"
|
||||
@ -12993,10 +13066,10 @@ pg-connection-string@0.1.3:
|
||||
resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-0.1.3.tgz#da1847b20940e42ee1492beaf65d49d91b245df7"
|
||||
integrity sha1-2hhHsglA5C7hSSvq9l1J2RskXfc=
|
||||
|
||||
pg-connection-string@2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.0.0.tgz#3eefe5997e06d94821e4d502e42b6a1c73f8df82"
|
||||
integrity sha1-Pu/lmX4G2Ugh5NUC5CtqHHP434I=
|
||||
pg-connection-string@2.1.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.1.0.tgz#e07258f280476540b24818ebb5dca29e101ca502"
|
||||
integrity sha512-bhlV7Eq09JrRIvo1eKngpwuqKtJnNhZdpdOlvrPrA4dxqXPjxSrbNrfnIDmTpwMyRszrcV4kU5ZA4mMsQUrjdg==
|
||||
|
||||
pg-int8@1.0.1:
|
||||
version "1.0.1"
|
||||
@ -13044,6 +13117,11 @@ picomatch@^2.0.4, picomatch@^2.0.5:
|
||||
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.0.7.tgz#514169d8c7cd0bdbeecc8a2609e34a7163de69f6"
|
||||
integrity sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==
|
||||
|
||||
picomatch@^2.0.7:
|
||||
version "2.2.1"
|
||||
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a"
|
||||
integrity sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==
|
||||
|
||||
pidtree@^0.3.0:
|
||||
version "0.3.0"
|
||||
resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.0.tgz#f6fada10fccc9f99bf50e90d0b23d72c9ebc2e6b"
|
||||
@ -14561,6 +14639,13 @@ readdirp@~3.1.3:
|
||||
dependencies:
|
||||
picomatch "^2.0.4"
|
||||
|
||||
readdirp@~3.3.0:
|
||||
version "3.3.0"
|
||||
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17"
|
||||
integrity sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==
|
||||
dependencies:
|
||||
picomatch "^2.0.7"
|
||||
|
||||
realpath-native@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c"
|
||||
@ -14717,6 +14802,11 @@ regexpp@^2.0.1:
|
||||
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f"
|
||||
integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==
|
||||
|
||||
regexpp@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e"
|
||||
integrity sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g==
|
||||
|
||||
regexpu-core@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b"
|
||||
@ -15037,6 +15127,13 @@ resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.3.2
|
||||
dependencies:
|
||||
path-parse "^1.0.6"
|
||||
|
||||
resolve@^1.10.1:
|
||||
version "1.15.0"
|
||||
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.0.tgz#1b7ca96073ebb52e741ffd799f6b39ea462c67f5"
|
||||
integrity sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==
|
||||
dependencies:
|
||||
path-parse "^1.0.6"
|
||||
|
||||
restore-cursor@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541"
|
||||
@ -15112,7 +15209,7 @@ rimraf@2.6.3:
|
||||
dependencies:
|
||||
glob "^7.1.3"
|
||||
|
||||
rimraf@^3.0.0:
|
||||
rimraf@3.0.0, rimraf@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.0.tgz#614176d4b3010b75e5c390eb0ee96f6dc0cebb9b"
|
||||
integrity sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==
|
||||
@ -16710,10 +16807,10 @@ tar@^4, tar@^4.4.10, tar@^4.4.12, tar@^4.4.8:
|
||||
safe-buffer "^5.1.2"
|
||||
yallist "^3.0.3"
|
||||
|
||||
tarn@^1.1.5:
|
||||
version "1.1.5"
|
||||
resolved "https://registry.yarnpkg.com/tarn/-/tarn-1.1.5.tgz#7be88622e951738b9fa3fb77477309242cdddc2d"
|
||||
integrity sha512-PMtJ3HCLAZeedWjJPgGnCvcphbCOMbtZpjKgLq3qM5Qq9aQud+XHrL0WlrlgnTyS8U+jrjGbEXprFcQrxPy52g==
|
||||
tarn@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/tarn/-/tarn-2.0.0.tgz#c68499f69881f99ae955b4317ca7d212d942fdee"
|
||||
integrity sha512-7rNMCZd3s9bhQh47ksAQd92ADFcJUjjbyOvyFjNLwTPpGieFHMC84S+LOzw0fx1uh6hnDz/19r8CPMnIjJlMMA==
|
||||
|
||||
teeny-request@^3.11.3:
|
||||
version "3.11.3"
|
||||
@ -16875,12 +16972,10 @@ thunky@^1.0.2:
|
||||
resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.0.3.tgz#f5df732453407b09191dae73e2a8cc73f381a826"
|
||||
integrity sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==
|
||||
|
||||
tildify@1.2.0:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a"
|
||||
integrity sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=
|
||||
dependencies:
|
||||
os-homedir "^1.0.0"
|
||||
tildify@2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/tildify/-/tildify-2.0.0.tgz#f205f3674d677ce698b7067a99e949ce03b4754a"
|
||||
integrity sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==
|
||||
|
||||
timed-out@^4.0.0:
|
||||
version "4.0.1"
|
||||
@ -17433,7 +17528,7 @@ v8-compile-cache@^2.0.3:
|
||||
resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e"
|
||||
integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==
|
||||
|
||||
v8flags@^3.1.2:
|
||||
v8flags@^3.1.3:
|
||||
version "3.1.3"
|
||||
resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.1.3.tgz#fc9dc23521ca20c5433f81cc4eb9b3033bb105d8"
|
||||
integrity sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==
|
||||
|
Loading…
x
Reference in New Issue
Block a user