+
+
+
+
+
+
+
+
);
};
diff --git a/assets/js/components/TodoTable.js b/assets/js/components/TodoTable.js
index 09206aa..ff8904d 100644
--- a/assets/js/components/TodoTable.js
+++ b/assets/js/components/TodoTable.js
@@ -16,14 +16,13 @@ import {
} from '@material-ui/core';
//MUI ICONS
import {
- Add as AddIcon,
Close as CloseIcon,
- Delete as DeleteIcon,
Done as DoneIcon,
Edit as EditIcon,
} from '@material-ui/icons';
//CUSTOM COMPONENTS
import DeleteDialog from './DeleteDialog';
+import AddTodo from './AddTodo';
const useStyles = makeStyles(theme => ({
thead: {
@@ -34,8 +33,6 @@ const useStyles = makeStyles(theme => ({
function TodoTable() {
const context = useContext(TodoContext);
- const [addTodoName, setAddTodoName] = useState('');
- const [addTodoDescription, setAddTodoDescription] = useState('');
const [editIsShown, setEditIsShown] = useState(false);
const [editTodoName, setEditTodoName] = useState('');
const [editTodoDescription, setEditTodoDescription] = useState('');
@@ -44,144 +41,132 @@ function TodoTable() {
const classes = useStyles();
- const onCreateSubmit = (event) => {
- event.preventDefault();
- context.createTodo(event, {task: addTodoName, description: addTodoDescription});
- setAddTodoName('');
- setAddTodoDescription('');
- };
const onEditSubmit = (todoId, event) => {
- event.preventDefault();
- context.updateTodo({id: todoId, task: editTodoName, description: editTodoDescription});
+ if (event !== undefined) event.preventDefault();
+
+ context.updateTodo({
+ id: todoId,
+ task: editTodoName,
+ description: editTodoDescription,
+ });
setEditIsShown(false);
};
return (
-
{/*HEAD*/}
+
{/*ADD*/}
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+ {/*END OF ADD*/}
+
+ {/*COLUMN NAMES*/}
Task
Description
Actions
+ {/*END OF COLUMN NAMES*/}
+
+ {/*END OF HEAD*/}
{/*BODY*/}
{/*DATA*/}
{context.todos.slice().reverse().map((todo, index) => (
-
+
- {/*NAME*/}
+ {/*TASK*/}
{editIsShown === todo.id ?
-
- :
- {todo.task}
+
+ :
+ {todo.task}
}
+ {/*END OF TASK*/}
{/*DESCRIPTION*/}
{editIsShown === todo.id ?
- setEditTodoDescription(event.target.value)}
- multiline={true}
- />
- :
- {todo.description}
+ setEditTodoDescription(event.target.value)}
+ multiline={true}
+ inputProps={{
+ onKeyPress: (e) => {
+ if (e.shiftKey && e.key === 'Enter') {
+ e.preventDefault();
+ onEditSubmit(todo.id);
+ }
+ },
+ }}
+ />
+ :
+ {todo.description}
}
+ {/*END OF DESCRIPTION*/}
-
+ {/*ACTIONS*/}
+
{editIsShown === todo.id ?
-
-
-
-
- setEditIsShown(false)}>
-
-
-
- :
-
- {
- setEditIsShown(todo.id);
- setEditTodoName(todo.task);
- setEditTodoDescription(todo.description);
- }}>
-
-
-
- {
- setDeleteConfirmationIsShown(true);
- setTodoToBeDeleted(todo);
- }}>
-
-
-
+
+
+
+
+ setEditIsShown(false)}>
+
+
+
+ :
+
+ {
+ setEditIsShown(todo.id);
+ setEditTodoName(todo.task);
+ setEditTodoDescription(todo.description);
+ }}>
+
+
+
+ {
+ setDeleteConfirmationIsShown(true);
+ setTodoToBeDeleted(todo);
+ }}>
+
+
+
}
+ {/*END OF ACTIONS*/}
+
))}
+ {/*END OF DATA*/}
@@ -193,7 +178,6 @@ function TodoTable() {
)}
-
);
}
diff --git a/assets/js/components/alert/AlertComponent.js b/assets/js/components/alert/AlertComponent.js
new file mode 100644
index 0000000..edbc469
--- /dev/null
+++ b/assets/js/components/alert/AlertComponent.js
@@ -0,0 +1,26 @@
+import React, {useContext} from 'react';
+import {Snackbar} from '@material-ui/core';
+import MuiAlert from '@material-ui/lab/Alert';
+import {AlertContext} from '../../contexts/AlertContext';
+import Typography from '@material-ui/core/Typography';
+import ExtractTextFromMessage from '../functions/ExtractTextFromMessage';
+
+const AlertComponent = () => {
+ const context = useContext(AlertContext);
+ let {text, level} = context.alert;
+
+ if (text && level)
+ return (
+
+
+ {typeof text !== 'string' ? text.join('\n') : text}
+
+
+ );
+ else return false;
+};
+
+export default AlertComponent;
\ No newline at end of file
diff --git a/assets/js/components/functions/ExtractTextFromMessage.js b/assets/js/components/functions/ExtractTextFromMessage.js
new file mode 100644
index 0000000..233587b
--- /dev/null
+++ b/assets/js/components/functions/ExtractTextFromMessage.js
@@ -0,0 +1,16 @@
+import React from 'react';
+
+/**
+ *
+ * @param array {object} - array of objects
+ * @returns {string[]} - array of strings
+ * @constructor
+ */
+const ExtractTextFromMessage = (array) => {
+ const textCollection = [];
+ array.forEach(item => textCollection.push(item.text));
+ return textCollection;
+};
+
+
+export default ExtractTextFromMessage;
\ No newline at end of file
diff --git a/assets/js/components/tables/tag/AddTag.js b/assets/js/components/tables/tag/AddTag.js
new file mode 100644
index 0000000..3be6fd6
--- /dev/null
+++ b/assets/js/components/tables/tag/AddTag.js
@@ -0,0 +1,86 @@
+//REACT
+import React, {useContext, useState} from 'react';
+//CONTEXT
+import {TagContext} from '../../../contexts/TagContext';
+//MUI COMPONENTS
+import {Grid, TextField, Box, IconButton, useTheme, useMediaQuery, Button} from '@material-ui/core';
+//MUI ICONS
+import {Add as AddIcon, Refresh as RefreshIcon} from '@material-ui/icons';
+
+
+const AddTag = () => {
+ const context = useContext(TagContext);
+ const theme = useTheme();
+ const isMobile = useMediaQuery(theme.breakpoints.down('xs'));
+
+ const initialState = {
+ name: '',
+ };
+
+ const [state, setState] = useState(initialState);
+
+ const handleChange = (e) => {
+ setState({
+ ...state,
+ [e.target.name]: e.target.value,
+ });
+ };
+
+ const onSubmit = (e) => {
+ e.preventDefault();
+ context.create(state);
+ setState(initialState);
+ };
+
+ return (
+
+ );
+};
+
+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 ?
+
+ :
+ {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==