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/**
**/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
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 = {
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'),
},
],
};

View File

@ -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
};

View File

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

View File

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

View File

@ -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 }"
}
}
}

View File

@ -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`
:::

View File

@ -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",

View File

@ -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",

View File

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

View File

@ -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"
}

View File

@ -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",

View File

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

View File

@ -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,

View File

@ -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;

View File

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

View File

@ -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
*/

View File

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

View File

@ -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>

View File

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

View File

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

View File

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

View File

@ -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 />;

View File

@ -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}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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}

View File

@ -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'] });
};

View File

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

View File

@ -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>

View File

@ -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 => {

View File

@ -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 };

View File

@ -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>
);

View File

@ -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);

View File

@ -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;

View File

@ -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;
};

View File

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

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';
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];

View File

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

View File

@ -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';

View File

@ -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);

View File

@ -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);

View File

@ -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": {

View File

@ -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"')

View File

@ -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"
},

View File

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

View File

@ -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"
},

View File

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

View File

@ -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

View File

@ -30,6 +30,7 @@ class EditForm extends React.Component {
value: get(this.props.settings, ['providers', current, 'provider']),
};
acc.push(option);
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';
/* 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;

View File

@ -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',

View File

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

View File

@ -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;

View File

@ -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());

View File

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

View File

@ -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,

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(
{
Key: `${path}${file.hash}${file.ext}`,
Body: new Buffer(file.buffer, 'binary'),
Body: Buffer.from(file.buffer, 'binary'),
ACL: 'public-read',
ContentType: file.mime,
},

View File

@ -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",

View File

@ -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');

View File

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

View File

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

View File

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

View File

@ -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 +
'`.'
);
}
});
}
});
}
});
}
});
}
);
}
});
}
}
});
);
};

View File

@ -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');

View File

@ -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
View File

@ -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==