Merge branch 'master' into fix/5038

This commit is contained in:
cyril lopez 2020-01-30 15:41:27 +01:00 committed by GitHub
commit eb6fc3578d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
76 changed files with 618 additions and 427 deletions

View File

@ -2,7 +2,9 @@
**/build/** **/build/**
**/dist/** **/dist/**
testApp/** testApp/**
packages/strapi-plugin-users-permissions/admin/**
packages/strapi-plugin-upload/admin/**
packages/strapi-generate-plugin/files/admin/src/** packages/strapi-generate-plugin/files/admin/src/**
packages/strapi-helper-plugin/**
packages/strapi-plugin-users-permissions/admin/**
.eslintrc.js .eslintrc.js
.eslintrc.front.js
.eslintrc.back.js

22
.eslintrc.back.js Normal file
View 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
View 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,
},
};

View File

@ -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 = { 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: { parserOptions: {
ecmaVersion: 2018, 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: [ overrides: [
{ {
files: ['packages/**/admin/src/**/**/*.js'], files: ['packages/**/*.js', 'test/**/*.js', 'scripts/**/*.js'],
extends: ['airbnb'], excludedFiles: frontPaths,
rules: { ...require('./.eslintrc.back.js'),
'arrow-body-style': 0, },
'arrow-parens': 0, {
camelcase: 0, files: frontPaths,
'comma-dangle': 0, ...require('./.eslintrc.front.js'),
'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,
},
}, },
], ],
}; };

View File

@ -11,7 +11,7 @@
// This function is called when a project is opened or re-opened (e.g. due to // This function is called when a project is opened or re-opened (e.g. due to
// the project's config changing) // the project's config changing)
module.exports = (/*on, config*/) => { module.exports = (/* on, config */) => {
// `on` is used to hook into various events Cypress emits // `on` is used to hook into various events Cypress emits
// `config` is the resolved Cypress config // `config` is the resolved Cypress config
}; };

View File

