diff --git a/.env b/.env index 505bd28..4a4f4d7 100644 --- a/.env +++ b/.env @@ -11,23 +11,11 @@ # DO NOT DEFINE PRODUCTION SECRETS IN THIS FILE NOR IN ANY OTHER COMMITTED FILES. # # Run "composer dump-env prod" to compile .env files for production use (requires symfony/flex >=1.2). -# https://symfony.com/doc/current/best_practices/configuration.html#infrastructure-related-configuration +# https://symfony.com/doc/current/best_practices.html#use-environment-variables-for-infrastructure-configuration ###> symfony/framework-bundle ### APP_ENV=dev -APP_SECRET=7e6b84f06e903e8d161183763d7a2f8e +APP_SECRET=c782e7f4297b25cf61e55a54a152c9e8 #TRUSTED_PROXIES=127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 -#TRUSTED_HOSTS='^localhost|example\.com$' +#TRUSTED_HOSTS='^(localhost|example\.com)$' ###< symfony/framework-bundle ### - -###> doctrine/doctrine-bundle ### -# Format described at https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url -# For an SQLite database, use: "sqlite:///%kernel.project_dir%/var/data.db" -# For a PostgreSQL database, use: "postgresql://db_user:db_password@127.0.0.1:5432/db_name?serverVersion=11&charset=utf8" -# IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml -DATABASE_URL=mysql://db_user:db_password@127.0.0.1:3306/db_name?serverVersion=5.7 -###< doctrine/doctrine-bundle ### - -###> symfony/mailer ### -# MAILER_DSN=smtp://localhost -###< symfony/mailer ### diff --git a/src/Migrations/.gitignore b/Migrations/.gitignore similarity index 100% rename from src/Migrations/.gitignore rename to Migrations/.gitignore diff --git a/src/Migrations/Version20191227153128.php b/Migrations/Version20200723224647.php similarity index 57% rename from src/Migrations/Version20191227153128.php rename to Migrations/Version20200723224647.php index 7997ef2..bd0e7ec 100644 --- a/src/Migrations/Version20191227153128.php +++ b/Migrations/Version20200723224647.php @@ -10,7 +10,7 @@ /** * Auto-generated Migration: Please modify to your needs! */ -final class Version20191227153128 extends AbstractMigration +final class Version20200723224647 extends AbstractMigration { public function getDescription() : string { @@ -20,16 +20,14 @@ public function getDescription() : string public function up(Schema $schema) : void { // this up() migration is auto-generated, please modify it to your needs - $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); - - $this->addSql('CREATE TABLE todo (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(255) NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB'); + $this->addSql('CREATE TABLE tag (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(255) NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB'); + $this->addSql('CREATE TABLE todo (id INT AUTO_INCREMENT NOT NULL, task VARCHAR(10) NOT NULL, description VARCHAR(500) NOT NULL, UNIQUE INDEX UNIQ_5A0EB6A0527EDB25 (task), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB'); } public function down(Schema $schema) : void { // this down() migration is auto-generated, please modify it to your needs - $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); - + $this->addSql('DROP TABLE tag'); $this->addSql('DROP TABLE todo'); } } diff --git a/src/Migrations/Version20200129191810.php b/Migrations/Version20200723225030.php similarity index 53% rename from src/Migrations/Version20200129191810.php rename to Migrations/Version20200723225030.php index b27835c..6d86f7e 100644 --- a/src/Migrations/Version20200129191810.php +++ b/Migrations/Version20200723225030.php @@ -10,7 +10,7 @@ /** * Auto-generated Migration: Please modify to your needs! */ -final class Version20200129191810 extends AbstractMigration +final class Version20200723225030 extends AbstractMigration { public function getDescription() : string { @@ -20,16 +20,12 @@ public function getDescription() : string public function up(Schema $schema) : void { // this up() migration is auto-generated, please modify it to your needs - $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); - - $this->addSql('ALTER TABLE todo ADD description VARCHAR(500) NOT NULL'); + $this->addSql('CREATE UNIQUE INDEX UNIQ_389B7835E237E06 ON tag (name)'); } public function down(Schema $schema) : void { // this down() migration is auto-generated, please modify it to your needs - $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); - - $this->addSql('ALTER TABLE todo DROP description'); + $this->addSql('DROP INDEX UNIQ_389B7835E237E06 ON tag'); } } diff --git a/assets/js/components/AddTodo.js b/assets/js/components/AddTodo.js new file mode 100644 index 0000000..d22b6e9 --- /dev/null +++ b/assets/js/components/AddTodo.js @@ -0,0 +1,80 @@ +import React, {useContext, useState} from 'react'; +import Grid from '@material-ui/core/Grid'; +import {IconButton, TextField} from '@material-ui/core'; +import Box from '@material-ui/core/Box'; +import {Add as AddIcon} from '@material-ui/icons'; +import {TodoContext} from '../contexts/TodoContext'; + +const AddTodo = () => { + const context = useContext(TodoContext); + + const initialState = { + task: '', + description: '', + }; + + const [state, setState] = useState(initialState); + + const handleChange = (e) => { + setState({ + ...state, + [e.target.name]: e.target.value, + }); + }; + + const onSubmit = (event) => { + if (event !== undefined) event.preventDefault(); + + + context.createTodo(event, state); + + setState(initialState); + }; + + return ( +
+ + + + + + { + if (e.shiftKey && e.key === 'Enter') { + e.preventDefault(); + onSubmit(); + } + }, + }} + /> + + + + + + + + + +
+ ); +}; + +export default AddTodo; \ No newline at end of file diff --git a/assets/js/components/AppSnackbar.js b/assets/js/components/AppSnackbar.js index 9cf195e..5c3ae31 100644 --- a/assets/js/components/AppSnackbar.js +++ b/assets/js/components/AppSnackbar.js @@ -14,7 +14,11 @@ function AppSnackbar(props) { return ( - context.setMessage({})} + context.setMessage({ + text: undefined, + level: level, + })} severity={level === 'success' ? 'success' : 'warning'}>{text} ); diff --git a/assets/js/components/DeleteDialog.js b/assets/js/components/DeleteDialog.js index 95409ee..379584e 100644 --- a/assets/js/components/DeleteDialog.js +++ b/assets/js/components/DeleteDialog.js @@ -22,7 +22,7 @@ function DeleteDialog(props) { - + + + + < IconButton color='inherit' onClick={context.read}> + + + + + + : + <> + + + + < IconButton color='inherit' onClick={context.read}> + + + + } + + + + + ); +}; + +export default AddTag; \ No newline at end of file diff --git a/assets/js/components/tables/tag/DeleteButton.js b/assets/js/components/tables/tag/DeleteButton.js new file mode 100644 index 0000000..b9c87d7 --- /dev/null +++ b/assets/js/components/tables/tag/DeleteButton.js @@ -0,0 +1,32 @@ +//REACT +import React, {useContext} from 'react'; +import PropTypes from 'prop-types'; +//MUI COMPONENTS +import {IconButton} from '@material-ui/core'; +//MUI ICONS +import {Delete as DeleteIcon} from '@material-ui/icons'; +//CONTEXT +import {TagContext} from '../../../contexts/TagContext'; + +const DeleteButton = props => { + const context = useContext(TagContext); + + const onClick = (e) => { + e.preventDefault(); + context.delete(props.entity); + }; + + return ( + + + + ); +}; + +DeleteButton.propTypes = { + entity: PropTypes.shape({ + id: PropTypes.number.isRequired, + }).isRequired, +}; + +export default DeleteButton; \ No newline at end of file diff --git a/assets/js/components/tables/tag/TagTable.js b/assets/js/components/tables/tag/TagTable.js new file mode 100644 index 0000000..8c188b4 --- /dev/null +++ b/assets/js/components/tables/tag/TagTable.js @@ -0,0 +1,111 @@ +//REACT +import React, {useContext, useEffect, useState} from 'react'; +//MUI COMPONENTS +import { + Table, + TableHead, + TableBody, + TableRow, + TableCell, + Typography, + IconButton, + TableContainer, Paper, TextField, useTheme, useMediaQuery, +} from '@material-ui/core'; +//MUI ICONS +import {Edit as EditIcon, Done as DoneIcon, Close as CloseIcon, Refresh as RefreshIcon} from '@material-ui/icons'; +//CONTEXTS +import {TagContext} from '../../../contexts/TagContext'; +//CUSTOM COMPONENTS +import AddTag from './AddTag'; +import DeleteButton from './DeleteButton'; + + +const TagTable = () => { + const context = useContext(TagContext); + const {tags} = context; + + useEffect(() => { + if (!context.tags) context.read(); + }, [context]); + + const initialState = { + tagEditId: null, + tag: null, + }; + const [state, setState] = useState(initialState); + + const setEdit = (tag) => { + setState({ + tagEditId: tag.id ? tag.id : null, + tag: {...tag}, + }); + }; + + const onEditSubmit = (e) => { + e.preventDefault(); + context.update(state.tag); + setState(initialState); + }; + + const onClose = () => { + context.resetTag(state.tag); + setState(initialState); + }; + + + return ( + + + + + + + + + + Tag Name + Actions + + + + {tags && tags.map(tag => ( + + + {state.tagEditId === tag.id ? +
+ context.handleChange(tag, e)}/> + + : + {tag.name} + } +
+ + {state.tagEditId !== tag.id ? + <> + setEdit(tag)}> + + + + + : + <> + + + + + + + + } + +
+ )) + } +
+
+
+ ); +}; + +export default TagTable; \ No newline at end of file diff --git a/assets/js/components/themes/DefaultThemeProvider.js b/assets/js/components/themes/DefaultThemeProvider.js index 4a0eda1..45bb803 100644 --- a/assets/js/components/themes/DefaultThemeProvider.js +++ b/assets/js/components/themes/DefaultThemeProvider.js @@ -7,7 +7,7 @@ import {green, red} from '@material-ui/core/colors'; const theme = createMuiTheme({ palette: { - type: 'dark', + type: 'light', secondary: red, primary: green, }, diff --git a/assets/js/contexts/AlertContext.js b/assets/js/contexts/AlertContext.js new file mode 100644 index 0000000..4e36d31 --- /dev/null +++ b/assets/js/contexts/AlertContext.js @@ -0,0 +1,53 @@ +import React, {Component, createContext} from 'react'; + +export const AlertContext = createContext(); + +class AlertContextProvider extends Component { + constructor(props) { + super(props); + this.state = { + alert: {text: null, level: null}, + open: false, + setAlert: this.setAlert.bind(this), + close: this.close.bind(this), + }; + } + + /** + * if both alert keys are defined: set the alert and open the alert + * if both are undefined or if alert itself is undefined: reset alert back to null on text and level + * @param alert {object} - alert object + * @param alert.text=null {(string|string[])} - string or array of messages, default=null + * @param alert.level=null {string} - use: error | success | warning | info, default=null + */ + setAlert(alert = {text: null, level: null}) { + this.setState({alert: alert, open: true}); + } + + close() { + this.setState({open: false}); + } + + checkAlert(alert) { + switch (alert.level) { + case 'success': + break; + case 'info': + break; + case 'warning': + break; + case 'error': + break; + } + } + + render() { + return ( + + {this.props.children} + + ); + } +} + +export default AlertContextProvider; \ No newline at end of file diff --git a/assets/js/contexts/Providers.js b/assets/js/contexts/Providers.js new file mode 100644 index 0000000..1fb220a --- /dev/null +++ b/assets/js/contexts/Providers.js @@ -0,0 +1,18 @@ +import React from 'react'; +import TodoContextProvider from './TodoContext'; +import TagContextProvider from './TagContext'; +import AlertContextProvider from './AlertContext'; + +const Providers = (props) => { + return ( + + + + {props.children} + + + + ); +}; + +export default Providers; \ No newline at end of file diff --git a/assets/js/contexts/TagContext.js b/assets/js/contexts/TagContext.js new file mode 100644 index 0000000..93263c9 --- /dev/null +++ b/assets/js/contexts/TagContext.js @@ -0,0 +1,268 @@ +//REACT +import React, {createContext} from 'react'; +//AXIOS +import axios from 'axios'; +//CONTEXTS +import {AlertContext} from './AlertContext'; + +export const TagContext = createContext(); + +class TagContextProvider extends React.Component { + constructor(props) { + super(props); + this.state = { + tags: null, + isLoading: false, + message: { + text: null, + level: null, + }, + + read: this.read.bind(this), + create: this.create.bind(this), + delete: this.delete.bind(this), + update: this.update.bind(this), + handleChange: this.handleChange.bind(this), + resetTag: this.resetTag.bind(this), + }; + } + + /** + * Creates a new tag object with a temporary id, puts it in the state, submits the data, check to see if the id + * matches, if it doesn't match replace it + * @param {object} tag - tag + * @param {string} tag.name - name of the tag + */ + async create(tag) { + try { + if (this.state.isLoading) return; + else this.setState({isLoading: true}); + + //PREPARATION START + const initialTags = [...this.state.tags]; + const newTagWithId = {...tag, id: this.findHighestId()}; + this.setState({tags: [...initialTags, newTagWithId], isLoading: true}); + //PREPARATION END + + //REQUEST START + const r = await axios.post('/api/tag/create', tag, {timeout: 5000}); + const {alert, tag: newTagFromServer} = r.data; + this.context.setAlert(alert); + //REQUEST END + + //SERVER SIDE ERROR START + if (alert.level !== 'success') { + this.setState({tags: initialTags, isLoading: false}); + return; + } + //SERVER SIDE ERROR END + + //CHECK IF SERVER DATA MATCHES CLIENT DATA START + if (newTagFromServer.id !== newTagWithId.id) { + const tags = [...this.state.tags]; + let tag = tags.find(tag => tag.id === newTagWithId.id); + tag.id = newTagFromServer.id; + this.setState({tags: tags, isLoading: false}); + } else { + this.setState({isLoading: false}); + } + //CHECK IF SERVER DATA MATCHES CLIENT DATA END + } catch (e) { + //CLIENT SIDE ERROR START + this.context.setAlert({ + text: ['Something went wrong while trying to create a tag', e], + level: 'error', + }); + this.setState({isLoading: false}); + //CLIENT SIDE ERROR END + } + } + + + /** + * Takes an array of tags and finds the highest number of the id's, adds +1 to it and returns that + * @param {[]} [array=this.state.tags] - array of tags + * @returns {number} - new id + */ + findHighestId(array = this.state.tags) { + let max = 0; + for (let i = 0, len = array.length; i < len; i++) { + if (array[i].id > max) max = array[i].id; + } + return max + 1; + } + + /** + * Gets all tags from the database + * @returns {Promise} + */ + async read() { + try { + if (this.state.isLoading) return; + else this.setState({isLoading: true}); + + //REQUEST START + const r = await axios.get('/api/tag/read', {timeout: 5000}); + //REQUEST END + + //HANDLE REQUEST START + this.setState({tags: r.data, isLoading: false}); + //HANDLE REQUEST END + + } catch (e) { + //CLIENT SIDE ERROR START + this.context.setAlert({ + text: ['Something went wrong while trying to get tags from the database.', e], + level: 'error', + }); + this.setState({isLoading: false, tags: []}); + //CLIENT SIDE ERROR END + } + } + + /** + * Updates a tag by replacing the name key of the tag object + * @param {object} originalTag + * @param {number} originalTag.id + * @param {string} originalTag.name + * @returns {Promise} + */ + async update(originalTag) { + try { + if (this.state.isLoading) return; + else this.setState({isLoading: true}); + + //PREPARATION START + const initialTags = [...this.state.tags]; + let newTag = [...initialTags].find(tag => tag.id === originalTag.id); + + if (newTag.name === originalTag.name) { + this.context.setAlert({text: 'There was no change to the tag', level: 'info'}); + this.setState({isLoading: false}); + return; + } + //PREPARATION END + + //REQUEST START + const r = await axios.put('/api/tag/update/' + originalTag.id, newTag, {timeout: 5000}); + const {alert} = r.data; + this.context.setAlert(alert); + //REQUEST END + + //SERVER SIDE ERROR START + if (alert.level !== 'success') { + this.setState({tags: initialTags, isLoading: false}); + } else this.setState({isLoading: false}); + //SERVER SIDE ERROR END + + + } catch (e) { + //CLIENT SIDE ERROR START + this.context.setAlert({ + text: ['Something went wrong while trying to update the tag.', e], + level: 'error', + }); + this.setState({isLoading: false}); + //CLIENT SIDE ERROR END + } + } + + /** + * Removes a tag from the state, in case it could not be removed from the database: undo + * @param {object} tag + * @param {number} tag.id + * @param {string} tag.name + */ + async delete(tag) { + try { + if (this.state.isLoading) return; + else this.setState({isLoading: true}); + + //PREPARATION START + const initialTags = [...this.state.tags]; + const filteredTags = initialTags.filter(initialTag => initialTag.id !== tag.id); + this.setState({ + tags: filteredTags, + isLoading: false, + }); + //PREPARATION END + + //REQUEST START + const r = await axios.delete('/api/tag/delete/' + tag.id, {timeout: 5000}); + const {alert} = r.data; + this.context.setAlert(alert); + //REQUEST END + + //SERVER SIDE ERROR START + if (alert.level !== 'success') { + this.setState({tags: initialTags, isLoading: false}); + } else this.setState({isLoading: false}); + //SERVER SIDE ERROR END + + } catch (e) { + //CLIENT SIDE ERROR START + this.context.setAlert({ + text: ['Something went wrong while trying to delete the tag.', e], + level: 'error', + }); + this.setState({isLoading: false}); + //CLIENT SIDE ERROR END + } + } + + /** + *EDIT TAG HANDLER + * @param {object} oldTag - original tag + * @param {object} e - event + */ + handleChange(oldTag, e) { + //copy state + const tags = [...this.state.tags]; + //find tag + let tag = tags.find(tag => tag.id === oldTag.id); + //replace name with event target value + tag.name = e.target.value; + //overwrite the state + this.setState({ + tags: tags, + }); + } + + /** + * UNDO FUNCTION + * copy tags from state + * find the tag in the copy that matches the oldTag id that came from the state of the table once the user pressed + * on the edit button + * overwrite the name of the tag + * resubmit the tags + * @param {object} oldTag + * @param {number} oldTag.id + * @param {string} oldTag.name + */ + resetTag(oldTag) { + //copy state + const tags = [...this.state.tags]; + //find tag in copy + let tag = tags.find(tag => tag.id === oldTag.id); + //replace new name to the old name + tag.name = oldTag.name; + //overwrite the state + this.setState({ + tags: tags, + }); + } + + render() { + return ( + + {this.props.children} + + ); + } +} + + +TagContextProvider.contextType = AlertContext; +export default TagContextProvider; \ No newline at end of file diff --git a/assets/js/contexts/TodoContext.js b/assets/js/contexts/TodoContext.js index 548fdb1..2dd1249 100644 --- a/assets/js/contexts/TodoContext.js +++ b/assets/js/contexts/TodoContext.js @@ -7,7 +7,7 @@ class TodoContextProvider extends React.Component { constructor(props) { super(props); this.state = { - todos: [], + todos: [], message: {}, }; this.readTodo(); @@ -15,14 +15,13 @@ class TodoContextProvider extends React.Component { //create createTodo(event, todo) { - event.preventDefault(); axios.post('/api/todo/create', todo) .then(response => { if (response.data.message.level === 'success') { let data = [...this.state.todos]; data.push(response.data.todo); this.setState({ - todos: data, + todos: data, message: response.data.message, }); } else { @@ -66,7 +65,7 @@ class TodoContextProvider extends React.Component { todo.description = response.data.todo.description; this.setState({ - todos: todos, + todos: todos, message: response.data.message, }); } @@ -93,8 +92,8 @@ class TodoContextProvider extends React.Component { todos.splice(todos.indexOf(todo), 1); this.setState({ - todos: todos, - message: response.data.message + todos: todos, + message: response.data.message, }); } }).catch(error => { diff --git a/bin/console b/bin/console index 5d5c80f..5de0e1c 100644 --- a/bin/console +++ b/bin/console @@ -6,8 +6,8 @@ use Symfony\Bundle\FrameworkBundle\Console\Application; use Symfony\Component\Console\Input\ArgvInput; use Symfony\Component\ErrorHandler\Debug; -if (false === in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true)) { - echo 'Warning: The console should be invoked via the CLI version of PHP, not the '.\PHP_SAPI.' SAPI'.\PHP_EOL; +if (!in_array(PHP_SAPI, ['cli', 'phpdbg', 'embed'], true)) { + echo 'Warning: The console should be invoked via the CLI version of PHP, not the '.PHP_SAPI.' SAPI'.PHP_EOL; } set_time_limit(0); @@ -15,7 +15,7 @@ set_time_limit(0); require dirname(__DIR__).'/vendor/autoload.php'; if (!class_exists(Application::class)) { - throw new RuntimeException('You need to add "symfony/framework-bundle" as a Composer dependency.'); + throw new LogicException('You need to add "symfony/framework-bundle" as a Composer dependency.'); } $input = new ArgvInput(); diff --git a/composer.lock b/composer.lock index d5e4f3c..ae02a80 100644 --- a/composer.lock +++ b/composer.lock @@ -8,16 +8,16 @@ "packages": [ { "name": "composer/package-versions-deprecated", - "version": "1.8.2", + "version": "1.10.99", "source": { "type": "git", "url": "https://github.com/composer/package-versions-deprecated.git", - "reference": "7a8001fe2c9befad9d001bf54ef0b4a17d950d0f" + "reference": "dd51b4443d58b34b6d9344cf4c288e621c9a826f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/7a8001fe2c9befad9d001bf54ef0b4a17d950d0f", - "reference": "7a8001fe2c9befad9d001bf54ef0b4a17d950d0f", + "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/dd51b4443d58b34b6d9344cf4c288e621c9a826f", + "reference": "dd51b4443d58b34b6d9344cf4c288e621c9a826f", "shasum": "" }, "require": { @@ -25,7 +25,7 @@ "php": "^7" }, "replace": { - "ocramius/package-versions": "1.8.99" + "ocramius/package-versions": "1.10.99" }, "require-dev": { "composer/composer": "^1.9.3 || ^2.0@dev", @@ -59,7 +59,7 @@ } ], "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", - "time": "2020-07-10T14:10:26+00:00" + "time": "2020-07-15T08:39:18+00:00" }, { "name": "doctrine/annotations", @@ -548,35 +548,37 @@ }, { "name": "doctrine/doctrine-migrations-bundle", - "version": "2.1.2", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git", - "reference": "856437e8de96a70233e1f0cc2352fc8dd15a899d" + "reference": "96e730b0ffa0bb39c0f913c1966213f1674bf249" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/856437e8de96a70233e1f0cc2352fc8dd15a899d", - "reference": "856437e8de96a70233e1f0cc2352fc8dd15a899d", + "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/96e730b0ffa0bb39c0f913c1966213f1674bf249", + "reference": "96e730b0ffa0bb39c0f913c1966213f1674bf249", "shasum": "" }, "require": { "doctrine/doctrine-bundle": "~1.0|~2.0", - "doctrine/migrations": "^2.2", - "php": "^7.1", + "doctrine/migrations": "~3.0", + "php": "^7.2", "symfony/framework-bundle": "~3.4|~4.0|~5.0" }, "require-dev": { "doctrine/coding-standard": "^5.0", - "mikey179/vfsstream": "^1.6", - "phpstan/phpstan": "^0.9.2", - "phpstan/phpstan-strict-rules": "^0.9", + "doctrine/orm": "^2.6", + "phpstan/phpstan": "^0.11", + "phpstan/phpstan-deprecation-rules": "^0.11", + "phpstan/phpstan-phpunit": "^0.11", + "phpstan/phpstan-strict-rules": "^0.11", "phpunit/phpunit": "^6.4|^7.0" }, "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "2.1.x-dev" + "dev-master": "3.0.x-dev" } }, "autoload": { @@ -612,7 +614,7 @@ "migrations", "schema" ], - "time": "2019-11-13T12:57:41+00:00" + "time": "2020-06-15T06:04:38+00:00" }, { "name": "doctrine/event-manager", @@ -888,42 +890,45 @@ }, { "name": "doctrine/migrations", - "version": "2.2.1", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/doctrine/migrations.git", - "reference": "a3987131febeb0e9acb3c47ab0df0af004588934" + "reference": "69eaf2ca5bc48357b43ddbdc31ccdffc0e2a0882" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/migrations/zipball/a3987131febeb0e9acb3c47ab0df0af004588934", - "reference": "a3987131febeb0e9acb3c47ab0df0af004588934", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/69eaf2ca5bc48357b43ddbdc31ccdffc0e2a0882", + "reference": "69eaf2ca5bc48357b43ddbdc31ccdffc0e2a0882", "shasum": "" }, "require": { - "doctrine/dbal": "^2.9", + "doctrine/dbal": "^2.10", + "doctrine/event-manager": "^1.0", "ocramius/package-versions": "^1.3", "ocramius/proxy-manager": "^2.0.2", - "php": "^7.1", + "php": "^7.2", + "psr/log": "^1.1.3", "symfony/console": "^3.4||^4.0||^5.0", "symfony/stopwatch": "^3.4||^4.0||^5.0" }, "require-dev": { - "doctrine/coding-standard": "^6.0", + "doctrine/coding-standard": "^7.0", "doctrine/orm": "^2.6", + "doctrine/persistence": "^1.3||^2.0", + "doctrine/sql-formatter": "^1.0", "ext-pdo_sqlite": "*", - "jdorn/sql-formatter": "^1.1", - "mikey179/vfsstream": "^1.6", - "phpstan/phpstan": "^0.10", - "phpstan/phpstan-deprecation-rules": "^0.10", - "phpstan/phpstan-phpunit": "^0.10", - "phpstan/phpstan-strict-rules": "^0.10", - "phpunit/phpunit": "^7.0", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-deprecation-rules": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpstan/phpstan-strict-rules": "^0.12", + "phpstan/phpstan-symfony": "^0.12", + "phpunit/phpunit": "^8.4", "symfony/process": "^3.4||^4.0||^5.0", "symfony/yaml": "^3.4||^4.0||^5.0" }, "suggest": { - "jdorn/sql-formatter": "Allows to generate formatted SQL with the diff command.", + "doctrine/sql-formatter": "Allows to generate formatted SQL with the diff command.", "symfony/yaml": "Allows the use of yaml for migration configuration files." }, "bin": [ @@ -932,7 +937,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.2.x-dev" + "dev-master": "3.0.x-dev" } }, "autoload": { @@ -966,7 +971,7 @@ "migrations", "php" ], - "time": "2019-12-04T06:09:14+00:00" + "time": "2020-06-21T08:55:42+00:00" }, { "name": "doctrine/orm", @@ -3074,16 +3079,16 @@ }, { "name": "symfony/flex", - "version": "v1.8.4", + "version": "v1.9.1", "source": { "type": "git", "url": "https://github.com/symfony/flex.git", - "reference": "7df5a72c7664baab629ec33de7890e9e3996b51b" + "reference": "0e752e47d8382361ca2d7ef016f549828185ddb6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/7df5a72c7664baab629ec33de7890e9e3996b51b", - "reference": "7df5a72c7664baab629ec33de7890e9e3996b51b", + "url": "https://api.github.com/repos/symfony/flex/zipball/0e752e47d8382361ca2d7ef016f549828185ddb6", + "reference": "0e752e47d8382361ca2d7ef016f549828185ddb6", "shasum": "" }, "require": { @@ -3119,7 +3124,7 @@ } ], "description": "Composer plugin for Symfony", - "time": "2020-06-16T23:10:41+00:00" + "time": "2020-07-14T15:18:33+00:00" }, { "name": "symfony/form", @@ -4135,23 +4140,23 @@ }, { "name": "symfony/orm-pack", - "version": "v1.1.0", + "version": "v2.0.0", "source": { "type": "git", "url": "https://github.com/symfony/orm-pack.git", - "reference": "7dd2ed9ba6d7af79f90bdc77522605d40463e533" + "reference": "46aa731f213140388ee11ff3d2b6776a3b4a0d90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/orm-pack/zipball/7dd2ed9ba6d7af79f90bdc77522605d40463e533", - "reference": "7dd2ed9ba6d7af79f90bdc77522605d40463e533", + "url": "https://api.github.com/repos/symfony/orm-pack/zipball/46aa731f213140388ee11ff3d2b6776a3b4a0d90", + "reference": "46aa731f213140388ee11ff3d2b6776a3b4a0d90", "shasum": "" }, "require": { "composer/package-versions-deprecated": "*", - "doctrine/doctrine-bundle": "^2", - "doctrine/doctrine-migrations-bundle": "^2", - "doctrine/orm": "^2" + "doctrine/doctrine-bundle": "*", + "doctrine/doctrine-migrations-bundle": "*", + "doctrine/orm": "*" }, "type": "symfony-pack", "notification-url": "https://packagist.org/downloads/", @@ -4159,20 +4164,20 @@ "MIT" ], "description": "A pack for the Doctrine ORM", - "time": "2020-07-08T14:31:54+00:00" + "time": "2020-07-14T14:34:28+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.17.1", + "version": "v1.18.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "6e4dbcf5e81eba86e36731f94fe56b1726835846" + "reference": "b740103edbdcc39602239ee8860f0f45a8eb9aa5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/6e4dbcf5e81eba86e36731f94fe56b1726835846", - "reference": "6e4dbcf5e81eba86e36731f94fe56b1726835846", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b740103edbdcc39602239ee8860f0f45a8eb9aa5", + "reference": "b740103edbdcc39602239ee8860f0f45a8eb9aa5", "shasum": "" }, "require": { @@ -4184,7 +4189,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.17-dev" + "dev-master": "1.18-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4223,20 +4228,20 @@ "portable", "shim" ], - "time": "2020-06-06T08:46:27+00:00" + "time": "2020-07-14T12:35:20+00:00" }, { "name": "symfony/polyfill-intl-icu", - "version": "v1.17.1", + "version": "v1.18.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-icu.git", - "reference": "7b5e03aeb88cc8b4b2b136e34b0fc0830e86cd4d" + "reference": "4e45a6e39041a9cc78835b11abc47874ae302a55" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/7b5e03aeb88cc8b4b2b136e34b0fc0830e86cd4d", - "reference": "7b5e03aeb88cc8b4b2b136e34b0fc0830e86cd4d", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/4e45a6e39041a9cc78835b11abc47874ae302a55", + "reference": "4e45a6e39041a9cc78835b11abc47874ae302a55", "shasum": "" }, "require": { @@ -4249,7 +4254,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.17-dev" + "dev-master": "1.18-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4285,25 +4290,26 @@ "portable", "shim" ], - "time": "2020-06-06T08:46:27+00:00" + "time": "2020-07-14T12:35:20+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.17.1", + "version": "v1.18.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "a57f8161502549a742a63c09f0a604997bf47027" + "reference": "bc6549d068d0160e0f10f7a5a23c7d1406b95ebe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a57f8161502549a742a63c09f0a604997bf47027", - "reference": "a57f8161502549a742a63c09f0a604997bf47027", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/bc6549d068d0160e0f10f7a5a23c7d1406b95ebe", + "reference": "bc6549d068d0160e0f10f7a5a23c7d1406b95ebe", "shasum": "" }, "require": { "php": ">=5.3.3", - "symfony/polyfill-mbstring": "^1.3", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php70": "^1.10", "symfony/polyfill-php72": "^1.10" }, "suggest": { @@ -4312,7 +4318,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.17-dev" + "dev-master": "1.18-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4336,6 +4342,10 @@ "name": "Laurent Bassin", "email": "laurent@bassin.info" }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" @@ -4351,20 +4361,20 @@ "portable", "shim" ], - "time": "2020-06-06T08:46:27+00:00" + "time": "2020-07-14T12:35:20+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.17.1", + "version": "v1.18.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "40309d1700e8f72447bb9e7b54af756eeea35620" + "reference": "37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/40309d1700e8f72447bb9e7b54af756eeea35620", - "reference": "40309d1700e8f72447bb9e7b54af756eeea35620", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e", + "reference": "37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e", "shasum": "" }, "require": { @@ -4376,7 +4386,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.17-dev" + "dev-master": "1.18-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4418,20 +4428,20 @@ "portable", "shim" ], - "time": "2020-06-14T14:40:37+00:00" + "time": "2020-07-14T12:35:20+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.17.1", + "version": "v1.18.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "7110338d81ce1cbc3e273136e4574663627037a7" + "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/7110338d81ce1cbc3e273136e4574663627037a7", - "reference": "7110338d81ce1cbc3e273136e4574663627037a7", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/a6977d63bf9a0ad4c65cd352709e230876f9904a", + "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a", "shasum": "" }, "require": { @@ -4443,7 +4453,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.17-dev" + "dev-master": "1.18-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4481,20 +4491,20 @@ "portable", "shim" ], - "time": "2020-06-06T08:46:27+00:00" + "time": "2020-07-14T12:35:20+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.17.1", + "version": "v1.18.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "fa0837fe02d617d31fbb25f990655861bb27bd1a" + "reference": "fffa1a52a023e782cdcc221d781fe1ec8f87fcca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fa0837fe02d617d31fbb25f990655861bb27bd1a", - "reference": "fa0837fe02d617d31fbb25f990655861bb27bd1a", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fffa1a52a023e782cdcc221d781fe1ec8f87fcca", + "reference": "fffa1a52a023e782cdcc221d781fe1ec8f87fcca", "shasum": "" }, "require": { @@ -4503,7 +4513,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.17-dev" + "dev-master": "1.18-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4543,20 +4553,20 @@ "portable", "shim" ], - "time": "2020-06-06T08:46:27+00:00" + "time": "2020-07-14T12:35:20+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.17.1", + "version": "v1.18.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "4a5b6bba3259902e386eb80dd1956181ee90b5b2" + "reference": "d87d5766cbf48d72388a9f6b85f280c8ad51f981" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/4a5b6bba3259902e386eb80dd1956181ee90b5b2", - "reference": "4a5b6bba3259902e386eb80dd1956181ee90b5b2", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/d87d5766cbf48d72388a9f6b85f280c8ad51f981", + "reference": "d87d5766cbf48d72388a9f6b85f280c8ad51f981", "shasum": "" }, "require": { @@ -4565,7 +4575,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.17-dev" + "dev-master": "1.18-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4609,7 +4619,7 @@ "portable", "shim" ], - "time": "2020-06-06T08:46:27+00:00" + "time": "2020-07-14T12:35:20+00:00" }, { "name": "symfony/process", @@ -6812,16 +6822,16 @@ }, { "name": "symfony/maker-bundle", - "version": "v1.19.1", + "version": "v1.20.0", "source": { "type": "git", "url": "https://github.com/symfony/maker-bundle.git", - "reference": "51c48ca9df84c16ed522a7781866900edf7c99f8" + "reference": "b048c7b2be5bce9024ae3b0db97d44a107029c27" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/51c48ca9df84c16ed522a7781866900edf7c99f8", - "reference": "51c48ca9df84c16ed522a7781866900edf7c99f8", + "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/b048c7b2be5bce9024ae3b0db97d44a107029c27", + "reference": "b048c7b2be5bce9024ae3b0db97d44a107029c27", "shasum": "" }, "require": { @@ -6837,6 +6847,7 @@ "symfony/http-kernel": "^3.4|^4.0|^5.0" }, "require-dev": { + "composer/semver": "^3.0@dev", "doctrine/doctrine-bundle": "^1.8|^2.0", "doctrine/orm": "^2.3", "friendsofphp/php-cs-fixer": "^2.8", @@ -6876,7 +6887,7 @@ "scaffold", "scaffolding" ], - "time": "2020-07-06T00:27:41+00:00" + "time": "2020-07-14T11:22:04+00:00" }, { "name": "symfony/phpunit-bridge", diff --git a/config/bootstrap.php b/config/bootstrap.php index 976a776..55560fb 100644 --- a/config/bootstrap.php +++ b/config/bootstrap.php @@ -4,14 +4,14 @@ require dirname(__DIR__).'/vendor/autoload.php'; +if (!class_exists(Dotenv::class)) { + throw new LogicException('Please run "composer require symfony/dotenv" to load the ".env" files configuring the application.'); +} + // Load cached env vars if the .env.local.php file exists // Run "composer dump-env prod" to create it (requires symfony/flex >=1.2) -if (is_array($env = @include dirname(__DIR__).'/.env.local.php') && ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? $env['APP_ENV']) === $env['APP_ENV']) { - foreach ($env as $k => $v) { - $_ENV[$k] = $_ENV[$k] ?? (isset($_SERVER[$k]) && 0 !== strpos($k, 'HTTP_') ? $_SERVER[$k] : $v); - } -} elseif (!class_exists(Dotenv::class)) { - throw new RuntimeException('Please run "composer require symfony/dotenv" to load the ".env" files configuring the application.'); +if (is_array($env = @include dirname(__DIR__).'/.env.local.php') && (!isset($env['APP_ENV']) || ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? $env['APP_ENV']) === $env['APP_ENV'])) { + (new Dotenv(false))->populate($env); } else { // load all the .env files (new Dotenv(false))->loadEnv(dirname(__DIR__).'/.env'); diff --git a/config/packages/doctrine_migrations.yaml b/config/packages/doctrine_migrations.yaml index 3bf0fbc..bfb1a82 100644 --- a/config/packages/doctrine_migrations.yaml +++ b/config/packages/doctrine_migrations.yaml @@ -1,5 +1,3 @@ doctrine_migrations: - dir_name: '%kernel.project_dir%/src/Migrations' - # namespace is arbitrary but should be different from App\Migrations - # as migrations classes should NOT be autoloaded - namespace: DoctrineMigrations + migrations_paths: + 'DoctrineMigrations': '%kernel.project_dir%/Migrations' \ No newline at end of file diff --git a/config/packages/framework.yaml b/config/packages/framework.yaml index 6089f4b..cad7f78 100644 --- a/config/packages/framework.yaml +++ b/config/packages/framework.yaml @@ -1,3 +1,4 @@ +# see https://symfony.com/doc/current/reference/configuration/framework.html framework: secret: '%env(APP_SECRET)%' #csrf_protection: true diff --git a/config/packages/prod/deprecations.yaml b/config/packages/prod/deprecations.yaml new file mode 100644 index 0000000..920a061 --- /dev/null +++ b/config/packages/prod/deprecations.yaml @@ -0,0 +1,8 @@ +# As of Symfony 5.1, deprecations are logged in the dedicated "deprecation" channel when it exists +#monolog: +# channels: [deprecation] +# handlers: +# deprecation: +# type: stream +# channels: [deprecation] +# path: "%kernel.logs_dir%/%kernel.environment%.deprecations.log" diff --git a/config/packages/prod/monolog.yaml b/config/packages/prod/monolog.yaml index 5bcdf06..bfe69c0 100644 --- a/config/packages/prod/monolog.yaml +++ b/config/packages/prod/monolog.yaml @@ -5,6 +5,7 @@ monolog: action_level: error handler: nested excluded_http_codes: [404, 405] + buffer_size: 50 # How many messages should be saved? Prevent memory leaks nested: type: stream path: "%kernel.logs_dir%/%kernel.environment%.log" @@ -13,11 +14,3 @@ monolog: type: console process_psr_3_messages: false channels: ["!event", "!doctrine"] - deprecation: - type: stream - path: "%kernel.logs_dir%/%kernel.environment%.deprecations.log" - deprecation_filter: - type: filter - handler: deprecation - max_level: info - channels: ["php"] diff --git a/config/packages/routing.yaml b/config/packages/routing.yaml index 7e97762..b45c1ce 100644 --- a/config/packages/routing.yaml +++ b/config/packages/routing.yaml @@ -1,3 +1,7 @@ framework: router: utf8: true + + # Configure how to generate URLs in non-HTTP contexts, such as CLI commands. + # See https://symfony.com/doc/current/routing.html#generating-urls-in-commands + #default_uri: http://localhost diff --git a/config/packages/security.yaml b/config/packages/security.yaml index ce69ba7..811681e 100644 --- a/config/packages/security.yaml +++ b/config/packages/security.yaml @@ -1,13 +1,14 @@ security: # https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers providers: - in_memory: { memory: null } + users_in_memory: { memory: null } firewalls: dev: pattern: ^/(_(profiler|wdt)|css|images|js)/ security: false main: anonymous: lazy + provider: users_in_memory # activate different ways to authenticate # https://symfony.com/doc/current/security.html#firewalls-authentication diff --git a/config/packages/test/monolog.yaml b/config/packages/test/monolog.yaml index 2762653..fc40641 100644 --- a/config/packages/test/monolog.yaml +++ b/config/packages/test/monolog.yaml @@ -1,7 +1,12 @@ monolog: handlers: main: + type: fingers_crossed + action_level: error + handler: nested + excluded_http_codes: [404, 405] + channels: ["!event"] + nested: type: stream path: "%kernel.logs_dir%/%kernel.environment%.log" level: debug - channels: ["!event"] diff --git a/config/routes/annotations.yaml b/config/routes/annotations.yaml index d49a502..e92efc5 100644 --- a/config/routes/annotations.yaml +++ b/config/routes/annotations.yaml @@ -1,3 +1,7 @@ controllers: resource: ../../src/Controller/ type: annotation + +kernel: + resource: ../../src/Kernel.php + type: annotation diff --git a/config/services.yaml b/config/services.yaml index 5c4b417..791fd32 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -4,6 +4,8 @@ # Put parameters here that don't need to change on each machine where the app is deployed # https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration parameters: + container.dumper.inline_factories: true + container.dumper.inline_class_loader: true services: # default configuration for services in *this* file @@ -15,7 +17,7 @@ services: # this creates a service per class whose id is the fully-qualified class name App\: resource: '../src/*' - exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}' + exclude: '../src/{DependencyInjection,Entity,Tests,Kernel.php}' # controllers are imported separately to make sure services can be injected # as action arguments even if you don't extend any base controller class diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 5b7c820..d81f0c3 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -5,7 +5,7 @@ xsi:noNamespaceSchemaLocation="bin/.phpunit/phpunit.xsd" backupGlobals="false" colors="true" - bootstrap="config/bootstrap.php" + bootstrap="tests/bootstrap.php" > @@ -22,8 +22,8 @@ - - src + + src diff --git a/public/index.php b/public/index.php index f094a9b..0e30370 100644 --- a/public/index.php +++ b/public/index.php @@ -12,11 +12,11 @@ Debug::enable(); } -if ($trustedProxies = $_SERVER['TRUSTED_PROXIES'] ?? $_ENV['TRUSTED_PROXIES'] ?? false) { +if ($trustedProxies = $_SERVER['TRUSTED_PROXIES'] ?? false) { Request::setTrustedProxies(explode(',', $trustedProxies), Request::HEADER_X_FORWARDED_ALL ^ Request::HEADER_X_FORWARDED_HOST); } -if ($trustedHosts = $_SERVER['TRUSTED_HOSTS'] ?? $_ENV['TRUSTED_HOSTS'] ?? false) { +if ($trustedHosts = $_SERVER['TRUSTED_HOSTS'] ?? false) { Request::setTrustedHosts([$trustedHosts]); } diff --git a/src/Controller/IndexController.php b/src/Controller/IndexController.php index dd5aaa0..713c65c 100644 --- a/src/Controller/IndexController.php +++ b/src/Controller/IndexController.php @@ -8,7 +8,7 @@ class IndexController extends AbstractController { /** - * @Route("/{reactRouting}", name="index", priority="-1", defaults={"reactRouting": null}, requirements={"reactRouting"=".+"}) + * @Route("/{react}", name="index", priority="-1", requirements={"react"=".*"}) */ public function index() { diff --git a/src/Controller/TagController.php b/src/Controller/TagController.php new file mode 100644 index 0000000..d5f0bce --- /dev/null +++ b/src/Controller/TagController.php @@ -0,0 +1,154 @@ +tagRepository = $tagRepository; + $this->entityManager = $entityManager; + $this->validator = $validator; + } + + /** + * @Route("/read", name="api_tag_read", methods={"GET"}) + */ + public function read() + { + $oldTags = $this->tagRepository->findAll(); + $newTags = []; + + foreach ($oldTags as $tag) { + $newTags[] = $tag->normalize(); + } + return $this->json($newTags); + } + + /** + * @Route("/create", name="api_tag_create", methods={"POST"}) + * @param Request $request + * @return JsonResponse + */ + public function create(Request $request) + { + $content = json_decode($request->getContent()); + + $tag = new Tag(); + $tag->setName($content->name); + + $errors = $this->validator->validate($tag); + + if (sizeof($errors) > 0) { + return $this->json([ + 'alert' => [ + 'text' => $errors, + 'level' => 'warning' + ] + ]); + } else { + $this->entityManager->persist($tag); + $this->entityManager->flush(); + + return $this->json([ + 'tag' => $tag->normalize(), + 'alert' => [ + 'text' => ['Tag has been created!', 'Tag name: ' . $content->name], + 'level' => 'success' + ] + ]); + } + } + + /** + * @Route("/update/{id}", name="api_tag_update", methods={"PUT"}) + * @param Request $request + * @param Tag $tag + * @return JsonResponse + */ + public + function update(Request $request, Tag $tag) + { + $content = json_decode($request->getContent()); + + $newName = $content->name; + $oldName = $tag->getName(); + + $tag->setName($newName); + + $errors = $this->validator->validate($tag); + + if (sizeof($errors) > 0) { + return $this->json([ + 'alert' => [ + 'text' => $errors, + 'level' => 'error' + ] + ]); + } else { + $this->entityManager->flush(); + return $this->json([ + 'alert' => [ + 'text' => ['Tag has been updated!', 'From: ' . $oldName, 'To: ' . $newName], + 'level' => 'success', + ] + ]); + } + } + + /** + * @Route("/delete/{id}", name="api_tag_delete", methods={"DELETE"}) + * @param Tag $tag + * @return JsonResponse + */ + public + function delete(Tag $tag) + { + $errors = $this->validator->validate($tag); + if (sizeof($errors) > 0) { + return $this->json([ + 'alert' => [ + 'text' => $errors, + 'level' => 'error' + ] + ]); + } + + $this->entityManager->remove($tag); + $this->entityManager->flush(); + + return $this->json([ + 'alert' => [ + 'text' => ['Tag has been deleted!', 'Tag that got deleted: ' . $tag->getName()], + 'level' => 'success' + ] + ]); + } +} diff --git a/src/Entity/Tag.php b/src/Entity/Tag.php new file mode 100644 index 0000000..7c935a0 --- /dev/null +++ b/src/Entity/Tag.php @@ -0,0 +1,66 @@ +id; + } + + public function getName(): ?string + { + return $this->name; + } + + public function setName(string $name): self + { + $this->name = $name; + + return $this; + } + + public function normalize() + { + $encoders = [new JsonEncoder()]; + $normalizers = [new ObjectNormalizer()]; + + $serializer = new Serializer($normalizers, $encoders); + + return $serializer->normalize($this, 'json'); + } + +} diff --git a/src/Migrations/Version20200213211755.php b/src/Migrations/Version20200213211755.php deleted file mode 100644 index cb10d37..0000000 --- a/src/Migrations/Version20200213211755.php +++ /dev/null @@ -1,37 +0,0 @@ -abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); - - $this->addSql('ALTER TABLE todo ADD task VARCHAR(10) NOT NULL, DROP name'); - $this->addSql('CREATE UNIQUE INDEX UNIQ_5A0EB6A0527EDB25 ON todo (task)'); - } - - public function down(Schema $schema) : void - { - // this down() migration is auto-generated, please modify it to your needs - $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); - - $this->addSql('DROP INDEX UNIQ_5A0EB6A0527EDB25 ON todo'); - $this->addSql('ALTER TABLE todo ADD name VARCHAR(255) CHARACTER SET utf8mb4 NOT NULL COLLATE `utf8mb4_unicode_ci`, DROP task'); - } -} diff --git a/src/Repository/TagRepository.php b/src/Repository/TagRepository.php new file mode 100644 index 0000000..4d20818 --- /dev/null +++ b/src/Repository/TagRepository.php @@ -0,0 +1,50 @@ +createQueryBuilder('t') + ->andWhere('t.exampleField = :val') + ->setParameter('val', $value) + ->orderBy('t.id', 'ASC') + ->setMaxResults(10) + ->getQuery() + ->getResult() + ; + } + */ + + /* + public function findOneBySomeField($value): ?Tag + { + return $this->createQueryBuilder('t') + ->andWhere('t.exampleField = :val') + ->setParameter('val', $value) + ->getQuery() + ->getOneOrNullResult() + ; + } + */ +} diff --git a/src/Service/CustomValidator.php b/src/Service/CustomValidator.php new file mode 100644 index 0000000..62d695a --- /dev/null +++ b/src/Service/CustomValidator.php @@ -0,0 +1,42 @@ +validator = $validator; + } + + /** + * @param Tag $tag + * @param bool $listAllErrors set this to true to export an array of all errors instead of just the first error + * @return array + */ + public function validate(Tag $tag, bool $listAllErrors = false): array + { + $validatorErrors = $this->validator->validate($tag); + + $errors = []; + if (sizeof($validatorErrors) > 0) { + + if ($listAllErrors) { + foreach ($validatorErrors as $validatorError) { + $errors[] = $validatorError->getMessage(); + } + } else { + $errors[] = $validatorErrors[0]->getMessage(); + } + } + return $errors; + } +} \ No newline at end of file diff --git a/symfony.lock b/symfony.lock index f7a36fc..c67f7da 100644 --- a/symfony.lock +++ b/symfony.lock @@ -1,27 +1,30 @@ { + "composer/package-versions-deprecated": { + "version": "1.10.99" + }, "doctrine/annotations": { "version": "1.0", "recipe": { "repo": "github.com/symfony/recipes", "branch": "master", "version": "1.0", - "ref": "cb4152ebcadbe620ea2261da1a1c5a9b8cea7672" + "ref": "a2759dd6123694c8d901d0ec80006e044c2e6457" }, "files": [ "./config/routes/annotations.yaml" ] }, "doctrine/cache": { - "version": "1.10.0" + "version": "1.10.2" }, "doctrine/collections": { - "version": "1.6.4" + "version": "1.6.6" }, "doctrine/common": { - "version": "v2.11.0" + "version": "2.13.3" }, "doctrine/dbal": { - "version": "v2.10.0" + "version": "2.10.2" }, "doctrine/doctrine-bundle": { "version": "2.0", @@ -39,41 +42,44 @@ ] }, "doctrine/doctrine-migrations-bundle": { - "version": "1.2", + "version": "2.2", "recipe": { "repo": "github.com/symfony/recipes", "branch": "master", - "version": "1.2", - "ref": "c1431086fec31f17fbcfe6d6d7e92059458facc1" + "version": "2.2", + "ref": "baaa439e3e3179e69e3da84b671f0a3e4a2f56ad" }, "files": [ "./config/packages/doctrine_migrations.yaml", - "./src/Migrations/.gitignore" + "./migrations/.gitignore" ] }, "doctrine/event-manager": { "version": "1.1.0" }, "doctrine/inflector": { - "version": "1.3.1" + "version": "1.4.3" }, "doctrine/instantiator": { - "version": "1.3.0" + "version": "1.3.1" }, "doctrine/lexer": { - "version": "1.2.0" + "version": "1.2.1" }, "doctrine/migrations": { - "version": "2.2.0" + "version": "3.0.1" }, "doctrine/orm": { - "version": "v2.7.0" + "version": "v2.7.3" }, "doctrine/persistence": { - "version": "1.3.3" + "version": "1.3.7" }, "doctrine/reflection": { - "version": "v1.0.0" + "version": "1.2.1" + }, + "doctrine/sql-formatter": { + "version": "1.1.0" }, "easycorp/easy-log-handler": { "version": "1.0", @@ -88,34 +94,43 @@ ] }, "egulias/email-validator": { - "version": "2.1.11" + "version": "2.1.18" }, "jdorn/sql-formatter": { "version": "v1.2.17" }, + "laminas/laminas-code": { + "version": "3.4.1" + }, + "laminas/laminas-eventmanager": { + "version": "3.2.1" + }, + "laminas/laminas-zendframework-bridge": { + "version": "1.0.4" + }, "monolog/monolog": { - "version": "2.0.1" + "version": "2.1.0" }, "nikic/php-parser": { - "version": "v4.3.0" + "version": "v4.6.0" }, "ocramius/package-versions": { "version": "1.5.1" }, "ocramius/proxy-manager": { - "version": "2.2.3" + "version": "2.8.0" }, "php": { "version": "7.4" }, "phpdocumentor/reflection-common": { - "version": "2.0.0" + "version": "2.2.0" }, "phpdocumentor/reflection-docblock": { - "version": "4.3.2" + "version": "5.1.0" }, "phpdocumentor/type-resolver": { - "version": "1.0.1" + "version": "1.3.0" }, "psr/cache": { "version": "1.0.1" @@ -130,7 +145,7 @@ "version": "1.0.0" }, "psr/log": { - "version": "1.1.2" + "version": "1.1.3" }, "sensio/framework-extra-bundle": { "version": "5.2", @@ -145,19 +160,19 @@ ] }, "symfony/asset": { - "version": "v5.0.1" + "version": "v5.0.10" }, "symfony/browser-kit": { - "version": "v5.0.1" + "version": "v5.1.2" }, "symfony/cache": { - "version": "v5.0.1" + "version": "v5.1.2" }, "symfony/cache-contracts": { - "version": "v2.0.1" + "version": "v2.1.3" }, "symfony/config": { - "version": "v5.0.1" + "version": "v5.1.2" }, "symfony/console": { "version": "4.4", @@ -165,7 +180,7 @@ "repo": "github.com/symfony/recipes", "branch": "master", "version": "4.4", - "ref": "fead3ab2e80622c61d13dac0d21a3430a45efae8" + "ref": "ea8c0eda34fda57e7d5cd8cbd889e2a387e3472c" }, "files": [ "./bin/console", @@ -173,7 +188,7 @@ ] }, "symfony/css-selector": { - "version": "v5.0.1" + "version": "v5.1.2" }, "symfony/debug-bundle": { "version": "4.1", @@ -188,40 +203,40 @@ ] }, "symfony/debug-pack": { - "version": "v1.0.7" + "version": "v1.0.8" }, "symfony/dependency-injection": { - "version": "v5.0.1" + "version": "v5.1.2" }, "symfony/deprecation-contracts": { "version": "v2.1.3" }, "symfony/doctrine-bridge": { - "version": "v5.0.1" + "version": "v5.0.10" }, "symfony/dom-crawler": { - "version": "v5.0.1" + "version": "v5.1.2" }, "symfony/dotenv": { - "version": "v5.0.1" + "version": "v5.0.10" }, - "symfony/error-handler": { - "version": "v5.0.1" + "symfony/errors-handler": { + "version": "v5.1.2" }, "symfony/event-dispatcher": { - "version": "v5.0.1" + "version": "v5.1.2" }, "symfony/event-dispatcher-contracts": { - "version": "v2.0.1" + "version": "v2.1.3" }, "symfony/expression-language": { - "version": "v5.0.1" + "version": "v5.0.10" }, "symfony/filesystem": { - "version": "v5.0.1" + "version": "v5.1.2" }, "symfony/finder": { - "version": "v5.0.1" + "version": "v5.1.2" }, "symfony/flex": { "version": "1.0", @@ -229,14 +244,14 @@ "repo": "github.com/symfony/recipes", "branch": "master", "version": "1.0", - "ref": "19fa03bacd9a6619583d1e4939da4388df22984d" + "ref": "c0eeb50665f0f77226616b6038a9b06c03752d8e" }, "files": [ "./.env" ] }, "symfony/form": { - "version": "v5.0.1" + "version": "v5.0.10" }, "symfony/framework-bundle": { "version": "4.4", @@ -244,7 +259,7 @@ "repo": "github.com/symfony/recipes", "branch": "master", "version": "4.4", - "ref": "23ecaccc551fe2f74baf613811ae529eb07762fa" + "ref": "36d3075b2b8e0c4de0e82356a86e4c4a4eb6681b" }, "files": [ "./config/bootstrap.php", @@ -259,22 +274,22 @@ ] }, "symfony/http-client": { - "version": "v5.0.1" + "version": "v5.0.10" }, "symfony/http-client-contracts": { - "version": "v2.0.1" + "version": "v2.1.3" }, "symfony/http-foundation": { - "version": "v5.0.1" + "version": "v5.1.2" }, "symfony/http-kernel": { - "version": "v5.0.1" + "version": "v5.1.2" }, "symfony/inflector": { - "version": "v5.0.1" + "version": "v5.0.10" }, "symfony/intl": { - "version": "v5.0.1" + "version": "v5.0.10" }, "symfony/mailer": { "version": "4.3", @@ -298,10 +313,10 @@ } }, "symfony/mime": { - "version": "v5.0.1" + "version": "v5.1.2" }, "symfony/monolog-bridge": { - "version": "v5.0.1" + "version": "v5.1.2" }, "symfony/monolog-bundle": { "version": "3.3", @@ -309,10 +324,11 @@ "repo": "github.com/symfony/recipes", "branch": "master", "version": "3.3", - "ref": "6240c6d43e8237a32452f057f81816820fd56ab6" + "ref": "d7249f7d560f6736115eee1851d02a65826f0a56" }, "files": [ "./config/packages/dev/monolog.yaml", + "./config/packages/prod/deprecations.yaml", "./config/packages/prod/monolog.yaml", "./config/packages/test/monolog.yaml" ] @@ -330,10 +346,10 @@ ] }, "symfony/options-resolver": { - "version": "v5.0.1" + "version": "v5.1.2" }, "symfony/orm-pack": { - "version": "v1.0.7" + "version": "v2.0.0" }, "symfony/phpunit-bridge": { "version": "4.3", @@ -341,53 +357,55 @@ "repo": "github.com/symfony/recipes", "branch": "master", "version": "4.3", - "ref": "170be6250b77b421f02e986e2853df86c7bd6516" + "ref": "6d0e35f749d5f4bfe1f011762875275cd3f9874f" }, "files": [ "./.env.test", "./bin/phpunit", - "./config/bootstrap.php", "./phpunit.xml.dist", - "./tests/.gitignore" + "./tests/bootstrap.php" ] }, "symfony/polyfill-intl-grapheme": { - "version": "v1.13.1" + "version": "v1.18.0" }, "symfony/polyfill-intl-icu": { - "version": "v1.13.1" + "version": "v1.18.0" }, "symfony/polyfill-intl-idn": { - "version": "v1.13.1" + "version": "v1.18.0" }, "symfony/polyfill-intl-normalizer": { - "version": "v1.13.1" + "version": "v1.18.0" }, "symfony/polyfill-mbstring": { - "version": "v1.13.1" + "version": "v1.18.0" }, "symfony/polyfill-php73": { - "version": "v1.13.1" + "version": "v1.18.0" + }, + "symfony/polyfill-php80": { + "version": "v1.18.0" }, "symfony/process": { - "version": "v5.0.1" + "version": "v5.0.10" }, "symfony/profiler-pack": { "version": "v1.0.4" }, "symfony/property-access": { - "version": "v5.0.1" + "version": "v5.0.10" }, "symfony/property-info": { - "version": "v5.0.1" + "version": "v5.0.10" }, "symfony/routing": { - "version": "4.2", + "version": "5.1", "recipe": { "repo": "github.com/symfony/recipes", "branch": "master", - "version": "4.2", - "ref": "683dcb08707ba8d41b7e34adb0344bfd68d248a7" + "version": "5.1", + "ref": "b4f3e7c95e38b606eef467e8a42a8408fc460c43" }, "files": [ "./config/packages/prod/routing.yaml", @@ -401,38 +419,38 @@ "repo": "github.com/symfony/recipes", "branch": "master", "version": "4.4", - "ref": "30efd98dd3b4ead6e9ad4713b1efc43bbe94bf77" + "ref": "7b4408dc203049666fe23fabed23cbadc6d8440f" }, "files": [ "./config/packages/security.yaml" ] }, "symfony/security-core": { - "version": "v5.0.1" + "version": "v5.1.2" }, "symfony/security-csrf": { - "version": "v5.0.1" + "version": "v5.1.2" }, "symfony/security-guard": { - "version": "v5.0.1" + "version": "v5.1.2" }, "symfony/security-http": { - "version": "v5.0.1" + "version": "v5.1.2" }, "symfony/serializer": { - "version": "v5.0.1" + "version": "v5.1.2" }, "symfony/serializer-pack": { - "version": "v1.0.2" + "version": "v1.0.3" }, "symfony/service-contracts": { - "version": "v2.0.1" + "version": "v2.1.3" }, "symfony/stopwatch": { - "version": "v5.0.1" + "version": "v5.1.2" }, "symfony/string": { - "version": "v5.0.1" + "version": "v5.0.10" }, "symfony/test-pack": { "version": "v1.0.6" @@ -451,10 +469,10 @@ ] }, "symfony/translation-contracts": { - "version": "v2.0.1" + "version": "v2.1.3" }, "symfony/twig-bridge": { - "version": "v5.0.1" + "version": "v5.0.10" }, "symfony/twig-bundle": { "version": "5.0", @@ -487,13 +505,13 @@ ] }, "symfony/var-dumper": { - "version": "v5.0.1" + "version": "v5.1.2" }, "symfony/var-exporter": { - "version": "v5.0.1" + "version": "v5.1.2" }, "symfony/web-link": { - "version": "v5.0.1" + "version": "v5.0.10" }, "symfony/web-profiler-bundle": { "version": "3.3", @@ -529,16 +547,19 @@ ] }, "symfony/yaml": { - "version": "v5.0.1" + "version": "v5.0.10" }, "twig/extra-bundle": { - "version": "v3.0.0" + "version": "v3.0.4" }, "twig/twig": { - "version": "v3.0.0" + "version": "v3.0.4" + }, + "webimpress/safe-writer": { + "version": "2.0.1" }, "webmozart/assert": { - "version": "1.6.0" + "version": "1.9.1" }, "zendframework/zend-code": { "version": "3.4.1" diff --git a/tests/bootstrap.php b/tests/bootstrap.php new file mode 100644 index 0000000..469dcce --- /dev/null +++ b/tests/bootstrap.php @@ -0,0 +1,11 @@ +bootEnv(dirname(__DIR__).'/.env'); +} diff --git a/yarn.lock b/yarn.lock index 773ea3f..3e1a11e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10,44 +10,43 @@ "@babel/highlight" "^7.10.4" "@babel/compat-data@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.10.4.tgz#706a6484ee6f910b719b696a9194f8da7d7ac241" - integrity sha512-t+rjExOrSVvjQQXNp5zAIYDp00KjdvGl/TpDX5REPr0S9IAIPQMTilcfG6q8c0QFmj9lSTVySV2VTsyggvtNIw== + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.10.5.tgz#d38425e67ea96b1480a3f50404d1bf85676301a6" + integrity sha512-mPVoWNzIpYJHbWje0if7Ck36bpbtTvIxOi9+6WSK9wjGEXearAqlwBoTQvVjsAY2VIwgcs8V940geY3okzRCEw== dependencies: browserslist "^4.12.0" invariant "^2.2.4" semver "^5.5.0" "@babel/core@^7.4.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.10.4.tgz#780e8b83e496152f8dd7df63892b2e052bf1d51d" - integrity sha512-3A0tS0HWpy4XujGc7QtOIHTeNwUgWaZc/WuS5YQrfhU67jnVmsD6OGPc1AKHH0LJHQICGncy3+YUjIhVlfDdcA== + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.10.5.tgz#1f15e2cca8ad9a1d78a38ddba612f5e7cdbbd330" + integrity sha512-O34LQooYVDXPl7QWCdW9p4NR+QlzOr7xShPPJz8GsuCU3/8ua/wqTr7gmnxXv+WBESiGU/G5s16i6tUvHkNb+w== dependencies: "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.10.4" - "@babel/helper-module-transforms" "^7.10.4" + "@babel/generator" "^7.10.5" + "@babel/helper-module-transforms" "^7.10.5" "@babel/helpers" "^7.10.4" - "@babel/parser" "^7.10.4" + "@babel/parser" "^7.10.5" "@babel/template" "^7.10.4" - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/traverse" "^7.10.5" + "@babel/types" "^7.10.5" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.1" json5 "^2.1.2" - lodash "^4.17.13" + lodash "^4.17.19" resolve "^1.3.2" semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.4.tgz#e49eeed9fe114b62fa5b181856a43a5e32f5f243" - integrity sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng== +"@babel/generator@^7.10.5": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.5.tgz#1b903554bc8c583ee8d25f1e8969732e6b829a69" + integrity sha512-3vXxr3FEW7E7lJZiWQ3bM4+v/Vyr9C+hpolQ8BGFr9Y8Ri2tFLWTixmwKBafDujO1WVah4fhZBeU1bieKdghig== dependencies: - "@babel/types" "^7.10.4" + "@babel/types" "^7.10.5" jsesc "^2.5.1" - lodash "^4.17.13" source-map "^0.5.0" "@babel/helper-annotate-as-pure@^7.10.4": @@ -66,13 +65,13 @@ "@babel/types" "^7.10.4" "@babel/helper-builder-react-jsx-experimental@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.10.4.tgz#d0ffb875184d749c63ffe1f4f65be15143ec322d" - integrity sha512-LyacH/kgQPgLAuaWrvvq1+E7f5bLyT8jXCh7nM67sRsy2cpIGfgWJ+FCnAKQXfY+F0tXUaN6FqLkp4JiCzdK8Q== + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.10.5.tgz#f35e956a19955ff08c1258e44a515a6d6248646b" + integrity sha512-Buewnx6M4ttG+NLkKyt7baQn7ScC/Td+e99G914fRU8fGIUivDDgVIQeDHFa5e4CRSJQt58WpNHhsAZgtzVhsg== dependencies: "@babel/helper-annotate-as-pure" "^7.10.4" "@babel/helper-module-imports" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/types" "^7.10.5" "@babel/helper-builder-react-jsx@^7.10.4": version "7.10.4" @@ -94,12 +93,12 @@ semver "^5.5.0" "@babel/helper-create-class-features-plugin@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.4.tgz#2d4015d0136bd314103a70d84a7183e4b344a355" - integrity sha512-9raUiOsXPxzzLjCXeosApJItoMnX3uyT4QdM2UldffuGApNrF8e938MwNpDCK9CPoyxrEoCgT+hObJc3mZa6lQ== + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz#9f61446ba80e8240b0a5c85c6fdac8459d6f259d" + integrity sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A== dependencies: "@babel/helper-function-name" "^7.10.4" - "@babel/helper-member-expression-to-functions" "^7.10.4" + "@babel/helper-member-expression-to-functions" "^7.10.5" "@babel/helper-optimise-call-expression" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" "@babel/helper-replace-supers" "^7.10.4" @@ -115,13 +114,13 @@ regexpu-core "^4.7.0" "@babel/helper-define-map@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.4.tgz#f037ad794264f729eda1889f4ee210b870999092" - integrity sha512-nIij0oKErfCnLUCWaCaHW0Bmtl2RO9cN7+u2QT8yqTywgALKlyUVOvHDElh+b5DwVC6YB1FOYFOTWcN/+41EDA== + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz#b53c10db78a640800152692b13393147acb9bb30" + integrity sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ== dependencies: "@babel/helper-function-name" "^7.10.4" - "@babel/types" "^7.10.4" - lodash "^4.17.13" + "@babel/types" "^7.10.5" + lodash "^4.17.19" "@babel/helper-explode-assignable-expression@^7.10.4": version "7.10.4" @@ -154,12 +153,12 @@ dependencies: "@babel/types" "^7.10.4" -"@babel/helper-member-expression-to-functions@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.4.tgz#7cd04b57dfcf82fce9aeae7d4e4452fa31b8c7c4" - integrity sha512-m5j85pK/KZhuSdM/8cHUABQTAslV47OjfIB9Cc7P+PvlAoBzdb79BGNfw8RhT5Mq3p+xGd0ZfAKixbrUZx0C7A== +"@babel/helper-member-expression-to-functions@^7.10.4", "@babel/helper-member-expression-to-functions@^7.10.5": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.5.tgz#172f56e7a63e78112f3a04055f24365af702e7ee" + integrity sha512-HiqJpYD5+WopCXIAbQDG0zye5XYVvcO9w/DHp5GsaGkRUaamLj2bEtu6i8rnGGprAhHM3qidCMgp71HF4endhA== dependencies: - "@babel/types" "^7.10.4" + "@babel/types" "^7.10.5" "@babel/helper-module-imports@^7.10.4": version "7.10.4" @@ -168,18 +167,18 @@ dependencies: "@babel/types" "^7.10.4" -"@babel/helper-module-transforms@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.10.4.tgz#ca1f01fdb84e48c24d7506bb818c961f1da8805d" - integrity sha512-Er2FQX0oa3nV7eM1o0tNCTx7izmQtwAQsIiaLRWtavAAEcskb0XJ5OjJbVrYXWOTr8om921Scabn4/tzlx7j1Q== +"@babel/helper-module-transforms@^7.10.4", "@babel/helper-module-transforms@^7.10.5": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.10.5.tgz#120c271c0b3353673fcdfd8c053db3c544a260d6" + integrity sha512-4P+CWMJ6/j1W915ITJaUkadLObmCRRSC234uctJfn/vHrsLNxsR8dwlcXv9ZhJWzl77awf+mWXSZEKt5t0OnlA== dependencies: "@babel/helper-module-imports" "^7.10.4" "@babel/helper-replace-supers" "^7.10.4" "@babel/helper-simple-access" "^7.10.4" "@babel/helper-split-export-declaration" "^7.10.4" "@babel/template" "^7.10.4" - "@babel/types" "^7.10.4" - lodash "^4.17.13" + "@babel/types" "^7.10.5" + lodash "^4.17.19" "@babel/helper-optimise-call-expression@^7.10.4": version "7.10.4" @@ -194,11 +193,11 @@ integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== "@babel/helper-regex@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.4.tgz#59b373daaf3458e5747dece71bbaf45f9676af6d" - integrity sha512-inWpnHGgtg5NOF0eyHlC0/74/VkdRITY9dtTpB2PrxKKn+AkVMRiZz/Adrx+Ssg+MLDesi2zohBW6MVq6b4pOQ== + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.5.tgz#32dfbb79899073c415557053a19bd055aae50ae0" + integrity sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg== dependencies: - lodash "^4.17.13" + lodash "^4.17.19" "@babel/helper-remap-async-to-generator@^7.10.4": version "7.10.4" @@ -269,15 +268,15 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.4.tgz#9eedf27e1998d87739fb5028a5120557c06a1a64" - integrity sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA== +"@babel/parser@^7.10.4", "@babel/parser@^7.10.5": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.5.tgz#e7c6bf5a7deff957cec9f04b551e2762909d826b" + integrity sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ== "@babel/plugin-proposal-async-generator-functions@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.4.tgz#4b65abb3d9bacc6c657aaa413e56696f9f170fc6" - integrity sha512-MJbxGSmejEFVOANAezdO39SObkURO5o/8b6fSH6D1pi9RZQt+ldppKPXfqgUWpSQ9asM6xaSaSJIaeWMDRP0Zg== + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz#3491cabf2f7c179ab820606cec27fed15e0e8558" + integrity sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/helper-remap-async-to-generator" "^7.10.4" @@ -465,12 +464,11 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-block-scoping@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.4.tgz#a670d1364bb5019a621b9ea2001482876d734787" - integrity sha512-J3b5CluMg3hPUii2onJDRiaVbPtKFPLEaV5dOPY5OeAbDi1iU/UbbFFTgwb7WnanaDy7bjU35kc26W3eM5Qa0A== + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.5.tgz#b81b8aafefbfe68f0f65f7ef397b9ece68a6037d" + integrity sha512-6Ycw3hjpQti0qssQcA6AMSFDHeNJ++R6dIMnpRqUjFeBBTmTDPa8zgF90OVfTvAo11mXZTlVUViY1g8ffrURLg== dependencies: "@babel/helper-plugin-utils" "^7.10.4" - lodash "^4.17.13" "@babel/plugin-transform-classes@^7.10.4": version "7.10.4" @@ -553,11 +551,11 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-modules-amd@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.4.tgz#cb407c68b862e4c1d13a2fc738c7ec5ed75fc520" - integrity sha512-3Fw+H3WLUrTlzi3zMiZWp3AR4xadAEMv6XRCYnd5jAlLM61Rn+CRJaZMaNvIpcJpQ3vs1kyifYvEVPFfoSkKOA== + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz#1b9cddaf05d9e88b3aad339cb3e445c4f020a9b1" + integrity sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw== dependencies: - "@babel/helper-module-transforms" "^7.10.4" + "@babel/helper-module-transforms" "^7.10.5" "@babel/helper-plugin-utils" "^7.10.4" babel-plugin-dynamic-import-node "^2.3.3" @@ -572,12 +570,12 @@ babel-plugin-dynamic-import-node "^2.3.3" "@babel/plugin-transform-modules-systemjs@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.4.tgz#8f576afd943ac2f789b35ded0a6312f929c633f9" - integrity sha512-Tb28LlfxrTiOTGtZFsvkjpyjCl9IoaRI52AEU/VIwOwvDQWtbNJsAqTXzh+5R7i74e/OZHH2c2w2fsOqAfnQYQ== + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz#6270099c854066681bae9e05f87e1b9cadbe8c85" + integrity sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw== dependencies: "@babel/helper-hoist-variables" "^7.10.4" - "@babel/helper-module-transforms" "^7.10.4" + "@babel/helper-module-transforms" "^7.10.5" "@babel/helper-plugin-utils" "^7.10.4" babel-plugin-dynamic-import-node "^2.3.3" @@ -612,9 +610,9 @@ "@babel/helper-replace-supers" "^7.10.4" "@babel/plugin-transform-parameters@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.4.tgz#7b4d137c87ea7adc2a0f3ebf53266871daa6fced" - integrity sha512-RurVtZ/D5nYfEg0iVERXYKEgDFeesHrHfx8RT05Sq57ucj2eOYAP6eu5fynL4Adju4I/mP/I6SO0DqNWAXjfLQ== + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz#59d339d58d0b1950435f4043e74e2510005e2c4a" + integrity sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw== dependencies: "@babel/helper-get-function-arity" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" @@ -651,9 +649,9 @@ "@babel/plugin-syntax-jsx" "^7.10.4" "@babel/plugin-transform-react-jsx-source@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.4.tgz#86baf0fcccfe58084e06446a80858e1deae8f291" - integrity sha512-FTK3eQFrPv2aveerUSazFmGygqIdTtvskG50SnGnbEUnRPcGx2ylBhdFIzoVS1ty44hEgcPoCAyw5r3VDEq+Ug== + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.5.tgz#34f1779117520a779c054f2cdd9680435b9222b4" + integrity sha512-wTeqHVkN1lfPLubRiZH3o73f4rfon42HpgxUSs86Nc+8QIcm/B9s8NNVXu/gwGcOyd7yDib9ikxoDLxJP0UiDA== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-jsx" "^7.10.4" @@ -713,9 +711,9 @@ "@babel/helper-regex" "^7.10.4" "@babel/plugin-transform-template-literals@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.4.tgz#e6375407b30fcb7fcfdbba3bb98ef3e9d36df7bc" - integrity sha512-4NErciJkAYe+xI5cqfS8pV/0ntlY5N5Ske/4ImxAVX7mk9Rxt2bwDTGv1Msc2BRJvWQcmYEC+yoMLdX22aE4VQ== + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz#78bc5d626a6642db3312d9d0f001f5e7639fde8c" + integrity sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw== dependencies: "@babel/helper-annotate-as-pure" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" @@ -837,9 +835,9 @@ "@babel/plugin-transform-react-pure-annotations" "^7.10.4" "@babel/runtime@^7.1.2", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.4.tgz#a6724f1a6b8d2f6ea5236dbfe58c7d7ea9c5eb99" - integrity sha512-UpTN5yUJr9b4EX2CnGNWIvER7Ab83ibv0pcvvHc4UOdrBI5jb8bj+32cCwPX6xu0mt2daFNjYhoi+X7beH0RSw== + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.5.tgz#303d8bd440ecd5a491eae6117fd3367698674c5c" + integrity sha512-otddXKhdNn7d0ptoFRHtMLa8LqDxLYwTjB4nYgM1yy5N6gU/MUf8zqyyLltCH3yAVitBzmwK4us+DD0l/MauAg== dependencies: regenerator-runtime "^0.13.4" @@ -852,28 +850,28 @@ "@babel/parser" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/traverse@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.4.tgz#e642e5395a3b09cc95c8e74a27432b484b697818" - integrity sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q== +"@babel/traverse@^7.10.4", "@babel/traverse@^7.10.5": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.5.tgz#77ce464f5b258be265af618d8fddf0536f20b564" + integrity sha512-yc/fyv2gUjPqzTz0WHeRJH2pv7jA9kA7mBX2tXl/x5iOE81uaVPuGPtaYk7wmkx4b67mQ7NqI8rmT2pF47KYKQ== dependencies: "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.10.4" + "@babel/generator" "^7.10.5" "@babel/helper-function-name" "^7.10.4" "@babel/helper-split-export-declaration" "^7.10.4" - "@babel/parser" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/parser" "^7.10.5" + "@babel/types" "^7.10.5" debug "^4.1.0" globals "^11.1.0" - lodash "^4.17.13" + lodash "^4.17.19" -"@babel/types@^7.10.4", "@babel/types@^7.4.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.4.tgz#369517188352e18219981efd156bfdb199fff1ee" - integrity sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg== +"@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.4.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.5.tgz#d88ae7e2fde86bfbfe851d4d81afa70a997b5d15" + integrity sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q== dependencies: "@babel/helper-validator-identifier" "^7.10.4" - lodash "^4.17.13" + lodash "^4.17.19" to-fast-properties "^2.0.0" "@emotion/hash@^0.8.0": @@ -1015,9 +1013,9 @@ integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== "@types/node@*": - version "14.0.20" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.20.tgz#0da05cddbc761e1fa98af88a17244c8c1ff37231" - integrity sha512-MRn/NP3dee8yL5QhbSA6riuwkS+UOcsPUMOIOG3KMUQpuor/2TopdRBu8QaaB4fGU+gz/bzyDWt0FtUbeJ8H1A== + version "14.0.23" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.23.tgz#676fa0883450ed9da0bb24156213636290892806" + integrity sha512-Z4U8yDAl5TFkmYsZdFPdjeMa57NOvnaf1tljHzhouaPEp7LCj2JKkejpI1ODviIAQuW4CcQmxkQ77rnLsOOoKw== "@types/prop-types@*": version "15.7.3" @@ -1037,9 +1035,9 @@ "@types/react" "*" "@types/react@*": - version "16.9.41" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.41.tgz#925137ee4d2ff406a0ecf29e8e9237390844002e" - integrity sha512-6cFei7F7L4wwuM+IND/Q2cV1koQUvJ8iSV+Gwn0c3kvABZ691g7sp3hfEQHOUBJtccl1gPi+EyNjMIl9nGA0ug== + version "16.9.43" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.43.tgz#c287f23f6189666ee3bebc2eb8d0f84bcb6cdb6b" + integrity sha512-PxshAFcnJqIWYpJbLPriClH53Z2WlJcVZE+NP2etUtWQs2s7yIMj3/LDKZT/5CHJ/F62iyjVCDu2H3jHEXIxSg== dependencies: "@types/prop-types" "*" csstype "^2.2.0" @@ -1766,9 +1764,9 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001093: - version "1.0.30001096" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001096.tgz#5a4541af5317dc21f91f5b24d453030a35f919c0" - integrity sha512-PFTw9UyVfbkcMEFs82q8XVlRayj7HKvnhu5BLcmjGpv+SNyiWasCcWXPGJuO0rK0dhLRDJmtZcJ+LHUfypbw1w== + version "1.0.30001102" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001102.tgz#3275e7a8d09548f955f665e532df88de0b63741a" + integrity sha512-fOjqRmHjRXv1H1YD6QVLb96iKqnu17TjcLSaX64TwhGYed0P1E1CCWZ9OujbbK4Z/7zax7zAzvQidzdtjx8RcA== chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" @@ -1799,9 +1797,9 @@ chokidar@^2.1.8: fsevents "^1.2.7" chokidar@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.0.tgz#b30611423ce376357c765b9b8f904b9fba3c0be8" - integrity sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ== + version "3.4.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.1.tgz#e905bdecf10eaa0a0b1db0c664481cc4cbc22ba1" + integrity sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g== dependencies: anymatch "~3.1.1" braces "~3.0.2" @@ -2562,9 +2560,9 @@ ee-first@1.1.1: integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= electron-to-chromium@^1.3.488: - version "1.3.494" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.494.tgz#0d2dba65b69d696c5b71abb37552ff055fb32a5c" - integrity sha512-EOZuaDT3L1sCIMAVN5J0nGuGWVq5dThrdl0d8XeDYf4MOzbXqZ19OLKesN8TZj0RxtpYjqHpiw/fR6BKWdMwYA== + version "1.3.499" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.499.tgz#06949f19877dafa42915e57dfeb4c1cfb86a8649" + integrity sha512-y7FwtQm/8xuLMnYQfBQDYzCpNn+VkSnf4c3Km5TWMNXg7JA5RQBuxmcLaKdDVcIK0K5xGIa7TlxpRt4BdNxNoA== elliptic@^6.0.0, elliptic@^6.5.2: version "6.5.3" @@ -2607,9 +2605,9 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: once "^1.4.0" enhanced-resolve@^4.1.0, enhanced-resolve@^4.1.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.2.0.tgz#5d43bda4a0fd447cb0ebbe71bef8deff8805ad0d" - integrity sha512-S7eiFb/erugyd1rLb6mQ3Vuq+EXHv5cpCkNqqIkYkBgN2QdFnyCZzFBleqwGEx4lgNGYij81BWnCrFNK7vxvjQ== + version "4.3.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz#3b806f3bfafc1ec7de69551ef93cca46c1704126" + integrity sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ== dependencies: graceful-fs "^4.1.2" memory-fs "^0.5.0" @@ -2699,9 +2697,9 @@ es6-symbol@^3.1.1, es6-symbol@~3.1.3: ext "^1.1.2" escalade@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.0.1.tgz#52568a77443f6927cd0ab9c73129137533c965ed" - integrity sha512-DR6NO3h9niOT+MZs7bjxlj2a1k+POu5RN8CLTPX2+i78bRi9eLe7+0zXgUHMnGXWybYcL61E9hGhPKqedy8tQA== + version "3.0.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.0.2.tgz#6a580d70edb87880f22b4c91d0d56078df6962c4" + integrity sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ== escape-html@~1.0.3: version "1.0.3" @@ -3426,9 +3424,9 @@ https-browserify@^1.0.0: integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= hyphenate-style-name@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz#097bb7fa0b8f1a9cf0bd5c734cf95899981a9b48" - integrity sha512-EcuixamT82oplpoJ2XU4pDtKGWQ7b00CD9f1ug9IaQ3p1bkHMiKCZ9ut9QDI6qsa6cpUuB+A/I+zLtdNK4n2DQ== + version "1.0.4" + resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" + integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== iconv-lite@0.4.24: version "0.4.24" @@ -4046,7 +4044,7 @@ lodash@4.17.15: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== -"lodash@>=3.5 <5", lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.5: +"lodash@>=3.5 <5", lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.5: version "4.17.19" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==