@ -162,6 +162,7 @@ Cypress.Commands.add('deleteApi', (model, jwt) => {
Cypress.Commands.add('login', () => { Cypress.Commands.add('login', () => {
cy.createUser(); cy.createUser();
return cy return cy
.request({ .request({
url: `${backendUrl}/admin/auth/local`, url: `${backendUrl}/admin/auth/local`,

View File

@ -14,7 +14,7 @@
// *********************************************************** // ***********************************************************
// Import commands.js using ES2015 syntax: // Import commands.js using ES2015 syntax:
import './commands' import './commands';
// Alternatively you can use CommonJS syntax: // Alternatively you can use CommonJS syntax:
// require('./commands') // require('./commands')
@ -28,6 +28,8 @@ Cypress.on('before:browser:launch', (browser = {}, args) => {
if (browser.name === 'chrome') { if (browser.name === 'chrome') {
args.push('--disable-site-isolation-trials'); args.push('--disable-site-isolation-trials');
return args return args;
} }
})
return args;
});

View File

@ -245,7 +245,7 @@ You can configure these global headers by updating the file at `./config/environ
{ {
"webhooks": { "webhooks": {
"defaultHeaders": { "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": { "webhooks": {
"defaultHeaders": { "defaultHeaders": {
"Authroization": "Bearer ${ process.env.WEBHOOK_TOKEN }" "Authorization": "Bearer ${ process.env.WEBHOOK_TOKEN }"
} }
} }
} }

View File

@ -213,7 +213,7 @@ And for your files, they have to be prefixed by `files`.
Example here with cover attribute `files.cover`. Example here with cover attribute `files.cover`.
::: tip ::: 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` Example `files.my_component_name[the_index].attribute_name`
::: :::

View File

@ -10,7 +10,7 @@
"strapi": "strapi" "strapi": "strapi"
}, },
"dependencies": { "dependencies": {
"knex": "^0.16.5", "knex": "^0.20.0",
"lodash": "^4.17.5", "lodash": "^4.17.5",
"mysql": "^2.17.1", "mysql": "^2.17.1",
"pg": "^7.10.0", "pg": "^7.10.0",

View File

@ -6,6 +6,7 @@
"@testing-library/react": "^9.1.0", "@testing-library/react": "^9.1.0",
"@testing-library/react-hooks": "^2.0.0", "@testing-library/react-hooks": "^2.0.0",
"babel-eslint": "^10.0.0", "babel-eslint": "^10.0.0",
"chokidar": "3.3.1",
"cross-env": "^5.2.0", "cross-env": "^5.2.0",
"cypress": "3.1.2", "cypress": "3.1.2",
"enzyme": "^3.9.0", "enzyme": "^3.9.0",
@ -16,10 +17,13 @@
"eslint-config-prettier": "^6.2.0", "eslint-config-prettier": "^6.2.0",
"eslint-plugin-import": "^2.19.1", "eslint-plugin-import": "^2.19.1",
"eslint-plugin-jsx-a11y": "^6.2.3", "eslint-plugin-jsx-a11y": "^6.2.3",
"eslint-plugin-node": "11.0.0",
"eslint-plugin-react": "^7.14.0", "eslint-plugin-react": "^7.14.0",
"eslint-plugin-react-hooks": "^2.0.0", "eslint-plugin-react-hooks": "^2.0.0",
"eslint-plugin-redux-saga": "^1.1.0", "eslint-plugin-redux-saga": "^1.1.0",
"execa": "^1.0.0", "execa": "^1.0.0",
"fs-extra": "8.1.0",
"glob": "7.1.6",
"husky": "^3.0.0", "husky": "^3.0.0",
"istanbul": "~0.4.2", "istanbul": "~0.4.2",
"jest": "^24.5.0", "jest": "^24.5.0",
@ -31,9 +35,12 @@
"react-test-renderer": "^16.9.0", "react-test-renderer": "^16.9.0",
"request": "^2.87.0", "request": "^2.87.0",
"request-promise-native": "^1.0.7", "request-promise-native": "^1.0.7",
"rimraf": "3.0.0",
"snyk": "^1.99.0", "snyk": "^1.99.0",
"wait-on": "^3.2.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": { "scripts": {
"setup": "yarn && yarn build", "setup": "yarn && yarn build",

View File

@ -37,6 +37,8 @@ program
if (projectName === undefined) { if (projectName === undefined) {
console.error('Please specify the <directory> of your project'); console.error('Please specify the <directory> of your project');
// eslint-disable-next-line no-process-exit
process.exit(1); process.exit(1);
} }

View File

@ -213,5 +213,9 @@
"Auth.link.forgot-password": "Esqueceu sua senha?", "Auth.link.forgot-password": "Esqueceu sua senha?",
"Auth.link.ready": "Pronto para entrar?", "Auth.link.ready": "Pronto para entrar?",
"app.containers.App.notification.error.init": "Ocorreu um erro ao solicitar a API", "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"
} }

View File

@ -43,6 +43,7 @@
"cross-env": "^5.0.5", "cross-env": "^5.0.5",
"css-loader": "^2.1.1", "css-loader": "^2.1.1",
"duplicate-package-checker-webpack-plugin": "^3.0.0", "duplicate-package-checker-webpack-plugin": "^3.0.0",
"execa": "^1.0.0",
"file-loader": "^3.0.1", "file-loader": "^3.0.1",
"font-awesome": "^4.7.0", "font-awesome": "^4.7.0",
"friendly-errors-webpack-plugin": "^1.7.0", "friendly-errors-webpack-plugin": "^1.7.0",
@ -55,6 +56,7 @@
"intl": "^1.2.5", "intl": "^1.2.5",
"invariant": "^2.2.4", "invariant": "^2.2.4",
"is-wsl": "^2.0.0", "is-wsl": "^2.0.0",
"lodash": "^4.17.11",
"match-sorter": "^4.0.2", "match-sorter": "^4.0.2",
"mini-css-extract-plugin": "^0.6.0", "mini-css-extract-plugin": "^0.6.0",
"moment": "^2.24.0", "moment": "^2.24.0",

View File

@ -24,6 +24,9 @@
"rimraf": "^2.6.3", "rimraf": "^2.6.3",
"strapi-utils": "3.0.0-beta.18.6" "strapi-utils": "3.0.0-beta.18.6"
}, },
"peerDependencies": {
"knex": "^0.20.0"
},
"strapi": { "strapi": {
"dependencies": [ "dependencies": [
"knex" "knex"

View File

@ -58,6 +58,7 @@ module.exports = function(strapi) {
useUnifiedTopology, useUnifiedTopology,
} = connection.settings; } = connection.settings;
// eslint-disable-next-line node/no-deprecated-api
const uriOptions = uri ? url.parse(uri, true).query : {}; const uriOptions = uri ? url.parse(uri, true).query : {};
const { authenticationDatabase, ssl, debug } = _.defaults( const { authenticationDatabase, ssl, debug } = _.defaults(
connection.options, connection.options,

View File

@ -229,7 +229,8 @@ module.exports = ({ models, target, plugin = false }, ctx) => {
const refToStrapiRef = obj => { const refToStrapiRef = obj => {
const ref = obj.ref; 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; if (typeof plainData !== 'object') return ref;

View File

@ -28,6 +28,7 @@
}, },
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"lodash": "^4.17.11",
"verror": "^1.10.0" "verror": "^1.10.0"
} }
} }

View File

@ -5,7 +5,7 @@
* to run scheduled jobs. * to run scheduled jobs.
* *
* The cron format consists of: * 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 * See more details here: https://strapi.io/documentation/3.0.0-beta.x/concepts/configurations.html#cron-tasks
*/ */

View File

@ -24,6 +24,7 @@ const CircleButton = styled.button`
} }
`; `;
} }
return css` return css`
&:after { &:after {
content: '\f067'; content: '\f067';

View File

@ -136,7 +136,7 @@ class GlobalPagination extends React.Component {
onClick={this.handlePreviousPageClick} onClick={this.handlePreviousPageClick}
disabled={this.isFirstPage()} disabled={this.isFirstPage()}
> >
<i className="fa fa-angle-left" aria-hidden="true"></i> <i className="fa fa-angle-left" aria-hidden="true" />
</a> </a>
<nav className="navWrapper"> <nav className="navWrapper">
<ul className="navUl">{this.renderLinks()}</ul> <ul className="navUl">{this.renderLinks()}</ul>
@ -147,7 +147,7 @@ class GlobalPagination extends React.Component {
onClick={this.handleNextPageClick} onClick={this.handleNextPageClick}
disabled={this.isLastPage()} disabled={this.isLastPage()}
> >
<i className="fa fa-angle-right" aria-hidden="true"></i> <i className="fa fa-angle-right" aria-hidden="true" />
</a> </a>
</div> </div>
</Wrapper> </Wrapper>

View File

@ -38,8 +38,6 @@ function HeaderNav({ links, style }) {
onClick={e => { onClick={e => {
if (link.disabled) { if (link.disabled) {
e.preventDefault(); e.preventDefault();
return;
} }
}} }}
> >

View File

@ -180,9 +180,9 @@ class ImgPreview extends React.Component {
const containerStyle = isEmpty(imgURL) const containerStyle = isEmpty(imgURL)
? { ? {
display: 'flex', display: 'flex',
zIndex: 9999, zIndex: 9999,
} }
: {}; : {};
return ( return (

View File

@ -95,6 +95,7 @@ class InputCheckbox extends React.Component {
</FormattedMessage> </FormattedMessage>
); );
} }
return ( return (
<Wrapper <Wrapper
className={cn('form-check', !isEmpty(className) && className)} className={cn('form-check', !isEmpty(className) && className)}

View File

@ -23,6 +23,7 @@ class InputCheckboxWithErrors extends React.Component {
componentDidMount() { componentDidMount() {
// Display input error if it already has some // Display input error if it already has some
const { errors } = this.props; const { errors } = this.props;
if (!isEmpty(errors)) { if (!isEmpty(errors)) {
this.setState({ errors }); this.setState({ errors });
} }
@ -63,7 +64,7 @@ class InputCheckboxWithErrors extends React.Component {
value, value,
} = this.props; } = this.props;
const handleBlur = onBlur ? onBlur : () => {}; const handleBlur = onBlur || (() => {});
let inputTitle = ''; let inputTitle = '';
let spacer = !isEmpty(inputDescription) ? <InputSpacer /> : <div />; let spacer = !isEmpty(inputDescription) ? <InputSpacer /> : <div />;

View File

@ -51,8 +51,7 @@ function InputDate(props) {
name: props.name, name: props.name,
value: moment, value: moment,
}, },
}) })}
}
onChange={moment => onChange={moment =>
props.onChange({ props.onChange({
target: { target: {
@ -60,8 +59,7 @@ function InputDate(props) {
value: moment, value: moment,
type: 'date', type: 'date',
}, },
}) })}
}
onFocus={props.onFocus} onFocus={props.onFocus}
ref={props.inputRef} ref={props.inputRef}
tabIndex={props.tabIndex} tabIndex={props.tabIndex}

View File

@ -25,6 +25,7 @@ function InputDescription(props) {
if (isFunction(props.message)) { if (isFunction(props.message)) {
content = props.message(); content = props.message();
} }
return ( return (
<Div <Div
className={cn(!isEmpty(props.className) && props.className)} className={cn(!isEmpty(props.className) && props.className)}

View File

@ -40,7 +40,7 @@ class InputPassword extends React.Component {
: { color: '#9EA7B8' }; : { color: '#9EA7B8' };
return ( return (
<Fragment> <>
<FormattedMessage <FormattedMessage
id={formattedPlaceholder} id={formattedPlaceholder}
defaultMessage={formattedPlaceholder} defaultMessage={formattedPlaceholder}
@ -77,7 +77,7 @@ class InputPassword extends React.Component {
<i className="fa fa-eye" /> <i className="fa fa-eye" />
</div> </div>
</EyeWrapper> </EyeWrapper>
</Fragment> </>
); );
} }
} }

View File

@ -51,9 +51,9 @@ function InputSelect(props) {
{option.label} {option.label}
</option> </option>
); );
} else {
return <SelectOption key={key} {...option} />;
} }
return <SelectOption key={key} {...option} />;
} }
return ( return (

View File

@ -22,6 +22,7 @@ class InputSelectWithErrors extends React.Component {
componentDidMount() { componentDidMount() {
const { errors } = this.props; const { errors } = this.props;
// Display input error if it already has some // Display input error if it already has some
if (!isEmpty(errors)) { if (!isEmpty(errors)) {
this.setState({ errors }); this.setState({ errors });

View File

@ -18,6 +18,7 @@ import Container from './Container';
class InputToggleWithErrors extends React.Component { class InputToggleWithErrors extends React.Component {
state = { errors: [] }; state = { errors: [] };
componentDidMount() { componentDidMount() {
const { errors } = this.props; const { errors } = this.props;

View File

@ -63,7 +63,7 @@ function LeftMenuHeader({ count, search, searchable, setSearch, title }) {
) : ( ) : (
<div className="search-wrapper"> <div className="search-wrapper">
<FontAwesomeIcon icon="search" /> <FontAwesomeIcon icon="search" />
<button onClick={toggleSearch}></button> <button onClick={toggleSearch} />
<Search <Search
ref={ref} ref={ref}
onChange={handleChange} onChange={handleChange}

View File

@ -26,6 +26,7 @@ function LeftMenuList({ customLink, links, title, searchable }) {
return acc + current.links.length; return acc + current.links.length;
}, 0); }, 0);
} }
return links.length; return links.length;
}; };
@ -38,6 +39,7 @@ function LeftMenuList({ customLink, links, title, searchable }) {
}; };
}); });
} }
return matchSorter(links, search, { keys: ['title'] }); return matchSorter(links, search, { keys: ['title'] });
}; };

View File

@ -49,6 +49,7 @@ const LeftMenuSubList = ({
<ul> <ul>
{links.map(link => { {links.map(link => {
const { name, title } = link; const { name, title } = link;
return ( return (
<li key={name}> <li key={name}>
<LeftMenuLink {...link}>{title}</LeftMenuLink> <LeftMenuLink {...link}>{title}</LeftMenuLink>

View File

@ -19,9 +19,7 @@ function ListHeader({
return ( return (
<Wrapper style={style}> <Wrapper style={style}>
{button && <Button {...button} />} {button && <Button {...button} />}
{children ? ( {children || (
children
) : (
<FormattedMessage id={title} values={titleValues}> <FormattedMessage id={title} values={titleValues}>
{msg => <Title>{msg}</Title>} {msg => <Title>{msg}</Title>}
</FormattedMessage> </FormattedMessage>

View File

@ -18,7 +18,7 @@ function PageFooter(props) {
<form className="form-inline"> <form className="form-inline">
<div className="pageFooterSelectWrapper"> <div className="pageFooterSelectWrapper">
<select <select
className={`form-control`} className="form-control"
id="params._limit" id="params._limit"
name="params._limit" name="params._limit"
onChange={e => { onChange={e => {

View File

@ -10,10 +10,8 @@ import { reduce } from 'lodash';
// Plugin identifier based on the package.json `name` value // Plugin identifier based on the package.json `name` value
const pluginPkg = require('../../../../package.json'); 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, * Add plugin identifier as translation message prefix,
@ -22,11 +20,16 @@ const pluginId = pluginPkg.name.replace(
* *
* @param messages * @param messages
*/ */
const formatMessages = messages => reduce(messages, (result, value, key) => { const formatMessages = messages =>
result[`${pluginId}.${key}`] = value; reduce(
messages,
(result, value, key) => {
result[`${pluginId}.${key}`] = value;
return result; return result;
}, {}); },
{}
);
/** /**
* Try to require translation file. * Try to require translation file.
@ -37,8 +40,9 @@ const requireTranslations = language => {
try { try {
return require(`translations/${language}.json`); // eslint-disable-line global-require return require(`translations/${language}.json`); // eslint-disable-line global-require
} catch (error) { } 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.`); console.error(
return; `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`. * Dynamically generate `translationsMessages object`.
*/ */
const translationMessages = reduce(strapi.languages, (result, language) => { const translationMessages = reduce(
result[language] = formatMessages(requireTranslations(language)); strapi.languages,
(result, language) => {
result[language] = formatMessages(requireTranslations(language));
return result; return result;
}, {}); },
{}
);
export { translationMessages }; export { translationMessages };

View File

@ -5,7 +5,7 @@ const Close = props => (
<path <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" 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" fillRule="nonzero"
></path> />
</svg> </svg>
); );

View File

@ -23,7 +23,7 @@ const auth = {
if (localStorage) { if (localStorage) {
const videos = auth.get('videos'); const videos = auth.get('videos');
const onboarding = auth.get('onboarding'); const onboarding = auth.get('onboarding');
localStorage.clear(); localStorage.clear();
localStorage.setItem('videos', JSON.stringify(videos)); localStorage.setItem('videos', JSON.stringify(videos));
localStorage.setItem('onboarding', onboarding); localStorage.setItem('onboarding', onboarding);

View File

@ -2,12 +2,18 @@ import { isArray, isObject } from 'lodash';
const cleanData = (value, key, secondKey) => { const cleanData = (value, key, secondKey) => {
if (isArray(value)) { if (isArray(value)) {
return value.map(obj => obj[key] ? obj[key] : obj); 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;
} }
if (isObject(value)) {
return (
value[key] ||
value[`_${key}`] ||
value[secondKey] ||
value[`_${secondKey}`]
);
}
return value;
}; };
export default cleanData; export default cleanData;

View File

@ -1,13 +1,19 @@
const subtractLight = (color, amount) => { const subtractLight = (color, amount) => {
const cc = parseInt(color,16) - amount; const cc = parseInt(color, 16) - amount;
let c = (cc < 0) ? 0 : (cc); let c = cc < 0 ? 0 : cc;
c = (c.toString(16).length > 1 ) ? c.toString(16) : `0${c.toString(16)}`; c = c.toString(16).length > 1 ? c.toString(16) : `0${c.toString(16)}`;
return c; return c;
}; };
export const darken = (colour, amount) => { export const darken = (colour, amount) => {
let color = (colour.indexOf("#")>=0) ? colour.substring(1,colour.length) : colour; let color =
const percentage = parseInt((255*amount)/100, 10); colour.indexOf('#') >= 0 ? colour.substring(1, colour.length) : colour;
color = `#${subtractLight(color.substring(0,2), percentage)}${subtractLight(color.substring(2,4), percentage)}${subtractLight(color.substring(4,6), percentage)}`; 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; return color;
}; };

View File

@ -1,6 +1,6 @@
import 'whatwg-fetch'; import 'whatwg-fetch';
import auth from './auth';
import _ from 'lodash'; import _ from 'lodash';
import auth from './auth';
/** /**
* Parses the JSON returned by a network request * Parses the JSON returned by a network request
@ -170,6 +170,7 @@ export default function request(...args) {
if (shouldWatchServerRestart) { if (shouldWatchServerRestart) {
// Display the global OverlayBlocker // Display the global OverlayBlocker
strapi.lockApp(shouldWatchServerRestart); strapi.lockApp(shouldWatchServerRestart);
return serverRestartWatcher(response); return serverRestartWatcher(response);
} }

View File

@ -22,4 +22,4 @@ const storeData = {
}, },
}; };
export default storeData; export default storeData;

View File

@ -1,10 +1,10 @@
import { isPlainObject, isString, isArray } from 'lodash'; import { isPlainObject, isString, isArray } from 'lodash';
const templateObject = function (obj, variables) { const templateObject = function(obj, variables) {
// Allow values which looks like such as // Allow values which looks like such as
// an ES6 literal string without parenthesis inside (aka function call). // an ES6 literal string without parenthesis inside (aka function call).
const regex = /\$\{[\S]*\}/g; const regex = /\$\{[\S]*\}/g;
const replacer = (match) => { const replacer = match => {
const key = match.substring(0, match.length - 1).replace('${', ''); const key = match.substring(0, match.length - 1).replace('${', '');
return variables[key]; return variables[key];

View File

@ -78,7 +78,6 @@ module.exports = function(strapi) {
redis.on('error', err => { redis.on('error', err => {
strapi.log.error(err); strapi.log.error(err);
process.exit(0); process.exit(0);
return;
}); });
// Utils function. // Utils function.

View File

@ -30,7 +30,9 @@ function createDefaultMainField(schema) {
if (!schema) return 'id'; if (!schema) return 'id';
const mainField = Object.keys(schema.attributes).find( 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'; return mainField || 'id';

View File

@ -15,6 +15,7 @@ describe('Testing build and schema core_store', () => {
cy.login() cy.login()
.then(data => { .then(data => {
jwt = data.jwt; jwt = data.jwt;
return cy.createCTMApis(data.jwt); return cy.createCTMApis(data.jwt);
}) })
.wait(1000); .wait(1000);

View File

@ -36,7 +36,7 @@ describe('Testing Content Manager ListPages', function() {
it('Should have the Id default sort', () => { it('Should have the Id default sort', () => {
cy.get( cy.get(
`a[href="/admin/plugins/content-manager/product?source=content-manager"]` 'a[href="/admin/plugins/content-manager/product?source=content-manager"]'
) )
.click() .click()
.wait(frontLoadingDelay); .wait(frontLoadingDelay);
@ -160,7 +160,7 @@ describe('Testing Content Manager ListPages', function() {
it('Should apply filters for product data', () => { it('Should apply filters for product data', () => {
cy.get( cy.get(
`a[href="/admin/plugins/content-manager/product?source=content-manager"]` 'a[href="/admin/plugins/content-manager/product?source=content-manager"]'
) )
.click() .click()
.wait(frontLoadingDelay); .wait(frontLoadingDelay);

View File

@ -29,6 +29,7 @@
"strapi-generate": "3.0.0-beta.18.6", "strapi-generate": "3.0.0-beta.18.6",
"strapi-generate-api": "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-helper-plugin": "3.0.0-beta.18.6",
"strapi-utils": "3.0.0-beta.18.6",
"yup": "^0.27.0" "yup": "^0.27.0"
}, },
"author": { "author": {

View File

@ -16,7 +16,9 @@ describe('Test CTB', () => {
context('Check create and update API', () => { context('Check create and update API', () => {
beforeEach(() => { beforeEach(() => {
cy.server(); cy.server();
cy.route(`${backendUrl}/content-type-builder/autoReload`).as('initContentTypeBuilder'); cy.route(`${backendUrl}/content-type-builder/autoReload`).as(
'initContentTypeBuilder'
);
cy.login().then(data => { cy.login().then(data => {
jwt = data.jwt; jwt = data.jwt;
userId = data.user._id || data.user.id; userId = data.user._id || data.user.id;
@ -58,8 +60,12 @@ describe('Test CTB', () => {
it('Should create a TAG API', function() { it('Should create a TAG API', function() {
cy.server(); cy.server();
cy.route('GET', `${backendUrl}/content-type-builder/models`).as('models'); cy.route('GET', `${backendUrl}/content-type-builder/models`).as('models');
cy.route('POST', `${backendUrl}/content-type-builder/models`).as('createModel'); cy.route('POST', `${backendUrl}/content-type-builder/models`).as(
cy.route('DELETE', `${backendUrl}/content-type-builder/models/tag`).as('deleteTag'); 'createModel'
);
cy.route('DELETE', `${backendUrl}/content-type-builder/models/tag`).as(
'deleteTag'
);
cy.get('a[href="/admin/plugins/content-type-builder"') cy.get('a[href="/admin/plugins/content-type-builder"')
.click() .click()
@ -75,7 +81,7 @@ describe('Test CTB', () => {
cy.get('.modal').invoke('show'); cy.get('.modal').invoke('show');
// Fill the form // Fill the form
Object.keys(TAG_API).map(key => { Object.keys(TAG_API).forEach(key => {
cy.log(key); cy.log(key);
cy.get(`#${key}`).type(TAG_API[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', () => { it('Should update PRODUCT API field and visit the create product page', () => {
cy.server(); cy.server();
cy.createProductAndTagApis(jwt); cy.createProductAndTagApis(jwt);
cy.route(`${backendUrl}/content-type-builder/models/product?`).as('getProductModel'); cy.route(`${backendUrl}/content-type-builder/models/product?`).as(
cy.route('PUT', `${backendUrl}/content-type-builder/models/product`).as('updateProductModel'); 'getProductModel'
);
cy.route('PUT', `${backendUrl}/content-type-builder/models/product`).as(
'updateProductModel'
);
cy.visit( cy.visit(
'/admin/plugins/content-type-builder/models/product#editproduct::attributestring::baseSettings::0' '/admin/plugins/content-type-builder/models/product#editproduct::attributestring::baseSettings::0'
@ -161,7 +171,9 @@ describe('Test CTB', () => {
.wait(frontLoadingDelay); .wait(frontLoadingDelay);
// Check that we can still go to the create page // 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() .click()
.get('button[label="content-manager.containers.List.addAnEntry"') .get('button[label="content-manager.containers.List.addAnEntry"')
.click(); .click();
@ -198,8 +210,12 @@ describe('Test CTB', () => {
it('Should update PRODUCT API name and visit the create product page', () => { it('Should update PRODUCT API name and visit the create product page', () => {
cy.server(); cy.server();
// cy.createProductAndTagApis(jwt); // cy.createProductAndTagApis(jwt);
cy.route(`${backendUrl}/content-type-builder/models/product?`).as('getProductModel'); cy.route(`${backendUrl}/content-type-builder/models/product?`).as(
cy.route('PUT', `${backendUrl}/content-type-builder/models/product`).as('updateProductModel'); 'getProductModel'
);
cy.route('PUT', `${backendUrl}/content-type-builder/models/product`).as(
'updateProductModel'
);
cy.visit( cy.visit(
'/admin/plugins/content-type-builder/models/product#editproduct::contentType::baseSettings' '/admin/plugins/content-type-builder/models/product#editproduct::contentType::baseSettings'
@ -218,7 +234,9 @@ describe('Test CTB', () => {
.wait(frontLoadingDelay); .wait(frontLoadingDelay);
// Check that we can still go to the create page // 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() .click()
.wait(frontLoadingDelay) .wait(frontLoadingDelay)
.get('button[label="content-manager.containers.List.addAnEntry"') .get('button[label="content-manager.containers.List.addAnEntry"')

View File

@ -12,6 +12,7 @@
"test": "echo \"no tests yet\"" "test": "echo \"no tests yet\""
}, },
"dependencies": { "dependencies": {
"lodash": "^4.17.11",
"strapi-provider-email-sendmail": "3.0.0-beta.18.6", "strapi-provider-email-sendmail": "3.0.0-beta.18.6",
"strapi-utils": "3.0.0-beta.18.6" "strapi-utils": "3.0.0-beta.18.6"
}, },

View File

@ -1,3 +1,4 @@
// eslint-disable-next-line node/no-extraneous-require
const loadUtils = require('strapi/lib/load'); const loadUtils = require('strapi/lib/load');
const _ = require('lodash'); const _ = require('lodash');

View File

@ -22,6 +22,7 @@
"graphql-type-json": "0.3.1", "graphql-type-json": "0.3.1",
"graphql-type-long": "^0.1.1", "graphql-type-long": "^0.1.1",
"koa-compose": "^4.1.0", "koa-compose": "^4.1.0",
"lodash": "^4.17.11",
"pluralize": "^7.0.0", "pluralize": "^7.0.0",
"strapi-utils": "3.0.0-beta.18.6" "strapi-utils": "3.0.0-beta.18.6"
}, },

View File

@ -185,6 +185,7 @@ module.exports = {
request: Object.assign(_.clone(context.request), { request: Object.assign(_.clone(context.request), {
graphql: null, graphql: null,
}), }),
response: _.clone(context.response),
}); });
// Execute policies stack. // Execute policies stack.

View File

@ -246,6 +246,7 @@ module.exports = {
request: Object.assign(_.clone(context.request), { request: Object.assign(_.clone(context.request), {
graphql: null, 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 // Note: we've to used the Object.defineProperties to reset the prototype. It seems that the cloning the context

View File

@ -30,6 +30,7 @@ class EditForm extends React.Component {
value: get(this.props.settings, ['providers', current, 'provider']), value: get(this.props.settings, ['providers', current, 'provider']),
}; };
acc.push(option); acc.push(option);
return acc; return acc;
}, },
[] []

View File

@ -51,6 +51,8 @@ const StyledLi = styled.li`
} }
`; `;
} }
return '';
}} }}
`; `;

View File

@ -16,6 +16,8 @@ import FileIcon from '../FileIcon';
import { StyledLi, Truncate, Wrapper, Checked } from './components'; import { StyledLi, Truncate, Wrapper, Checked } from './components';
/* eslint-disable react/no-string-refs */ /* eslint-disable react/no-string-refs */
/* eslint-disable react/sort-comp */
/* eslint-disable react/no-array-index-key */
class Li extends React.Component { class Li extends React.Component {
static contextType = HomePageContext; static contextType = HomePageContext;

View File

@ -10,6 +10,9 @@ import PropTypes from 'prop-types';
import StyledLi from './StyledLi'; import StyledLi from './StyledLi';
/* eslint-disable jsx-a11y/no-static-element-interactions */
/* eslint-disable react/no-array-index-key */
function ListHeader({ changeSort, sort }) { function ListHeader({ changeSort, sort }) {
const titles = [ const titles = [
'hash', 'hash',

View File

@ -46,6 +46,8 @@ const Label = styled.label`
border: 2px dashed rgba(28, 93, 231, 0.1) !important; border: 2px dashed rgba(28, 93, 231, 0.1) !important;
`; `;
} }
return '';
}} }}
${({ showLoader }) => { ${({ showLoader }) => {
@ -55,6 +57,8 @@ const Label = styled.label`
linear infinite; linear infinite;
`; `;
} }
return '';
}} }}
`; `;

View File

@ -20,6 +20,8 @@ import reducer from './reducer';
import saga from './saga'; import saga from './saga';
import selectConfigPage from './selectors'; import selectConfigPage from './selectors';
/* eslint-disable */
class ConfigPage extends React.Component { class ConfigPage extends React.Component {
static contextType = GlobalContext; static contextType = GlobalContext;

View File

@ -64,6 +64,7 @@ export function getDataSuccess(data, entriesNumber) {
export function onDrop({ dataTransfer: { files } }) { export function onDrop({ dataTransfer: { files } }) {
const formData = Object.keys(files).reduce((acc, current) => { const formData = Object.keys(files).reduce((acc, current) => {
acc.append('files', files[current]); acc.append('files', files[current]);
return acc; return acc;
}, new FormData()); }, new FormData());

View File

@ -28,6 +28,8 @@ import List from '../../components/List';
import PluginInputFile from '../../components/PluginInputFile'; import PluginInputFile from '../../components/PluginInputFile';
import { EntriesWrapper, Wrapper } from './components'; import { EntriesWrapper, Wrapper } from './components';
/* eslint-disable */
import { import {
changeParams, changeParams,
deleteData, deleteData,

View File

@ -2,9 +2,10 @@ import { Map } from 'immutable';
import { isEmpty, get, isObject } from 'lodash'; import { isEmpty, get, isObject } from 'lodash';
import { all, call, fork, put, select, takeLatest } from 'redux-saga/effects'; import { all, call, fork, put, select, takeLatest } from 'redux-saga/effects';
import { request } from 'strapi-helper-plugin'; import { request } from 'strapi-helper-plugin';
import pluginId from '../../pluginId'; import pluginId from '../../pluginId';
/* eslint-disable */
import { import {
deleteSuccess, deleteSuccess,
dropSuccess, dropSuccess,

View File

@ -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/`);
});
});

View File

@ -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/`);
});
});

View File

@ -76,7 +76,7 @@ module.exports = {
S3.upload( S3.upload(
{ {
Key: `${path}${file.hash}${file.ext}`, Key: `${path}${file.hash}${file.ext}`,
Body: new Buffer(file.buffer, 'binary'), Body: Buffer.from(file.buffer, 'binary'),
ACL: 'public-read', ACL: 'public-read',
ContentType: file.mime, ContentType: file.mime,
}, },

View File

@ -4,7 +4,6 @@
"description": "Shared utilities for the Strapi packages", "description": "Shared utilities for the Strapi packages",
"homepage": "http://strapi.io", "homepage": "http://strapi.io",
"keywords": [ "keywords": [
"knex",
"strapi", "strapi",
"utilities", "utilities",
"utils", "utils",
@ -16,7 +15,6 @@
"main": "./lib", "main": "./lib",
"dependencies": { "dependencies": {
"date-fns": "^2.8.1", "date-fns": "^2.8.1",
"knex": "^0.16.5",
"lodash": "^4.17.11", "lodash": "^4.17.11",
"pino": "^4.7.1", "pino": "^4.7.1",
"pluralize": "^7.0.0", "pluralize": "^7.0.0",

View File

@ -4,6 +4,7 @@ const path = require('path');
const fs = require('fs-extra'); const fs = require('fs-extra');
const _ = require('lodash'); const _ = require('lodash');
const { green, yellow } = require('chalk'); const { green, yellow } = require('chalk');
// eslint-disable-next-line node/no-extraneous-require
const strapiAdmin = require('strapi-admin'); const strapiAdmin = require('strapi-admin');
const loadConfigFile = require('../load/load-config-files'); const loadConfigFile = require('../load/load-config-files');
const addSlash = require('../utils/addSlash'); const addSlash = require('../utils/addSlash');

View File

@ -69,7 +69,6 @@ module.exports = async function({ build, watchAdmin }) {
case 'stop': case 'stop':
worker.kill(); worker.kill();
process.exit(1); process.exit(1);
break;
default: default:
return; return;
} }

View File

@ -1,5 +1,3 @@
#!/usr/bin/env node
'use strict'; 'use strict';
/** /**

View File

@ -1,5 +1,3 @@
#!/usr/bin/env node
'use strict'; 'use strict';
/** /**

View File

@ -1,5 +1,3 @@
#!/usr/bin/env node
'use strict'; 'use strict';
/** /**
@ -26,55 +24,113 @@ const logger = require('strapi-utils').logger;
/* eslint-disable prefer-template */ /* eslint-disable prefer-template */
/* eslint-disable no-console */ /* eslint-disable no-console */
module.exports = function () { module.exports = function() {
const HOME = process.env[process.platform === 'win32' ? 'USERPROFILE' : 'HOME']; 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 => { fs.access(
if (err) { path.resolve(HOME, '.strapirc'),
if (err.code === 'ENOENT') { fs.F_OK | fs.R_OK | fs.W_OK,
logger.error('No `.strapirc` file detected at `' + HOME + '`.'); err => {
logger.error('Execute `$ strapi config` to create one.'); if (err) {
} else if (err.code === 'EACCES') { if (err.code === 'ENOENT') {
logger.error('Impossible to access the `.strapirc` file at `' + HOME + '`.'); logger.error('No `.strapirc` file detected at `' + HOME + '`.');
logger.error('Please check read/write permissions before execute `$ strapi update`.'); logger.error('Execute `$ strapi config` to create one.');
} } else if (err.code === 'EACCES') {
process.exit(1); logger.error(
} else { 'Impossible to access the `.strapirc` file at `' + HOME + '`.'
const config = JSON.parse(fs.readFileSync(path.resolve(HOME, '.strapirc'))); );
_.forEach(config.generators, (info, name) => { logger.error(
try { 'Please check read/write permissions before execute `$ strapi update`.'
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) => { process.exit(1);
if (code) { } else {
logger.error('Impossible to update `strapi-generate-' + name + '`.'); const config = JSON.parse(
} else { fs.readFileSync(path.resolve(HOME, '.strapirc'))
logger.info('Successfully updated `strapi-generate-' + name + '`.'); );
} _.forEach(config.generators, (info, name) => {
}); try {
} catch (err) { process.chdir(
process.chdir(path.resolve(__dirname, '..', 'node_modules')); path.resolve(
logger.debug('Cloning the `strapi-generate-' + name + '` repository for the first time...'); __dirname,
shell.exec(`git clone ${info.repository} strapi-generate-${name}`, (code, stdout, stderr) => { '..',
if (code) { 'node_modules',
logger.error('Impossible to clone the `strapi-generate-' + name + '` repository.'); 'strapi-generate-' + name
console.log(stderr); )
} else { );
logger.info('Successfully cloned the `strapi-generate-' + name + '` repository.'); logger.debug(
process.chdir(path.resolve(__dirname, '..', 'node_modules', 'strapi-generate-' + name)); 'Pulling the latest updates of `strapi-generate-' + name + '`.'
logger.debug('Installing dependencies for `strapi-generate-' + name + '`...'); );
shell.exec('npm install', (code, stdout, stderr) => { 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) { 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); console.log(stderr);
} else { } 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 +
'`.'
);
}
});
} }
}); }
} );
}); }
} });
}); }
} }
}); );
}; };

View File

@ -1,5 +1,6 @@
/* eslint-disable no-useless-escape */ /* eslint-disable no-useless-escape */
const path = require('path'); const path = require('path');
// eslint-disable-next-line node/no-extraneous-require
const strapiAdmin = require('strapi-admin'); const strapiAdmin = require('strapi-admin');
const _ = require('lodash'); const _ = require('lodash');

View File

@ -1,4 +1,3 @@
#!/usr/bin/env node
'use strict'; '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. * 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 { 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', { fetch('https://analytics.strapi.io/track', {
method: 'POST', method: 'POST',
body: JSON.stringify({ event: 'didInstallStrapi', deviceId: machineIdSync() }), body: JSON.stringify({
headers: { 'Content-Type': 'application/json' } event: 'didInstallStrapi',
}) deviceId: machineIdSync(),
.catch(() => {}); }),
headers: { 'Content-Type': 'application/json' },
}).catch(() => {});
} }
} catch (e) { } catch (e) {
//... //...
} }

213
yarn.lock
View File

@ -2464,11 +2464,6 @@
resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.18.tgz#6a60435d4663e290f3709898a4f75014f279c4d6" resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.18.tgz#6a60435d4663e290f3709898a4f75014f279c4d6"
integrity sha512-OTPWHmsyW18BhrnG5x8F7PzeZ2nFxmHGb42bZn79P9hl+GI5cMzyPgQTwNjbem0lJhoru/8vtjAFCUOu3+gE2w== 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@*": "@types/body-parser@*":
version "1.17.1" version "1.17.1"
resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.17.1.tgz#18fcf61768fb5c30ccc508c21d6fd2e8b3bf7897" 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" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9"
integrity sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA== 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" version "3.7.0"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.0.tgz#56a6a886e03f6ae577cffedeb524f8f2450293cf" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.0.tgz#56a6a886e03f6ae577cffedeb524f8f2450293cf"
integrity sha512-aBQ1FxIa7kSWCcmKHlcHFlT2jt6J/l4FzC7KcPELkOJOsPOb/bccdhmIrKDfXhwFrmc7vDoDrrepFvGqjyXGJg== 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: bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
version "4.11.8" version "4.11.8"
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" 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" lodash "^4.15.0"
parse5 "^3.0.1" 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: chokidar@^2.0.2, chokidar@^2.1.2, chokidar@^2.1.8:
version "2.1.8" version "2.1.8"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" 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-convert "^1.9.1"
color-string "^1.5.2" color-string "^1.5.2"
colorette@1.0.7: colorette@1.1.0:
version "1.0.7" version "1.1.0"
resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.0.7.tgz#7adf43c445ee63a541b4a4aef7d13f03df1e0cc0" resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.1.0.tgz#1f943e5a357fac10b4e0f5aaef3b14cdc1af6ec7"
integrity sha512-KeK4klsvAgdODAjFPm6QLzvStizJqlxMBtVo4KQMCgk5tt/tf9rAzxmxLHNRynJg3tJjkKGKbHx3j4HLox27Lw== integrity sha512-6S062WDQUXi6hOfkO/sBPVwE5ASXY4G2+b4atvhJfSsuUUhIaUKlkjLe9692Ipyt5/a+IPF5aVTu3V5gvXq5cg==
colors@^1.1.2, colors@^1.3.3: colors@^1.1.2, colors@^1.3.3:
version "1.4.0" 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" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== 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: commander@~2.19.0:
version "2.19.0" version "2.19.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" 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" debug "^2.6.9"
pkg-dir "^2.0.0" 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: eslint-plugin-import@^2.19.1:
version "2.19.1" version "2.19.1"
resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.19.1.tgz#5654e10b7839d064dd0d46cd1b88ec2133a11448" 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" has "^1.0.3"
jsx-ast-utils "^2.2.1" 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: eslint-plugin-react-hooks@^2.0.0:
version "2.1.2" version "2.1.2"
resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-2.1.2.tgz#1358d2acb2c5e02b7e90c37e611ac258a488e3a7" 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: dependencies:
eslint-visitor-keys "^1.0.0" 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: eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0:
version "1.1.0" version "1.1.0"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" 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" text-table "^0.2.0"
v8-compile-cache "^2.0.3" 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: espree@^6.1.1:
version "6.1.1" version "6.1.1"
resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.1.tgz#7f80e5f7257fc47db450022d723e356daeb1e5de" 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" jsonfile "^3.0.0"
universalify "^0.1.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: fs-extra@^7.0.0, fs-extra@^7.0.1:
version "7.0.1" version "7.0.1"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" 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" jsonfile "^4.0.0"
universalify "^0.1.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: fs-minipass@^1.2.5:
version "1.2.7" version "1.2.7"
resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" 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" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.1.tgz#74c64e21df71721845d0c44fe54b7f56b82995a9"
integrity sha512-4FRPXWETxtigtJW/gxzEDsX1LVbPAM93VleB83kZB+ellqbHMkyt2aJfuzNLRvFPnGi6bcE5SvfxgbXPeKteJw== 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: ftp@~0.3.10:
version "0.3.10" version "0.3.10"
resolved "https://registry.yarnpkg.com/ftp/-/ftp-0.3.10.tgz#9197d861ad8142f3e63d5a83bfe4c59f7330885d" 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" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=
getopts@2.2.3: getopts@2.2.5:
version "2.2.3" version "2.2.5"
resolved "https://registry.yarnpkg.com/getopts/-/getopts-2.2.3.tgz#11d229775e2ec2067ed8be6fcc39d9b4bf39cf7d" resolved "https://registry.yarnpkg.com/getopts/-/getopts-2.2.5.tgz#67a0fe471cacb9c687d817cab6450b96dde8313b"
integrity sha512-viEcb8TpgeG05+Nqo5EzZ8QR0hxdyrYDp6ZSTZqe2M/h53Bk036NmqG38Vhf5RGirC/Of9Xql+v66B2gp256SQ== integrity sha512-9jb7AW5p3in+IiJWhQiZmmwkpLaR/ccTWdWQCtZM66HJcHHLegowh4q4tSD7gouUyeNvFWRavfK9GXosQHDpFA==
getos@3.1.0: getos@3.1.0:
version "3.1.0" version "3.1.0"
@ -7958,6 +8015,18 @@ glob@7.1.2:
once "^1.3.0" once "^1.3.0"
path-is-absolute "^1.0.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: glob@^5.0.15:
version "5.0.15" version "5.0.15"
resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
@ -8863,7 +8932,7 @@ inflight@^1.0.4:
once "^1.3.0" once "^1.3.0"
wrappy "1" 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" version "2.0.4"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@ -8924,11 +8993,16 @@ internal-ip@^4.3.0:
default-gateway "^4.2.0" default-gateway "^4.2.0"
ipaddr.js "^1.9.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" version "1.2.0"
resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296"
integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== 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: intl-format-cache@^2.0.5:
version "2.2.9" version "2.2.9"
resolved "https://registry.yarnpkg.com/intl-format-cache/-/intl-format-cache-2.2.9.tgz#fb560de20c549cda20b569cf1ffb6dc62b5b93b4" 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" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
knex@^0.16.5: knex@^0.20.0:
version "0.16.5" version "0.20.8"
resolved "https://registry.yarnpkg.com/knex/-/knex-0.16.5.tgz#8ba3806289a5d543dd42ed21420a31c578476993" resolved "https://registry.yarnpkg.com/knex/-/knex-0.20.8.tgz#b41c72773185e1032f4a77074198413521827860"
integrity sha512-1RVxMU8zGOBqgmXlAvs8vohg9MD14iiRZZPe0IeQXd554n4xxPmoMkbH4hlFeqfM6eOdFE3AVqVSncL3YuocqA== integrity sha512-fLiSg5PIBisORs0M+UGjg2s1P/E1BrYvb/NkSVk6Y90HJujkqLufSC6ag+hDgXqW73mFAF283M6+q3/NW0TrHw==
dependencies: dependencies:
"@babel/polyfill" "^7.4.3" bluebird "^3.7.2"
"@types/bluebird" "^3.5.26" colorette "1.1.0"
bluebird "^3.5.4" commander "^4.1.0"
colorette "1.0.7"
commander "^2.20.0"
debug "4.1.1" debug "4.1.1"
getopts "2.2.3" esm "^3.2.25"
inherits "~2.0.3" getopts "2.2.5"
interpret "^1.2.0" inherits "~2.0.4"
interpret "^2.0.0"
liftoff "3.1.0" liftoff "3.1.0"
lodash "^4.17.11" lodash "^4.17.15"
mkdirp "^0.5.1" mkdirp "^0.5.1"
pg-connection-string "2.0.0" pg-connection-string "2.1.0"
tarn "^1.1.5" tarn "^2.0.0"
tildify "1.2.0" tildify "2.0.0"
uuid "^3.3.2" uuid "^3.3.3"
v8flags "^3.1.2" v8flags "^3.1.3"
koa-body@^4.1.0: koa-body@^4.1.0:
version "4.1.1" 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" resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-0.1.3.tgz#da1847b20940e42ee1492beaf65d49d91b245df7"
integrity sha1-2hhHsglA5C7hSSvq9l1J2RskXfc= integrity sha1-2hhHsglA5C7hSSvq9l1J2RskXfc=
pg-connection-string@2.0.0: pg-connection-string@2.1.0:
version "2.0.0" version "2.1.0"
resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.0.0.tgz#3eefe5997e06d94821e4d502e42b6a1c73f8df82" resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.1.0.tgz#e07258f280476540b24818ebb5dca29e101ca502"
integrity sha1-Pu/lmX4G2Ugh5NUC5CtqHHP434I= integrity sha512-bhlV7Eq09JrRIvo1eKngpwuqKtJnNhZdpdOlvrPrA4dxqXPjxSrbNrfnIDmTpwMyRszrcV4kU5ZA4mMsQUrjdg==
pg-int8@1.0.1: pg-int8@1.0.1:
version "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" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.0.7.tgz#514169d8c7cd0bdbeecc8a2609e34a7163de69f6"
integrity sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA== 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: pidtree@^0.3.0:
version "0.3.0" version "0.3.0"
resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.0.tgz#f6fada10fccc9f99bf50e90d0b23d72c9ebc2e6b" resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.0.tgz#f6fada10fccc9f99bf50e90d0b23d72c9ebc2e6b"
@ -14561,6 +14639,13 @@ readdirp@~3.1.3:
dependencies: dependencies:
picomatch "^2.0.4" 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: realpath-native@^1.1.0:
version "1.1.0" version "1.1.0"
resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" 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" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f"
integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== 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: regexpu-core@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" 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: dependencies:
path-parse "^1.0.6" 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: restore-cursor@^1.0.1:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541"
@ -15112,7 +15209,7 @@ rimraf@2.6.3:
dependencies: dependencies:
glob "^7.1.3" glob "^7.1.3"
rimraf@^3.0.0: rimraf@3.0.0, rimraf@^3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.0.tgz#614176d4b3010b75e5c390eb0ee96f6dc0cebb9b" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.0.tgz#614176d4b3010b75e5c390eb0ee96f6dc0cebb9b"
integrity sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg== 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" safe-buffer "^5.1.2"
yallist "^3.0.3" yallist "^3.0.3"
tarn@^1.1.5: tarn@^2.0.0:
version "1.1.5" version "2.0.0"
resolved "https://registry.yarnpkg.com/tarn/-/tarn-1.1.5.tgz#7be88622e951738b9fa3fb77477309242cdddc2d" resolved "https://registry.yarnpkg.com/tarn/-/tarn-2.0.0.tgz#c68499f69881f99ae955b4317ca7d212d942fdee"
integrity sha512-PMtJ3HCLAZeedWjJPgGnCvcphbCOMbtZpjKgLq3qM5Qq9aQud+XHrL0WlrlgnTyS8U+jrjGbEXprFcQrxPy52g== integrity sha512-7rNMCZd3s9bhQh47ksAQd92ADFcJUjjbyOvyFjNLwTPpGieFHMC84S+LOzw0fx1uh6hnDz/19r8CPMnIjJlMMA==
teeny-request@^3.11.3: teeny-request@^3.11.3:
version "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" resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.0.3.tgz#f5df732453407b09191dae73e2a8cc73f381a826"
integrity sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow== integrity sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==
tildify@1.2.0: tildify@2.0.0:
version "1.2.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" resolved "https://registry.yarnpkg.com/tildify/-/tildify-2.0.0.tgz#f205f3674d677ce698b7067a99e949ce03b4754a"
integrity sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo= integrity sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==
dependencies:
os-homedir "^1.0.0"
timed-out@^4.0.0: timed-out@^4.0.0:
version "4.0.1" 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" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e"
integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==
v8flags@^3.1.2: v8flags@^3.1.3:
version "3.1.3" version "3.1.3"
resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.1.3.tgz#fc9dc23521ca20c5433f81cc4eb9b3033bb105d8" resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.1.3.tgz#fc9dc23521ca20c5433f81cc4eb9b3033bb105d8"
integrity sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w== integrity sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==