diff --git a/.all-contributorsrc b/.all-contributorsrc index 97801eafa9..714b6b7170 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2342,6 +2342,150 @@ "contributions": [ "code" ] + }, + { + "login": "kcoyo", + "name": "kcoyo", + "avatar_url": "https://avatars.githubusercontent.com/u/12447225?v=4", + "profile": "https://github.com/kcoyo", + "contributions": [ + "code" + ] + }, + { + "login": "travismiller", + "name": "Travis Miller", + "avatar_url": "https://avatars.githubusercontent.com/u/494017?v=4", + "profile": "https://travismiller.com/", + "contributions": [ + "code" + ] + }, + { + "login": "Delta5", + "name": "Evan Taylor", + "avatar_url": "https://avatars.githubusercontent.com/u/1975640?v=4", + "profile": "https://github.com/Delta5", + "contributions": [ + "code" + ] + }, + { + "login": "PetriAsi", + "name": "Petri Asikainen", + "avatar_url": "https://avatars.githubusercontent.com/u/8735148?v=4", + "profile": "https://github.com/PetriAsi", + "contributions": [ + "code" + ] + }, + { + "login": "derdeagle", + "name": "derdeagle", + "avatar_url": "https://avatars.githubusercontent.com/u/11424540?v=4", + "profile": "https://github.com/derdeagle", + "contributions": [ + "code" + ] + }, + { + "login": "vapier", + "name": "Mike Frysinger", + "avatar_url": "https://avatars.githubusercontent.com/u/176950?v=4", + "profile": "https://wh0rd.org/", + "contributions": [ + "code" + ] + }, + { + "login": "AL4AL", + "name": "ALPHA", + "avatar_url": "https://avatars.githubusercontent.com/u/22044358?v=4", + "profile": "https://github.com/AL4AL", + "contributions": [ + "code" + ] + }, + { + "login": "FliegenKLATSCH", + "name": "FliegenKLATSCH", + "avatar_url": "https://avatars.githubusercontent.com/u/1042587?v=4", + "profile": "https://www.ifern.de", + "contributions": [ + "code" + ] + }, + { + "login": "jerm", + "name": "Jeremy Price", + "avatar_url": "https://avatars.githubusercontent.com/u/442138?v=4", + "profile": "https://github.com/jerm", + "contributions": [ + "code" + ] + }, + { + "login": "Toreg87", + "name": "Toreg87", + "avatar_url": "https://avatars.githubusercontent.com/u/84392209?v=4", + "profile": "https://github.com/Toreg87", + "contributions": [ + "code" + ] + }, + { + "login": "Computroniks", + "name": "Matthew Nickson", + "avatar_url": "https://avatars.githubusercontent.com/u/67638596?v=4", + "profile": "https://github.com/Computroniks", + "contributions": [ + "code" + ] + }, + { + "login": "jethron", + "name": "Jethro Nederhof", + "avatar_url": "https://avatars.githubusercontent.com/u/1646397?v=4", + "profile": "https://jethron.id.au", + "contributions": [ + "code" + ] + }, + { + "login": "01ste02", + "name": "Oskar Stenberg", + "avatar_url": "https://avatars.githubusercontent.com/u/23289826?v=4", + "profile": "https://github.com/01ste02", + "contributions": [ + "code" + ] + }, + { + "login": "Robert-Azelis", + "name": "Robert-Azelis", + "avatar_url": "https://avatars.githubusercontent.com/u/82208283?v=4", + "profile": "https://github.com/Robert-Azelis", + "contributions": [ + "code" + ] + }, + { + "login": "alwism", + "name": "Alexander William Smith", + "avatar_url": "https://avatars.githubusercontent.com/u/60648387?v=4", + "profile": "https://github.com/alwism", + "contributions": [ + "code" + ] + }, + { + "login": "PlaneNuts", + "name": "PlaneNuts", + "avatar_url": "https://avatars.githubusercontent.com/u/88776392?v=4", + "profile": "https://github.com/PlaneNuts", + "contributions": [ + "code" + ] } ] } diff --git a/.github/ISSUE_TEMPLATE/Bug_report.md b/.github/ISSUE_TEMPLATE/Bug_report.md deleted file mode 100644 index ae8ba15ed0..0000000000 --- a/.github/ISSUE_TEMPLATE/Bug_report.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve - ---- - -#### Please confirm you have done the following before posting your bug report: - -- [ ] I have enabled debug mode -- [ ] I have read [checked the Common Issues page](https://snipe-it.readme.io/docs/common-issues) - -**Describe the bug** -A clear and concise description of what the bug is. - -**To Reproduce** -Steps to reproduce the behavior: -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error - -**Expected behavior** -A clear and concise description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -**Server (please complete the following information):** - - Snipe-IT Version - - OS: [e.g. Ubuntu, CentOS] - - Web Server: [e.g. Apache, IIS] - - PHP Version - -**Desktop (please complete the following information):** - - OS: [e.g. iOS] - - Browser [e.g. chrome, safari] - - Version [e.g. 22] - -**Smartphone (please complete the following information):** - - Device: [e.g. iPhone6] - - OS: [e.g. iOS8.1] - - Browser [e.g. stock browser, safari] - - Version [e.g. 22] - -**Error Messages** -- WITH DEBUG TURNED ON, if you're getting an error in your browser, include that error -- If a stacktrace is provided in the error, include that too. -- Any errors that appear in your browser's error console. -- Confirm whether the error is reproducible on the demo: https://snipeitapp.com/demo. -- Include any additional information you can find in `storage/logs` and your webserver's logs. -- Include the output from `php -m` (this should display what modules you have enabled.) - -**Additional context** -- Is this a fresh install or an upgrade? -- What OS and web server you're running Snipe-IT on -- What method you used to install Snipe-IT (install.sh, manual installation, docker, etc) -- Include what you've done so far in the installation, and if you got any error messages along the way. -- Indicate whether or not you've manually edited any data directly in the database - -Add any other context about the problem here. - -Please do not post an issue without answering the related questions above. If you have opened a different issue and already answered these questions, answer them again, once for every ticket. It will be next to impossible for us to help you. diff --git a/.github/ISSUE_TEMPLATE/Feature_request.md b/.github/ISSUE_TEMPLATE/Feature_request.md deleted file mode 100644 index 66c3d199f8..0000000000 --- a/.github/ISSUE_TEMPLATE/Feature_request.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project - ---- - -**Server (please complete the following information):** - - Snipe-IT Version - - OS: [e.g. Ubuntu, CentOS] - - Web Server: [e.g. Apache, IIS] - - PHP Version - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000000..5cc00c2a31 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,129 @@ +name: Bug Report +description: Create a report to help us improve +body: + - type: checkboxes + attributes: + label: Debug mode + description: Please confirm you have done the following before posting your bug report + options: + - label: I have enabled debug mode + required: true + - label: I have read [checked the Common Issues page](https://snipe-it.readme.io/docs/common-issues) + required: true + - type: textarea + attributes: + label: Describe the bug + description: A clear and concise description of what the bug is. + validations: + required: true + - type: textarea + attributes: + label: Reproduction steps + description: Steps to reproduce the behavior. + value: | + 1. + 2. + 3. + ... + validations: + required: true + - type: textarea + attributes: + label: Expected behavior + description: A clear and concise description of what you expected to happen. + validations: + required: true + - type: textarea + attributes: + label: Screenshots + description: 'If applicable, add screenshots to help explain your problem.' + - type: markdown + attributes: + value: "### Server" + - type: input + attributes: + label: Snipe-IT Version + validations: + required: true + - type: input + id: server_operatingSystem + attributes: + label: Operating System + description: 'e.g. Ubuntu, Windows' + validations: + required: true + - type: input + attributes: + label: Web Server + description: 'e.g. Apache, IIS' + validations: + required: true + - type: input + attributes: + label: PHP Version + validations: + required: true + - type: markdown + attributes: + value: "### Desktop" + - type: input + id: desktop_operatingSystem + attributes: + label: Operating System + description: 'e.g. Ubuntu, Windows' + - type: input + id: desktop_browser + attributes: + label: Browser + description: 'e.g. Google Chrome, Safari' + - type: input + id: desktop_version + attributes: + label: Version + description: 'e.g. 93' + - type: markdown + attributes: + value: "### Mobile" + - type: input + attributes: + label: Device + description: 'e.g. iPhone 6, Pixel 4a' + - type: input + id: mobile_operatingSystem + attributes: + label: Operating System + description: 'e.g. iOS 8.1, Android 9' + - type: input + id: mobile_browser + attributes: + label: Browser + description: 'e.g. Google Chrome, Safari' + - type: input + id: mobile_version + attributes: + label: Version + description: 'e.g. 93' + - type: textarea + attributes: + label: Error messages + description: | + WITH DEBUG TURNED ON, if you're getting an error in your browser, include that error + If a stacktrace is provided in the error, include that too. + Any errors that appear in your browser's error console. + Confirm whether the error is reproducible on the demo: https://snipeitapp.com/demo. + Include any additional information you can find in `storage/logs` and your webserver's logs. + Include the output from `php -m` (this should display what modules you have enabled.) + render: shell + - type: textarea + attributes: + label: Additional context + description: | + Is this a fresh install or an upgrade? + What OS and web server you're running Snipe-IT on + What method you used to install Snipe-IT (install.sh, manual installation, docker, etc) + Include what you've done so far in the installation, and if you got any error messages along the way. + Indicate whether or not you've manually edited any data directly in the database + Add any other context about the problem here. + - type: markdown + attributes: + value: Please do not post an issue without answering the related questions above. If you have opened a different issue and already answered these questions, answer them again, once for every ticket. It will be next to impossible for us to help you. diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000000..3ba13e0cec --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1 @@ +blank_issues_enabled: false diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000000..3c21c8a479 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,42 @@ +name: Feature Request +description: Suggest an idea for this project +body: + - type: input + attributes: + label: Snipe-IT Version + validations: + required: true + - type: input + id: server_operatingSystem + attributes: + label: Operating System + description: 'e.g. Ubuntu, Windows' + validations: + required: true + - type: input + attributes: + label: Web Server + description: 'e.g. Apache, IIS' + validations: + required: true + - type: input + attributes: + label: PHP Version + validations: + required: true + - type: textarea + attributes: + label: Is your feature request related to a problem? Please describe. A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + validations: + required: true + - type: textarea + attributes: + label: Describe the solution you'd like A clear and concise description of what you want to happen. + validations: + required: true + - type: textarea + attributes: + label: Describe alternatives you've considered A clear and concise description of any alternative solutions or features you've considered. + - type: textarea + attributes: + label: Additional context Add any other context or screenshots about the feature request here. diff --git a/.gitignore b/.gitignore index 9771de971b..37e9d3f68c 100755 --- a/.gitignore +++ b/.gitignore @@ -63,3 +63,5 @@ _ide_helper.php .phpstorm.meta.php _ide_helper_models.php /.phplint-cache +storage/ldap_client_tls.cert +storage/ldap_client_tls.key diff --git a/.nvmrc b/.nvmrc index 70324da038..27bbca7450 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v10.15.1 +v12.22.1 diff --git a/Dockerfile b/Dockerfile index 86e6b81419..09e511ba80 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ -FROM ubuntu:bionic -LABEL maintainer Brady Wetherington +FROM ubuntu:20.04 +LABEL maintainer="Brady Wetherington " # No need to add `apt-get clean` here, reference: # - https://github.com/snipe/snipe-it/pull/9201 @@ -14,15 +14,15 @@ RUN export DEBIAN_FRONTEND=noninteractive; \ apt-utils \ apache2 \ apache2-bin \ -libapache2-mod-php7.2 \ -php7.2-curl \ -php7.2-ldap \ -php7.2-mysql \ -php7.2-gd \ -php7.2-xml \ -php7.2-mbstring \ -php7.2-zip \ -php7.2-bcmath \ +libapache2-mod-php7.4 \ +php7.4-curl \ +php7.4-ldap \ +php7.4-mysql \ +php7.4-gd \ +php7.4-xml \ +php7.4-mbstring \ +php7.4-zip \ +php7.4-bcmath \ patch \ curl \ wget \ @@ -38,7 +38,7 @@ autoconf \ libc-dev \ pkg-config \ libmcrypt-dev \ -php7.2-dev \ +php7.4-dev \ ca-certificates \ unzip \ && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* @@ -47,16 +47,16 @@ unzip \ RUN curl -L -O https://github.com/pear/pearweb_phars/raw/master/go-pear.phar RUN php go-pear.phar -RUN pecl install mcrypt-1.0.2 +RUN pecl install mcrypt-1.0.3 -RUN bash -c "echo extension=/usr/lib/php/20170718/mcrypt.so > /etc/php/7.2/mods-available/mcrypt.ini" +RUN bash -c "echo extension=/usr/lib/php/20190902/mcrypt.so > /etc/php/7.4/mods-available/mcrypt.ini" RUN phpenmod mcrypt RUN phpenmod gd RUN phpenmod bcmath -RUN sed -i 's/variables_order = .*/variables_order = "EGPCS"/' /etc/php/7.2/apache2/php.ini -RUN sed -i 's/variables_order = .*/variables_order = "EGPCS"/' /etc/php/7.2/cli/php.ini +RUN sed -i 's/variables_order = .*/variables_order = "EGPCS"/' /etc/php/7.4/apache2/php.ini +RUN sed -i 's/variables_order = .*/variables_order = "EGPCS"/' /etc/php/7.4/cli/php.ini RUN useradd -m --uid 1000 --gid 50 docker @@ -133,4 +133,4 @@ RUN chmod +x /startup.sh /usr/bin/supervisor-exit-event-listener CMD ["/startup.sh"] EXPOSE 80 -EXPOSE 443 +EXPOSE 443 \ No newline at end of file diff --git a/Dockerfile.alpine b/Dockerfile.alpine index 6b52b74f9a..6adc780924 100644 --- a/Dockerfile.alpine +++ b/Dockerfile.alpine @@ -1,4 +1,4 @@ -FROM alpine:3.13 +FROM alpine:3.14.2 # Apache + PHP RUN apk add --no-cache \ apache2 \ @@ -25,6 +25,8 @@ RUN apk add --no-cache \ php7-session \ php7-dom \ php7-xmlwriter \ + php7-xmlreader \ + php7-sodium \ curl \ wget \ vim \ @@ -80,4 +82,4 @@ ENTRYPOINT ["/sbin/tini", "--"] CMD ["/entrypoint.sh"] -EXPOSE 80 +EXPOSE 80 \ No newline at end of file diff --git a/Procfile b/Procfile new file mode 100644 index 0000000000..80269037c6 --- /dev/null +++ b/Procfile @@ -0,0 +1 @@ +web: php heroku/startup.php && heroku-php-apache2 public/ \ No newline at end of file diff --git a/README.md b/README.md index 5c5e40fad6..15caeb404f 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -![Build Status](https://app.chipperci.com/projects/0e5f8979-31eb-4ee6-9abf-050b76ab0383/status/master) [![Crowdin](https://d322cqt584bo4o.cloudfront.net/snipe-it/localized.svg)](https://crowdin.com/project/snipe-it) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/snipe/snipe-it?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Docker Pulls](https://img.shields.io/docker/pulls/snipe/snipe-it.svg)](https://hub.docker.com/r/snipe/snipe-it/) [![Twitter Follow](https://img.shields.io/twitter/follow/snipeitapp.svg?style=social)](https://twitter.com/snipeitapp) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/553ce52037fc43ea99149785afcfe641)](https://www.codacy.com/app/snipe/snipe-it?utm_source=github.com&utm_medium=referral&utm_content=snipe/snipe-it&utm_campaign=Badge_Grade) -[![All Contributors](https://img.shields.io/badge/all_contributors-257-orange.svg?style=flat-square)](#contributors) +![Build Status](https://app.chipperci.com/projects/0e5f8979-31eb-4ee6-9abf-050b76ab0383/status/master) [![Crowdin](https://d322cqt584bo4o.cloudfront.net/snipe-it/localized.svg)](https://crowdin.com/project/snipe-it) [![Docker Pulls](https://img.shields.io/docker/pulls/snipe/snipe-it.svg)](https://hub.docker.com/r/snipe/snipe-it/) [![Twitter Follow](https://img.shields.io/twitter/follow/snipeitapp.svg?style=social)](https://twitter.com/snipeitapp) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/553ce52037fc43ea99149785afcfe641)](https://www.codacy.com/app/snipe/snipe-it?utm_source=github.com&utm_medium=referral&utm_content=snipe/snipe-it&utm_campaign=Badge_Grade) +[![All Contributors](https://img.shields.io/badge/all_contributors-273-orange.svg?style=flat-square)](#contributors) [![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/yZFtShAcKk) [![huntr](https://cdn.huntr.dev/huntr_security_badge_mono.svg)](https://huntr.dev) ## Snipe-IT - Open Source Asset Management System @@ -19,6 +19,8 @@ For instructions on installing and configuring Snipe-IT on your server, check ou If you're having trouble with the installation, please check the [Common Issues](https://snipe-it.readme.io/docs/common-issues) and [Getting Help](https://snipe-it.readme.io/docs/getting-help) documentation, and search this repository's open *and* closed issues for help. +[![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy) + ----- ### User's Manual For help using Snipe-IT, check out the [user's manual](https://snipe-it.readme.io/docs/overview). @@ -55,11 +57,11 @@ Since the release of the JSON REST API, several third-party developers have been - [Python Module](https://github.com/jbloomer/SnipeIT-PythonAPI) by [@jbloomer](https://github.com/jbloomer) - [SnipeSharp - .NET module in C#](https://github.com/barrycarey/SnipeSharp) by [@barrycarey](https://github.com/barrycarey) -- [InQRy](https://github.com/Microsoft/InQRy) by [@Microsoft](https://github.com/Microsoft) +- [InQRy -unmaintained-](https://github.com/Microsoft/InQRy) by [@Microsoft](https://github.com/Microsoft) - [SnipeitPS](https://github.com/snazy2000/SnipeitPS) by [@snazy2000](https://github.com/snazy2000) - Powershell API Wrapper for Snipe-it - [jamf2snipe](https://github.com/ParadoxGuitarist/jamf2snipe) by [@ParadoxGuitarist](https://github.com/ParadoxGuitarist) - Python script to sync assets between a JAMFPro instance and a Snipe-IT instance - [Marksman](https://github.com/Scope-IT/marksman) - A Windows agent for Snipe-IT -- [Snipe-IT plugin for Jira Service Desk (beta)](https://marketplace.atlassian.com/apps/1220379/snipe-it-for-jira-service-desk-beta?hosting=cloud&tab=overview) - for the upcoming Snipe-IT v5 only +- [Snipe-IT plugin for Jira Service Desk](https://marketplace.atlassian.com/apps/1220964/snipe-it-for-jira) - [Python 3 CSV importer](https://github.com/gastamper/snipeit-csvimporter) - allows importing assets into Snipe-IT based on Item Name rather than Asset Tag. - [Snipe-IT Kubernetes Helm Chart](https://github.com/t3n/helm-charts/tree/master/snipeit) - For more information, [click here](https://hub.helm.sh/charts/t3n/snipeit). - [Snipe-IT Bulk Edit](https://github.com/bricelabelle/snipe-it-bulkedit) - Google Script files to use Google Sheets as a bulk checkout/checkin/edit tool for Snipe-it. @@ -125,7 +127,9 @@ Thanks goes to all of these wonderful people ([emoji key](https://github.com/ken | [
Kevin Köllmann](https://www.kevinkoellmann.de)
[💻](https://github.com/snipe/snipe-it/commits?author=koelle25 "Code") | [
sw-mreyes](https://github.com/sw-mreyes)
[💻](https://github.com/snipe/snipe-it/commits?author=sw-mreyes "Code") | [
Joel Pittet](https://pittet.ca)
[💻](https://github.com/snipe/snipe-it/commits?author=joelpittet "Code") | [
Eli Young](https://elyscape.com)
[💻](https://github.com/snipe/snipe-it/commits?author=elyscape "Code") | [
Raell Dottin](https://github.com/raelldottin)
[💻](https://github.com/snipe/snipe-it/commits?author=raelldottin "Code") | [
Tom Misilo](https://github.com/misilot)
[💻](https://github.com/snipe/snipe-it/commits?author=misilot "Code") | [
David Davenne](http://david.davenne.be)
[💻](https://github.com/snipe/snipe-it/commits?author=JuustoMestari "Code") | | [
Mark Stenglein](https://markstenglein.com)
[💻](https://github.com/snipe/snipe-it/commits?author=ocelotsloth "Code") | [
ajsy](https://github.com/ajsy)
[💻](https://github.com/snipe/snipe-it/commits?author=ajsy "Code") | [
Jan Kiesewetter](https://github.com/t3easy)
[💻](https://github.com/snipe/snipe-it/commits?author=t3easy "Code") | [
Tetrachloromethane250](https://github.com/Tetrachloromethane250)
[💻](https://github.com/snipe/snipe-it/commits?author=Tetrachloromethane250 "Code") | [
Lars Kajes](https://www.kajes.se/)
[💻](https://github.com/snipe/snipe-it/commits?author=kajes "Code") | [
Joly0](https://github.com/Joly0)
[💻](https://github.com/snipe/snipe-it/commits?author=Joly0 "Code") | [
theburger](https://github.com/limeless)
[💻](https://github.com/snipe/snipe-it/commits?author=limeless "Code") | | [
David Valin Alonso](https://github.com/deivishome)
[💻](https://github.com/snipe/snipe-it/commits?author=deivishome "Code") | [
andreaci](https://github.com/andreaci)
[💻](https://github.com/snipe/snipe-it/commits?author=andreaci "Code") | [
Jelle Sebreghts](http://www.jellesebreghts.be)
[💻](https://github.com/snipe/snipe-it/commits?author=Jelle-S "Code") | [
Michael Pietsch](https://github.com/Skywalker-11)
| [
Masudul Haque Shihab](https://github.com/sh1hab)
[💻](https://github.com/snipe/snipe-it/commits?author=sh1hab "Code") | [
Supapong Areeprasertkul](http://www.freedomdive.com/)
[💻](https://github.com/snipe/snipe-it/commits?author=zybersup "Code") | [
Peter Sarossy](https://github.com/psarossy)
[💻](https://github.com/snipe/snipe-it/commits?author=psarossy "Code") | -| [
Renee Margaret McConahy](https://github.com/nepella)
[💻](https://github.com/snipe/snipe-it/commits?author=nepella "Code") | [
JohnnyPicnic](https://github.com/JohnnyPicnic)
[💻](https://github.com/snipe/snipe-it/commits?author=JohnnyPicnic "Code") | [
markbrule](https://github.com/markbrule)
[💻](https://github.com/snipe/snipe-it/commits?author=markbrule "Code") | [
Mike Campbell](https://github.com/mikecmpbll)
[💻](https://github.com/snipe/snipe-it/commits?author=mikecmpbll "Code") | [
tbrconnect](https://github.com/tbrconnect)
[💻](https://github.com/snipe/snipe-it/commits?author=tbrconnect "Code") | +| [
Renee Margaret McConahy](https://github.com/nepella)
[💻](https://github.com/snipe/snipe-it/commits?author=nepella "Code") | [
JohnnyPicnic](https://github.com/JohnnyPicnic)
[💻](https://github.com/snipe/snipe-it/commits?author=JohnnyPicnic "Code") | [
markbrule](https://github.com/markbrule)
[💻](https://github.com/snipe/snipe-it/commits?author=markbrule "Code") | [
Mike Campbell](https://github.com/mikecmpbll)
[💻](https://github.com/snipe/snipe-it/commits?author=mikecmpbll "Code") | [
tbrconnect](https://github.com/tbrconnect)
[💻](https://github.com/snipe/snipe-it/commits?author=tbrconnect "Code") | [
kcoyo](https://github.com/kcoyo)
[💻](https://github.com/snipe/snipe-it/commits?author=kcoyo "Code") | [
Travis Miller](https://travismiller.com/)
[💻](https://github.com/snipe/snipe-it/commits?author=travismiller "Code") | +| [
Evan Taylor](https://github.com/Delta5)
[💻](https://github.com/snipe/snipe-it/commits?author=Delta5 "Code") | [
Petri Asikainen](https://github.com/PetriAsi)
[💻](https://github.com/snipe/snipe-it/commits?author=PetriAsi "Code") | [
derdeagle](https://github.com/derdeagle)
[💻](https://github.com/snipe/snipe-it/commits?author=derdeagle "Code") | [
Mike Frysinger](https://wh0rd.org/)
[💻](https://github.com/snipe/snipe-it/commits?author=vapier "Code") | [
ALPHA](https://github.com/AL4AL)
[💻](https://github.com/snipe/snipe-it/commits?author=AL4AL "Code") | [
FliegenKLATSCH](https://www.ifern.de)
[💻](https://github.com/snipe/snipe-it/commits?author=FliegenKLATSCH "Code") | [
Jeremy Price](https://github.com/jerm)
[💻](https://github.com/snipe/snipe-it/commits?author=jerm "Code") | +| [
Toreg87](https://github.com/Toreg87)
[💻](https://github.com/snipe/snipe-it/commits?author=Toreg87 "Code") | [
Matthew Nickson](https://github.com/Computroniks)
[💻](https://github.com/snipe/snipe-it/commits?author=Computroniks "Code") | [
Jethro Nederhof](https://jethron.id.au)
[💻](https://github.com/snipe/snipe-it/commits?author=jethron "Code") | [
Oskar Stenberg](https://github.com/01ste02)
[💻](https://github.com/snipe/snipe-it/commits?author=01ste02 "Code") | [
Robert-Azelis](https://github.com/Robert-Azelis)
[💻](https://github.com/snipe/snipe-it/commits?author=Robert-Azelis "Code") | [
Alexander William Smith](https://github.com/alwism)
[💻](https://github.com/snipe/snipe-it/commits?author=alwism "Code") | [
PlaneNuts](https://github.com/PlaneNuts)
[💻](https://github.com/snipe/snipe-it/commits?author=PlaneNuts "Code") | This project follows the [all-contributors](https://github.com/kentcdodds/all-contributors) specification. Contributions of any kind welcome! diff --git a/ansible/ubuntu/vagrant_playbook.yml b/ansible/ubuntu/vagrant_playbook.yml index dd25b2e0c2..44b1a6ef00 100755 --- a/ansible/ubuntu/vagrant_playbook.yml +++ b/ansible/ubuntu/vagrant_playbook.yml @@ -199,7 +199,7 @@ - { regexp: '^DB_PASSWORD=', line: 'DB_PASSWORD=vagrant' } - { regexp: '^APP_URL=', line: "APP_URL=http://{{ fqdn }}" } - { regexp: '^APP_ENV=', line: "APP_ENV=development" } - - { regexp: '^APP_DEBUG=', line: "APP_ENV=true" } + - { regexp: '^APP_DEBUG=', line: "APP_DEBUG=true" } - name: Generate application key shell: "php {{ app_path }}/artisan key:generate --force" - name: Artisan Migrate diff --git a/app.json b/app.json new file mode 100644 index 0000000000..c2cdd7b9e0 --- /dev/null +++ b/app.json @@ -0,0 +1,154 @@ +{ + "name": "Snipe-IT", + "description": "Open source asset management.", + "keywords": [ + "asset management", + "it asset" + ], + "website": "https://snipeitapp.com/", + "repository": "https://github.com/snipe/snipe-it", + "logo": "https://pbs.twimg.com/profile_images/976748875733020672/K-HnZCCK_400x400.jpg", + "success_url": "/setup", + "env": { + "APP_ENV": { + "description": "Laravel environment mode. Unless developing the application, this should be production.", + "value": "production" + }, + "APP_DEBUG": { + "description": "Laravel debug mode. Unless developing the application or actively debugging a problem, this should be set to false.", + "value": "false" + }, + "APP_KEY": { + "description": "A secret key for verifying the integrity of signed cookies. (See either https://snipe-it.readme.io/docs/generate-your-app-key or generate at https://coderstoolbox.online/toolbox/generate-symfony-secret)", + "value": "" + }, + "APP_URL": { + "description": "URL where your Snipe-IT install will be available at.", + "value": "https://your-app-name.herokuapp.com" + }, + "APP_TIMEZONE": { + "description": "Which timezone do you want to use for your install? (http://php.net/manual/en/timezones.php)", + "value": "UTC" + }, + "APP_LOCALE": { + "description": "Which language do you want to use for your install? (https://snipe-it.readme.io/docs/configuration#setting-a-language)", + "value": "en" + }, + "MAX_RESULTS": { + "description": "The maximum number of search results that can be returned at one time.", + "value": "500" + }, + "MAIL_DRIVER": { + "description": "Mail driver - Generally SMTP on Heroku - https://snipe-it.readme.io/docs/configuration#required-outgoing-mail-settings", + "value": "smtp" + }, + "MAIL_HOST": { + "description": "SMTP Server Hostname", + "value": "smtp.your.domain.name" + }, + "MAIL_PORT": { + "description": "SMTP Server Port", + "value": "25" + }, + "MAIL_USERNAME": { + "description": "SMTP Server Username", + "value": "YOURUSERNAME" + }, + "MAIL_PASSWORD": { + "description": "SMTP Server Password", + "value": "YOURPASSWORD" + }, + "MAIL_ENCRYPTION": { + "description": "Encryption protocol for email sending.", + "value": "null" + }, + "MAIL_FROM_ADDR": { + "description": "Email from address", + "value": "no-reply@domain.name" + }, + "MAIL_FROM_NAME": { + "description": "Email from Name", + "value": "Snipe-IT" + }, + "MAIL_REPLYTO_ADDR": { + "description": "Email Reply-To address", + "value": "your@domain.name" + }, + "MAIL_REPLYTO_NAME": { + "description": "Email Reply-To Name", + "value": "Snipe-IT" + }, + "MAIL_AUTO_EMBED": { + "description": "Whether or not to embed images in emails (via CID or base64) versus linking to them.", + "value": "true" + }, + "MAIL_AUTO_EMBED_METHOD": { + "description": "Method that should be used for attaching inline images.", + "value": "base64" + }, + "SESSION_LIFETIME": { + "description": "Specify the time in minutes that the session should remain valid.", + "value": "12000" + }, + "EXPIRE_ON_CLOSE": { + "description": "Specify whether or not the logged in session should be expired when the user closes their browser window.", + "value": "false" + }, + "ENCRYPT": { + "description": "Specify whether you wish to use encrypted cookies for your Snipe-IT sessions.", + "value": "true" + }, + "COOKIE_NAME": { + "description": "The name of the cookie set by Snipe-IT for session management.", + "value": "snipeit_session" + }, + "COOKIE_DOMAIN": { + "description": "The domain name that the session cookie should be sent for.", + "value": "your-app-name.herokuapp.com" + }, + "SECURE_COOKIES": { + "description": "Should cookies only be sent for HTTPS connections? Generally true on Heroku.", + "value": "true" + }, + "LOGIN_MAX_ATTEMPTS": { + "description": "The maximum number of failed attempts allowed before the user is throttled.", + "value": "5" + }, + "LOGIN_LOCKOUT_DURATION": { + "description": "The duration (in seconds) that the user should be blocked from attempting to authenticate again.", + "value": "60" + }, + "APP_LOG": { + "description": "Driver to send logs to. (errorlog for stderr)", + "value": "errorlog" + }, + "ALLOW_IFRAMING": { + "description": "Allow Snipe-IT to be loaded using an iFrame?", + "value": "false" + }, + "GOOGLE_MAPS_API": { + "description": "Include your Google Maps API key here if you'd like Snipe-IT to load maps from Google on your locations and suppliers pages.", + "required": false + }, + "BACKUP_ENV": { + "description": "Set this to true if you wish to backup your .env file in your Admin > Backups process.", + "value": "true" + }, + "ENABLE_HSTS": { + "description": "Whether or not to send the HSTS security policy header.", + "value": "false" + } + }, + "formation": { + "web": { + "quantity": 1, + "size": "free" + } + }, + "image": "heroku/php", + "addons": [ + "cleardb:ignite", + "heroku-redis:hobby-dev", + "papertrail:choklad" + ] + } \ No newline at end of file diff --git a/app/Console/Commands/CheckinLicensesFromAllUsers.php b/app/Console/Commands/CheckinLicensesFromAllUsers.php index bcd8583eaf..5e02bffb7b 100644 --- a/app/Console/Commands/CheckinLicensesFromAllUsers.php +++ b/app/Console/Commands/CheckinLicensesFromAllUsers.php @@ -2,10 +2,10 @@ namespace App\Console\Commands; -use App\Models\LicenseSeat; -use Illuminate\Console\Command; -use App\Models\User; use App\Models\License; +use App\Models\LicenseSeat; +use App\Models\User; +use Illuminate\Console\Command; use Illuminate\Database\Eloquent\Model; class CheckinLicensesFromAllUsers extends Command @@ -41,55 +41,48 @@ class CheckinLicensesFromAllUsers extends Command */ public function handle() { - $license_id = $this->option('license_id'); $notify = $this->option('notify'); - if (!$license_id) { + if (! $license_id) { $this->error('ERROR: License ID is required.'); + return false; } - - if (!$license = License::where('id','=',$license_id)->first()) { + if (! $license = License::where('id', '=', $license_id)->first()) { $this->error('Invalid license ID'); + return false; } $this->info('Checking in ALL seats for '.$license->name); - $licenseSeats = LicenseSeat::where('license_id', '=', $license_id) ->whereNotNull('assigned_to') ->with('user') ->get(); - $this->info(' There are ' .$licenseSeats->count(). ' seats checked out: '); + $this->info(' There are '.$licenseSeats->count().' seats checked out: '); - if (!$notify) { + if (! $notify) { $this->info('No mail will be sent.'); } foreach ($licenseSeats as $seat) { - $this->info($seat->user->username .' has a license seat for '.$license->name); + $this->info($seat->user->username.' has a license seat for '.$license->name); $seat->assigned_to = null; if ($seat->save()) { // Override the email address so we don't notify on checkin - if (!$notify) { + if (! $notify) { $seat->user->email = null; } // Log the checkin $seat->logCheckin($seat->user, 'Checked in via cli tool'); } - - - - } - - } } diff --git a/app/Console/Commands/CheckoutLicenseToAllUsers.php b/app/Console/Commands/CheckoutLicenseToAllUsers.php index 0855e5d084..fab2b318c6 100644 --- a/app/Console/Commands/CheckoutLicenseToAllUsers.php +++ b/app/Console/Commands/CheckoutLicenseToAllUsers.php @@ -2,10 +2,10 @@ namespace App\Console\Commands; -use App\Models\LicenseSeat; -use Illuminate\Console\Command; -use App\Models\User; use App\Models\License; +use App\Models\LicenseSeat; +use App\Models\User; +use Illuminate\Console\Command; use Illuminate\Database\Eloquent\Model; class CheckoutLicenseToAllUsers extends Command @@ -41,18 +41,18 @@ class CheckoutLicenseToAllUsers extends Command */ public function handle() { - $license_id = $this->option('license_id'); $notify = $this->option('notify'); - if (!$license_id) { - $this->error('ERROR: License ID is required.'); - return false; + if (! $license_id) { + $this->error('ERROR: License ID is required.'); + + return false; } - - if (!$license = License::where('id','=',$license_id)->with('assignedusers')->first()) { + if (! $license = License::where('id', '=', $license_id)->with('assignedusers')->first()) { $this->error('Invalid license ID'); + return false; } @@ -64,7 +64,7 @@ class CheckoutLicenseToAllUsers extends Command $this->info('Checking out '.$users->count().' of '.$license->getAvailSeatsCountAttribute().' seats for '.$license->name); - if (!$notify) { + if (! $notify) { $this->info('No mail will be sent.'); } @@ -74,14 +74,14 @@ class CheckoutLicenseToAllUsers extends Command // to them if ($user->licenses->where('id', '=', $license_id)->count()) { - $this->info($user->username .' already has this license checked out to them. Skipping... '); + $this->info($user->username.' already has this license checked out to them. Skipping... '); continue; } - // If the license is valid, check that there is an available seat if ($license->availCount()->count() < 1) { $this->error('ERROR: No available seats'); + return false; } @@ -89,13 +89,12 @@ class CheckoutLicenseToAllUsers extends Command // Get the seat ID $licenseSeat = $license->freeSeat(); - // Update the seat with checkout info, - $licenseSeat->assigned_to = $user->id; + $licenseSeat->assigned_to = $user->id; if ($licenseSeat->save()) { // Temporarily null the user's email address so we don't send mail if we're not supposed to - if (!$notify) { + if (! $notify) { $user->email = null; } @@ -103,10 +102,6 @@ class CheckoutLicenseToAllUsers extends Command $licenseSeat->logCheckout('Checked out via cli tool', $user); $this->info('License '.$license_id.' seat '.$licenseSeat->id.' checked out to '.$user->username); } - } - - - } } diff --git a/app/Console/Commands/CreateAdmin.php b/app/Console/Commands/CreateAdmin.php index 7a2c9a1feb..a4b4b9e42c 100644 --- a/app/Console/Commands/CreateAdmin.php +++ b/app/Console/Commands/CreateAdmin.php @@ -37,7 +37,6 @@ class CreateAdmin extends Command */ public function handle() { - $first_name = $this->option('first_name'); $last_name = $this->option('last_name'); $username = $this->option('username'); @@ -45,7 +44,7 @@ class CreateAdmin extends Command $password = $this->option('password'); $show_in_list = $this->argument('show_in_list'); - if (($first_name=='') || ($last_name=='') || ($username=='') || ($email=='') || ($password=='')) { + if (($first_name == '') || ($last_name == '') || ($username == '') || ($email == '') || ($password == '')) { $this->info('ERROR: All fields are required.'); } else { $user = new \App\Models\User; @@ -68,12 +67,9 @@ class CreateAdmin extends Command $errors = $user->getErrors(); foreach ($errors->all() as $error) { - $this->info('ERROR:'. $error); + $this->info('ERROR:'.$error); } - } } - } - } diff --git a/app/Console/Commands/DisableLDAP.php b/app/Console/Commands/DisableLDAP.php index fd2f0a1070..ee707741ee 100644 --- a/app/Console/Commands/DisableLDAP.php +++ b/app/Console/Commands/DisableLDAP.php @@ -38,9 +38,7 @@ class DisableLDAP extends Command */ public function handle() { - if ($this->confirm("\n****************************************************\nThis will disable LDAP support. You will not be able \nto login with an account that does not exist \nlocally in the Snipe-IT local database. \n****************************************************\n\nDo you wish to continue? [y|N]")) { - $setting = Setting::getSettings(); $setting->ldap_enabled = 0; if ($setting->save()) { @@ -51,6 +49,5 @@ class DisableLDAP extends Command } else { $this->info('Canceled. No actions taken.'); } - } } diff --git a/app/Console/Commands/FixDoubleEscape.php b/app/Console/Commands/FixDoubleEscape.php index 64f6aad572..42a1765913 100644 --- a/app/Console/Commands/FixDoubleEscape.php +++ b/app/Console/Commands/FixDoubleEscape.php @@ -37,49 +37,43 @@ class FixDoubleEscape extends Command */ public function handle() { - $tables = [ - '\App\Models\Asset' => ['name'], - '\App\Models\License' => ['name'], - '\App\Models\Consumable' => ['name'], - '\App\Models\Accessory' => ['name'], - '\App\Models\Component' => ['name'], - '\App\Models\Company' => ['name'], - '\App\Models\Manufacturer' => ['name'], - '\App\Models\Supplier' => ['name'], - '\App\Models\Statuslabel' => ['name'], - '\App\Models\Depreciation' => ['name'], - '\App\Models\AssetModel' => ['name'], - '\App\Models\Group' => ['name'], - '\App\Models\Department' => ['name'], - '\App\Models\Location' => ['name'], - '\App\Models\User' => ['first_name', 'last_name'], + \App\Models\Asset::class => ['name'], + \App\Models\License::class => ['name'], + \App\Models\Consumable::class => ['name'], + \App\Models\Accessory::class => ['name'], + \App\Models\Component::class => ['name'], + \App\Models\Company::class => ['name'], + \App\Models\Manufacturer::class => ['name'], + \App\Models\Supplier::class => ['name'], + \App\Models\Statuslabel::class => ['name'], + \App\Models\Depreciation::class => ['name'], + \App\Models\AssetModel::class => ['name'], + \App\Models\Group::class => ['name'], + \App\Models\Department::class => ['name'], + \App\Models\Location::class => ['name'], + \App\Models\User::class => ['first_name', 'last_name'], ]; - $count = array(); + $count = []; + foreach ($tables as $classname => $fields) { + $count[$classname] = []; + $count[$classname]['classname'] = 0; + foreach ($fields as $field) { + $count[$classname]['classname']++; + $count[$classname][$field] = 0; - foreach ($tables as $classname => $fields) { - $count[$classname] = array(); - $count[$classname]['classname'] = 0; - - foreach($fields as $field) { - - $count[$classname]['classname']++; - $count[$classname][$field] = 0; - - foreach($classname::where("$field",'LIKE','%&%')->get() as $row) { - $this->info('Updating '.$field.' for '.$classname); - $row->{$field} = html_entity_decode($row->{$field},ENT_QUOTES); - $row->save(); - $count[$classname][$field]++; - - } + foreach ($classname::where("$field", 'LIKE', '%&%')->get() as $row) { + $this->info('Updating '.$field.' for '.$classname); + $row->{$field} = html_entity_decode($row->{$field}, ENT_QUOTES); + $row->save(); + $count[$classname][$field]++; } } + } $this->info('Update complete'); - } } diff --git a/app/Console/Commands/FixMismatchedAssetsAndLogs.php b/app/Console/Commands/FixMismatchedAssetsAndLogs.php index 45a1694dd7..34b6b3edfc 100644 --- a/app/Console/Commands/FixMismatchedAssetsAndLogs.php +++ b/app/Console/Commands/FixMismatchedAssetsAndLogs.php @@ -29,7 +29,6 @@ class FixMismatchedAssetsAndLogs extends Command */ private $dryrun = false; - /** * Create a new command instance. * @@ -47,30 +46,29 @@ class FixMismatchedAssetsAndLogs extends Command */ public function handle() { - if ($this->option('dryrun')) { $this->dryrun = true; } if ($this->dryrun) { - $this->info('This is a DRY RUN - no changes will be saved.' ); + $this->info('This is a DRY RUN - no changes will be saved.'); } $mismatch_count = 0; $assets = Asset::whereNotNull('assigned_to') - ->where('assigned_type', '=', 'App\\Models\\User') + ->where('assigned_type', '=', \App\Models\User::class) ->orderBy('id', 'ASC')->get(); foreach ($assets as $asset) { // get the last checkout of the asset - if ($checkout_log = Actionlog::where('target_type', '=', 'App\\Models\\User') + if ($checkout_log = Actionlog::where('target_type', '=', \App\Models\User::class) ->where('action_type', '=', 'checkout') ->where('item_id', '=', $asset->id) ->orderBy('created_at', 'DESC') ->first()) { // Now check for a subsequent checkin log - we want to ignore those - if (!$checkin_log = Actionlog::where('target_type', '=', 'App\\Models\\User') + if (! $checkin_log = Actionlog::where('target_type', '=', \App\Models\User::class) ->where('action_type', '=', 'checkin from') ->where('item_id', '=', $asset->id) ->whereDate('created_at', '>', $checkout_log->created_at) @@ -78,28 +76,24 @@ class FixMismatchedAssetsAndLogs extends Command ->first()) { //print_r($asset); - if ($checkout_log->target_id != $asset->assigned_to) { - $this->error('Log ID: '.$checkout_log->id.' -- Asset ID '. $checkout_log->item_id.' SHOULD BE checked out to User '.$checkout_log->target_id.' but its assigned_to is '.$asset->assigned_to ); + if ($checkout_log->target_id != $asset->assigned_to) { + $this->error('Log ID: '.$checkout_log->id.' -- Asset ID '.$checkout_log->item_id.' SHOULD BE checked out to User '.$checkout_log->target_id.' but its assigned_to is '.$asset->assigned_to); - if (!$this->dryrun) { - $asset->assigned_to = $checkout_log->target_id; - if ($asset->save()) { - $this->info('Asset record updated.'); - } else { - $this->error('Error updating asset: '.$asset->getErrors()); - } + if (! $this->dryrun) { + $asset->assigned_to = $checkout_log->target_id; + if ($asset->save()) { + $this->info('Asset record updated.'); + } else { + $this->error('Error updating asset: '.$asset->getErrors()); } - $mismatch_count++; } - } else { - //$this->info('Asset ID '.$asset->id.': There is a checkin '.$checkin_log->created_at.' after this checkout '.$checkout_log->created_at); - + $mismatch_count++; } - + } else { + //$this->info('Asset ID '.$asset->id.': There is a checkin '.$checkin_log->created_at.' after this checkout '.$checkout_log->created_at); + } } - } $this->info($mismatch_count.' mismatched assets.'); - } } diff --git a/app/Console/Commands/ImportLocations.php b/app/Console/Commands/ImportLocations.php index a0512aa393..3bd28f7f25 100644 --- a/app/Console/Commands/ImportLocations.php +++ b/app/Console/Commands/ImportLocations.php @@ -2,9 +2,9 @@ namespace App\Console\Commands; +use App\Models\Location; use Illuminate\Console\Command; use League\Csv\Reader; -use App\Models\Location; class ImportLocations extends Command { @@ -39,10 +39,8 @@ class ImportLocations extends Command */ public function handle() { - - - if (!ini_get("auto_detect_line_endings")) { - ini_set("auto_detect_line_endings", '1'); + if (! ini_get('auto_detect_line_endings')) { + ini_set('auto_detect_line_endings', '1'); } $filename = $this->argument('filename'); @@ -53,18 +51,17 @@ class ImportLocations extends Command // Import parent location names first if they don't exist foreach ($results as $parent_index => $parent_row) { - if (array_key_exists('Parent Name', $parent_row)) { $parent_name = trim($parent_row['Parent Name']); if (array_key_exists('Name', $parent_row)) { - $this->info('- Parent: ' . $parent_name . ' in row as: ' . trim($parent_row['Parent Name'])); + $this->info('- Parent: '.$parent_name.' in row as: '.trim($parent_row['Parent Name'])); } // Save parent location name // This creates a sort of name-stub that we'll update later on in this script - $parent_location = Location::firstOrCreate(array('name' => $parent_name)); + $parent_location = Location::firstOrCreate(['name' => $parent_name]); if (array_key_exists('Name', $parent_row)) { - $this->info('Parent for ' . $parent_row['Name'] . ' is ' . $parent_name . '. Attempting to save ' . $parent_name . '.'); + $this->info('Parent for '.$parent_row['Name'].' is '.$parent_name.'. Attempting to save '.$parent_name.'.'); } // Check if the record was updated or created. @@ -74,18 +71,15 @@ class ImportLocations extends Command } else { $this->info('- Parent location '.$parent_name.' was created.'); } - } else { $this->info('- No Parent Name provided, so no parent location will be created.'); } - } $this->info('----- Parents Created.... backfilling additional details... --------'); // Loop through ALL records and add/update them if there are additional fields // besides name foreach ($results as $index => $row) { - if (array_key_exists('Parent Name', $row)) { $parent_name = trim($row['Parent Name']); } else { @@ -94,11 +88,12 @@ class ImportLocations extends Command // Set the location attributes to save if (array_key_exists('Name', $row)) { - $location = Location::firstOrCreate(array('name' => trim($row['Name']))); + $location = Location::firstOrCreate(['name' => trim($row['Name'])]); $location->name = trim($row['Name']); $this->info('Checking location: '.$location->name); } else { $this->error('Location name is required and is missing from at least one row in this dataset. Check your CSV for extra trailing rows and try again.'); + return false; } if (array_key_exists('Currency', $row)) { @@ -126,7 +121,6 @@ class ImportLocations extends Command $location->ldap_ou = trim($row['OU']); } - // If a parent name is provided, we created it earlier in the script, // so let's grab that ID if ($parent_name) { @@ -142,21 +136,15 @@ class ImportLocations extends Command // Check if the record was updated or created. // This is mostly for clearer debugging. if ($location->exists) { - $this->info('Location ' . $location->name . ' already exists. Updating...'); + $this->info('Location '.$location->name.' already exists. Updating...'); } else { $this->info('- Location '.$location->name.' was created. '); } - // If there's a validation error, display that + // If there's a validation error, display that } else { - $this->error('- Non-parent Location '.$location->name.' could not be created: '.$location->getErrors() ); + $this->error('- Non-parent Location '.$location->name.' could not be created: '.$location->getErrors()); } - - - - } - - } } diff --git a/app/Console/Commands/LdapSync.php b/app/Console/Commands/LdapSync.php index 9e337084a4..45a9bd44a6 100755 --- a/app/Console/Commands/LdapSync.php +++ b/app/Console/Commands/LdapSync.php @@ -3,11 +3,11 @@ namespace App\Console\Commands; use App\Models\Department; -use Illuminate\Console\Command; -use App\Models\Setting; use App\Models\Ldap; -use App\Models\User; use App\Models\Location; +use App\Models\Setting; +use App\Models\User; +use Illuminate\Console\Command; use Log; class LdapSync extends Command @@ -54,7 +54,7 @@ class LdapSync extends Command $ldap_result_email = Setting::getSettings()->ldap_email; $ldap_result_phone = Setting::getSettings()->ldap_phone_field; $ldap_result_jobtitle = Setting::getSettings()->ldap_jobtitle; - $ldap_result_country = Setting::getSettings()->ldap_country; + $ldap_result_country = Setting::getSettings()->ldap_country; $ldap_result_dept = Setting::getSettings()->ldap_dept; try { @@ -62,14 +62,15 @@ class LdapSync extends Command Ldap::bindAdminToLdap($ldapconn); } catch (\Exception $e) { if ($this->option('json_summary')) { - $json_summary = [ "error" => true, "error_message" => $e->getMessage(), "summary" => [] ]; + $json_summary = ['error' => true, 'error_message' => $e->getMessage(), 'summary' => []]; $this->info(json_encode($json_summary)); } LOG::info($e); + return []; } - $summary = array(); + $summary = []; try { if ($this->option('base_dn') != '') { @@ -81,78 +82,78 @@ class LdapSync extends Command $results = Ldap::findLdapUsers($search_base); } catch (\Exception $e) { if ($this->option('json_summary')) { - $json_summary = [ "error" => true, "error_message" => $e->getMessage(), "summary" => [] ]; + $json_summary = ['error' => true, 'error_message' => $e->getMessage(), 'summary' => []]; $this->info(json_encode($json_summary)); } LOG::info($e); + return []; } /* Determine which location to assign users to by default. */ - $location = NULL; // FIXME - this would be better called "$default_location", which is more explicit about its purpose + $location = null; // FIXME - this would be better called "$default_location", which is more explicit about its purpose - if ($this->option('location')!='') { + if ($this->option('location') != '') { $location = Location::where('name', '=', $this->option('location'))->first(); LOG::debug('Location name '.$this->option('location').' passed'); LOG::debug('Importing to '.$location->name.' ('.$location->id.')'); - } elseif ($this->option('location_id')!='') { + } elseif ($this->option('location_id') != '') { $location = Location::where('id', '=', $this->option('location_id'))->first(); LOG::debug('Location ID '.$this->option('location_id').' passed'); LOG::debug('Importing to '.$location->name.' ('.$location->id.')'); } - if (!isset($location)) { + if (! isset($location)) { LOG::debug('That location is invalid or a location was not provided, so no location will be assigned by default.'); } /* Process locations with explicitly defined OUs, if doing a full import. */ - if ($this->option('base_dn')=='') { + if ($this->option('base_dn') == '') { // Retrieve locations with a mapped OU, and sort them from the shallowest to deepest OU (see #3993) $ldap_ou_locations = Location::where('ldap_ou', '!=', '')->get()->toArray(); - $ldap_ou_lengths = array(); + $ldap_ou_lengths = []; foreach ($ldap_ou_locations as $ou_loc) { - $ldap_ou_lengths[] = strlen($ou_loc["ldap_ou"]); + $ldap_ou_lengths[] = strlen($ou_loc['ldap_ou']); } array_multisort($ldap_ou_lengths, SORT_ASC, $ldap_ou_locations); - if (sizeof($ldap_ou_locations) > 0) { + if (count($ldap_ou_locations) > 0) { LOG::debug('Some locations have special OUs set. Locations will be automatically set for users in those OUs.'); } // Inject location information fields - for ($i = 0; $i < $results["count"]; $i++) { - $results[$i]["ldap_location_override"] = false; - $results[$i]["location_id"] = 0; + for ($i = 0; $i < $results['count']; $i++) { + $results[$i]['ldap_location_override'] = false; + $results[$i]['location_id'] = 0; } // Grab subsets based on location-specific DNs, and overwrite location for these users. foreach ($ldap_ou_locations as $ldap_loc) { try { - $location_users = Ldap::findLdapUsers($ldap_loc["ldap_ou"]); + $location_users = Ldap::findLdapUsers($ldap_loc['ldap_ou']); } catch (\Exception $e) { // FIXME: this is stolen from line 77 or so above if ($this->option('json_summary')) { - $json_summary = [ "error" => true, "error_message" => trans('admin/users/message.error.ldap_could_not_search')." Location: ".$ldap_loc['name']." (ID: ".$ldap_loc['id'].") cannot connect to \"".$ldap_loc["ldap_ou"]."\" - ".$e->getMessage(), "summary" => [] ]; + $json_summary = ['error' => true, 'error_message' => trans('admin/users/message.error.ldap_could_not_search').' Location: '.$ldap_loc['name'].' (ID: '.$ldap_loc['id'].') cannot connect to "'.$ldap_loc['ldap_ou'].'" - '.$e->getMessage(), 'summary' => []]; $this->info(json_encode($json_summary)); } LOG::info($e); + return []; } - $usernames = array(); - for ($i = 0; $i < $location_users["count"]; $i++) { - + $usernames = []; + for ($i = 0; $i < $location_users['count']; $i++) { if (array_key_exists($ldap_result_username, $location_users[$i])) { - $location_users[$i]["ldap_location_override"] = true; - $location_users[$i]["location_id"] = $ldap_loc["id"]; + $location_users[$i]['ldap_location_override'] = true; + $location_users[$i]['location_id'] = $ldap_loc['id']; $usernames[] = $location_users[$i][$ldap_result_username][0]; } - } // Delete located users from the general group. foreach ($results as $key => $generic_entry) { - if ((is_array($generic_entry)) && (array_key_exists($ldap_result_username, $generic_entry))) { + if ((is_array($generic_entry)) && (array_key_exists($ldap_result_username, $generic_entry))) { if (in_array($generic_entry[$ldap_result_username][0], $usernames)) { unset($results[$key]); } @@ -166,55 +167,52 @@ class LdapSync extends Command } /* Create user account entries in Snipe-IT */ - $tmp_pass = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 20); + $tmp_pass = substr(str_shuffle('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'), 0, 20); $pass = bcrypt($tmp_pass); - for ($i = 0; $i < $results["count"]; $i++) { - if (empty($ldap_result_active_flag) || $results[$i][$ldap_result_active_flag][0] == "TRUE") { - - $item = array(); - $item["username"] = isset($results[$i][$ldap_result_username][0]) ? $results[$i][$ldap_result_username][0] : ""; - $item["employee_number"] = isset($results[$i][$ldap_result_emp_num][0]) ? $results[$i][$ldap_result_emp_num][0] : ""; - $item["lastname"] = isset($results[$i][$ldap_result_last_name][0]) ? $results[$i][$ldap_result_last_name][0] : ""; - $item["firstname"] = isset($results[$i][$ldap_result_first_name][0]) ? $results[$i][$ldap_result_first_name][0] : ""; - $item["email"] = isset($results[$i][$ldap_result_email][0]) ? $results[$i][$ldap_result_email][0] : "" ; - $item["ldap_location_override"] = isset($results[$i]["ldap_location_override"]) ? $results[$i]["ldap_location_override"]:""; - $item["location_id"] = isset($results[$i]["location_id"]) ? $results[$i]["location_id"]:""; - $item["telephone"] = isset($results[$i][$ldap_result_phone][0]) ? $results[$i][$ldap_result_phone][0] : ""; - $item["jobtitle"] = isset($results[$i][$ldap_result_jobtitle][0]) ? $results[$i][$ldap_result_jobtitle][0] : ""; - $item["country"] = isset($results[$i][$ldap_result_country][0]) ? $results[$i][$ldap_result_country][0] : ""; - $item["department"] = isset($results[$i][$ldap_result_dept][0]) ? $results[$i][$ldap_result_dept][0] : ""; - + for ($i = 0; $i < $results['count']; $i++) { + if (empty($ldap_result_active_flag) || $results[$i][$ldap_result_active_flag][0] == 'TRUE') { + $item = []; + $item['username'] = isset($results[$i][$ldap_result_username][0]) ? $results[$i][$ldap_result_username][0] : ''; + $item['employee_number'] = isset($results[$i][$ldap_result_emp_num][0]) ? $results[$i][$ldap_result_emp_num][0] : ''; + $item['lastname'] = isset($results[$i][$ldap_result_last_name][0]) ? $results[$i][$ldap_result_last_name][0] : ''; + $item['firstname'] = isset($results[$i][$ldap_result_first_name][0]) ? $results[$i][$ldap_result_first_name][0] : ''; + $item['email'] = isset($results[$i][$ldap_result_email][0]) ? $results[$i][$ldap_result_email][0] : ''; + $item['ldap_location_override'] = isset($results[$i]['ldap_location_override']) ? $results[$i]['ldap_location_override'] : ''; + $item['location_id'] = isset($results[$i]['location_id']) ? $results[$i]['location_id'] : ''; + $item['telephone'] = isset($results[$i][$ldap_result_phone][0]) ? $results[$i][$ldap_result_phone][0] : ''; + $item['jobtitle'] = isset($results[$i][$ldap_result_jobtitle][0]) ? $results[$i][$ldap_result_jobtitle][0] : ''; + $item['country'] = isset($results[$i][$ldap_result_country][0]) ? $results[$i][$ldap_result_country][0] : ''; + $item['department'] = isset($results[$i][$ldap_result_dept][0]) ? $results[$i][$ldap_result_dept][0] : ''; $department = Department::firstOrCreate([ - 'name' => $item["department"], + 'name' => $item['department'], ]); - - $user = User::where('username', $item["username"])->first(); + $user = User::where('username', $item['username'])->first(); if ($user) { // Updating an existing user. - $item["createorupdate"] = 'updated'; + $item['createorupdate'] = 'updated'; } else { // Creating a new user. $user = new User; $user->password = $pass; $user->activated = 0; - $item["createorupdate"] = 'created'; + $item['createorupdate'] = 'created'; } - $user->first_name = $item["firstname"]; - $user->last_name = $item["lastname"]; - $user->username = $item["username"]; - $user->email = $item["email"]; - $user->employee_num = e($item["employee_number"]); - $user->phone = $item["telephone"]; - $user->jobtitle = $item["jobtitle"]; - $user->country = $item["country"]; + $user->first_name = $item['firstname']; + $user->last_name = $item['lastname']; + $user->username = $item['username']; + $user->email = $item['email']; + $user->employee_num = e($item['employee_number']); + $user->phone = $item['telephone']; + $user->jobtitle = $item['jobtitle']; + $user->country = $item['country']; $user->department_id = $department->id; // Sync activated state for Active Directory. - if ( array_key_exists('useraccountcontrol', $results[$i]) ) { + if (array_key_exists('useraccountcontrol', $results[$i])) { /* The following is _probably_ the correct logic, but we can't use it because some users may have been dependent upon the previous behavior, and this could cause additional access to be available to users they don't want @@ -231,7 +229,7 @@ class LdapSync extends Command } else { $user->activated = 0; } */ - $enabled_accounts = [ + $enabled_accounts = [ '512', // 0x200 NORMAL_ACCOUNT '544', // 0x220 NORMAL_ACCOUNT, PASSWD_NOTREQD '66048', // 0x10200 NORMAL_ACCOUNT, DONT_EXPIRE_PASSWORD @@ -240,27 +238,25 @@ class LdapSync extends Command '262688', // 0x40220 NORMAL_ACCOUNT, PASSWD_NOTREQD, SMARTCARD_REQUIRED '328192', // 0x50200 NORMAL_ACCOUNT, SMARTCARD_REQUIRED, DONT_EXPIRE_PASSWORD '328224', // 0x50220 NORMAL_ACCOUNT, PASSWD_NOT_REQD, SMARTCARD_REQUIRED, DONT_EXPIRE_PASSWORD - '4260352',// 0x410200 NORMAL_ACCOUNT, DONT_EXPIRE_PASSWORD, DONT_REQ_PREAUTH - '1049088',// 0x100200 NORMAL_ACCOUNT, NOT_DELEGATED + '4260352', // 0x410200 NORMAL_ACCOUNT, DONT_EXPIRE_PASSWORD, DONT_REQ_PREAUTH + '1049088', // 0x100200 NORMAL_ACCOUNT, NOT_DELEGATED ]; - $user->activated = ( in_array($results[$i]['useraccountcontrol'][0], $enabled_accounts) ) ? 1 : 0; + $user->activated = (in_array($results[$i]['useraccountcontrol'][0], $enabled_accounts)) ? 1 : 0; } // If we're not using AD, and there isn't an activated flag set, activate all users elseif (empty($ldap_result_active_flag)) { - $user->activated = 1; + $user->activated = 1; } if ($item['ldap_location_override'] == true) { $user->location_id = $item['location_id']; - } elseif ((isset($location)) && (!empty($location))) { - + } elseif ((isset($location)) && (! empty($location))) { if ((is_array($location)) && (array_key_exists('id', $location))) { $user->location_id = $location['id']; } elseif (is_object($location)) { $user->location_id = $location->id; } - } $user->ldap_import = 1; @@ -268,31 +264,30 @@ class LdapSync extends Command $errors = ''; if ($user->save()) { - $item["note"] = $item["createorupdate"]; - $item["status"]='success'; + $item['note'] = $item['createorupdate']; + $item['status'] = 'success'; } else { foreach ($user->getErrors()->getMessages() as $key => $err) { $errors .= $err[0]; } - $item["note"] = $errors; - $item["status"]='error'; + $item['note'] = $errors; + $item['status'] = 'error'; } array_push($summary, $item); } - } if ($this->option('summary')) { for ($x = 0; $x < count($summary); $x++) { - if ($summary[$x]['status']=='error') { + if ($summary[$x]['status'] == 'error') { $this->error('ERROR: '.$summary[$x]['firstname'].' '.$summary[$x]['lastname'].' (username: '.$summary[$x]['username'].') was not imported: '.$summary[$x]['note']); } else { $this->info('User '.$summary[$x]['firstname'].' '.$summary[$x]['lastname'].' (username: '.$summary[$x]['username'].') was '.strtoupper($summary[$x]['createorupdate']).'.'); } } - } else if ($this->option('json_summary')) { - $json_summary = [ "error" => false, "error_message" => "", "summary" => $summary ]; // hardcoding the error to false and the error_message to blank seems a bit weird + } elseif ($this->option('json_summary')) { + $json_summary = ['error' => false, 'error_message' => '', 'summary' => $summary]; // hardcoding the error to false and the error_message to blank seems a bit weird $this->info(json_encode($json_summary)); } else { return $summary; diff --git a/app/Console/Commands/LdapSyncNg.php b/app/Console/Commands/LdapSyncNg.php index 527a99777c..b271c6c10c 100644 --- a/app/Console/Commands/LdapSyncNg.php +++ b/app/Console/Commands/LdapSyncNg.php @@ -4,13 +4,13 @@ declare(strict_types=1); namespace App\Console\Commands; -use Log; -use Exception; +use Adldap\Models\User as AdldapUser; +use App\Models\Location; use App\Models\User; use App\Services\LdapAd; -use App\Models\Location; +use Exception; use Illuminate\Console\Command; -use Adldap\Models\User as AdldapUser; +use Log; /** * LDAP / AD sync command. @@ -96,9 +96,9 @@ class LdapSyncNg extends Command public function __construct(LdapAd $ldap) { parent::__construct(); - $this->ldap = $ldap; + $this->ldap = $ldap; $this->settings = $this->ldap->ldapSettings; - $this->summary = collect(); + $this->summary = collect(); } /** @@ -108,22 +108,21 @@ class LdapSyncNg extends Command */ public function handle() { - - $dispatcher = \Adldap\Adldap::getEventDispatcher(); + $dispatcher = \Adldap\Adldap::getEventDispatcher(); // Listen for all model events. $dispatcher->listen('Adldap\Models\Events\*', function ($eventName, array $data) { echo $eventName; // Returns 'Adldap\Models\Events\Updating' var_dump($data); // Returns [0] => (object) Adldap\Models\Events\Updating; - \Log::debug("Event: ".$eventName." data - ".print_r($data, true)); + \Log::debug('Event: '.$eventName.' data - '.print_r($data, true)); }); $dispatcher->listen('Adldap\Auth\Events\*', function ($eventName, array $data) { echo $eventName; // Returns 'Adldap\Models\Events\Updating' var_dump($data); // Returns [0] => (object) Adldap\Models\Events\Updating; - \Log::debug("Event: ".$eventName." data - ".print_r($data, true)); + \Log::debug('Event: '.$eventName.' data - '.print_r($data, true)); }); - ini_set('max_execution_time', env('LDAP_TIME_LIM', "600")); //600 seconds = 10 minutes + ini_set('max_execution_time', env('LDAP_TIME_LIM', '600')); //600 seconds = 10 minutes ini_set('memory_limit', '500M'); $old_error_reporting = error_reporting(); // grab old error_reporting .ini setting, for later re-enablement error_reporting($old_error_reporting & ~E_DEPRECATED); // disable deprecation warnings, for LDAP in PHP 7.4 (and greater) @@ -138,7 +137,7 @@ class LdapSyncNg extends Command /* * Use the default location if set, this is needed for the LDAP users sync page */ - if (!$this->option('base_dn') && null == $this->defaultLocation) { + if (! $this->option('base_dn') && null == $this->defaultLocation) { $this->getMappedLocations(); } $this->processLdapUsers(); @@ -150,6 +149,7 @@ class LdapSyncNg extends Command } error_reporting($old_error_reporting); // re-enable deprecation warnings. + return $this->getSummary(); } @@ -205,17 +205,17 @@ class LdapSyncNg extends Command 'location_id' => $user->location_id, ]; // Only update the database if is not a dry run - if (!$this->dryrun) { + if (! $this->dryrun) { if ($user->isDirty()) { //if nothing on the user changed, don't bother trying to save anything nor put anything in the summary if ($user->save()) { - $summary['note'] = ($user->wasRecentlyCreated ? 'CREATED' : 'UPDATED'); + $summary['note'] = ($user->wasRecentlyCreated ? 'CREATED' : 'UPDATED'); $summary['status'] = 'SUCCESS'; } else { $errors = ''; foreach ($user->getErrors()->getMessages() as $error) { - $errors .= implode(", ",$error); + $errors .= implode(', ', $error); } - $summary['note'] = $snipeUser->getDN().' was not imported. REASON: '.$errors; + $summary['note'] = $snipeUser->getDN().' was not imported. REASON: '.$errors; $summary['status'] = 'ERROR'; } } else { @@ -224,7 +224,7 @@ class LdapSyncNg extends Command } // $summary['note'] = ($user->getOriginal('username') ? 'UPDATED' : 'CREATED'); // this seems, kinda, like, superfluous, relative to the $summary['note'] thing above, yeah? - if($summary) { //if the $user wasn't dirty, $summary was set to null so that we will skip the following push() + if ($summary) { //if the $user wasn't dirty, $summary was set to null so that we will skip the following push() $this->summary->push($summary); } } @@ -235,14 +235,13 @@ class LdapSyncNg extends Command * @author Wes Hulette * * @since 5.0.0 - * */ private function processLdapUsers(): void { try { - \Log::debug("CAL:LING GET LDAP SUSERS"); + \Log::debug('CAL:LING GET LDAP SUSERS'); $ldapUsers = $this->ldap->getLdapUsers(); - \Log::debug("END CALLING GET LDAP USERS"); + \Log::debug('END CALLING GET LDAP USERS'); } catch (Exception $e) { $this->outputError($e); exit($e->getMessage()); diff --git a/app/Console/Commands/MergeUsersByUsername.php b/app/Console/Commands/MergeUsersByUsername.php index 95278817ea..a3eb8f2d95 100644 --- a/app/Console/Commands/MergeUsersByUsername.php +++ b/app/Console/Commands/MergeUsersByUsername.php @@ -2,10 +2,9 @@ namespace App\Console\Commands; -use Illuminate\Console\Command; use App\Models\User; use Carbon\Carbon; - +use Illuminate\Console\Command; class MergeUsersByUsername extends Command { @@ -44,7 +43,7 @@ class MergeUsersByUsername extends Command $users = User::where('username', 'LIKE', '%@%')->whereNull('deleted_at')->get(); foreach ($users as $user) { - $parts = explode("@", $user->username); + $parts = explode('@', $user->username); $bad_users = User::where('username', '=', $parts[0])->whereNull('deleted_at')->with('assets', 'manager', 'userlog', 'licenses', 'consumables', 'accessories', 'managedLocations')->get(); foreach ($bad_users as $bad_user) { @@ -52,61 +51,55 @@ class MergeUsersByUsername extends Command // Walk the list of assets foreach ($bad_user->assets as $asset) { - $this->info( 'Updating asset '.$asset->asset_tag.' '.$asset->id.' to user '.$user->id); + $this->info('Updating asset '.$asset->asset_tag.' '.$asset->id.' to user '.$user->id); $asset->assigned_to = $user->id; - if (!$asset->save()) { - $this->error( 'Could not update assigned_to field on asset '.$asset->asset_tag.' '.$asset->id.' to user '.$user->id); - $this->error( 'Error saving: '.$asset->getErrors()); + if (! $asset->save()) { + $this->error('Could not update assigned_to field on asset '.$asset->asset_tag.' '.$asset->id.' to user '.$user->id); + $this->error('Error saving: '.$asset->getErrors()); } } // Walk the list of licenses foreach ($bad_user->licenses as $license) { - $this->info( 'Updating license '.$license->name.' '.$license->id.' to user '.$user->id); + $this->info('Updating license '.$license->name.' '.$license->id.' to user '.$user->id); $bad_user->licenses()->updateExistingPivot($license->id, ['assigned_to' => $user->id]); } // Walk the list of consumables foreach ($bad_user->consumables as $consumable) { - $this->info( 'Updating consumable '.$consumable->id.' to user '.$user->id); + $this->info('Updating consumable '.$consumable->id.' to user '.$user->id); $bad_user->consumables()->updateExistingPivot($consumable->id, ['assigned_to' => $user->id]); } // Walk the list of accessories foreach ($bad_user->accessories as $accessory) { - $this->info( 'Updating accessory '.$accessory->id.' to user '.$user->id); + $this->info('Updating accessory '.$accessory->id.' to user '.$user->id); $bad_user->accessories()->updateExistingPivot($accessory->id, ['assigned_to' => $user->id]); } // Walk the list of logs foreach ($bad_user->userlog as $log) { - $this->info( 'Updating action log record '.$log->id.' to user '.$user->id); + $this->info('Updating action log record '.$log->id.' to user '.$user->id); $log->target_id = $user->id; $log->save(); } // Update any manager IDs - $this->info( 'Updating managed user records to user '.$user->id); + $this->info('Updating managed user records to user '.$user->id); User::where('manager_id', '=', $bad_user->id)->update(['manager_id' => $user->id]); - // Update location manager IDs foreach ($bad_user->managedLocations as $managedLocation) { - $this->info( 'Updating managed location record '.$managedLocation->name.' to manager '.$user->id); + $this->info('Updating managed location record '.$managedLocation->name.' to manager '.$user->id); $managedLocation->manager_id = $user->id; $managedLocation->save(); } // Mark the user as deleted - $this->info( 'Marking the user as deleted'); + $this->info('Marking the user as deleted'); $bad_user->deleted_at = Carbon::now()->timestamp; $bad_user->save(); - - } - } - - } } diff --git a/app/Console/Commands/MoveUploadsToNewDisk.php b/app/Console/Commands/MoveUploadsToNewDisk.php index 9bd3a94aba..8fa5ddafd7 100644 --- a/app/Console/Commands/MoveUploadsToNewDisk.php +++ b/app/Console/Commands/MoveUploadsToNewDisk.php @@ -2,7 +2,6 @@ namespace App\Console\Commands; - use Illuminate\Console\Command; use Illuminate\Support\Facades\Storage; @@ -39,39 +38,37 @@ class MoveUploadsToNewDisk extends Command */ public function handle() { - - if (config('filesystems.default')=='local') { + if (config('filesystems.default') == 'local') { $this->error('Your current disk is set to local so we cannot proceed.'); $this->warn("Please configure your .env settings for S3. \nChange your PUBLIC_FILESYSTEM_DISK value to 's3_public' and your PRIVATE_FILESYSTEM_DISK to s3_private."); + return false; } $delete_local = $this->argument('delete_local'); - $public_uploads['accessories'] = glob('public/accessories'."/*.*"); - $public_uploads['assets'] = glob('public/assets'."/*.*"); - $public_uploads['avatars'] = glob('public/avatars'."/*.*"); - $public_uploads['categories'] = glob('public/categories'."/*.*"); - $public_uploads['companies'] = glob('public/companies'."/*.*"); - $public_uploads['components'] = glob('public/components'."/*.*"); - $public_uploads['consumables'] = glob('public/consumables'."/*.*"); - $public_uploads['departments'] = glob('public/departments'."/*.*"); - $public_uploads['locations'] = glob('public/locations'."/*.*"); - $public_uploads['manufacturers'] = glob('public/manufacturers'."/*.*"); - $public_uploads['suppliers'] = glob('public/suppliers'."/*.*"); - $public_uploads['assetmodels'] = glob('public/models'."/*.*"); - + $public_uploads['accessories'] = glob('public/accessories'.'/*.*'); + $public_uploads['assets'] = glob('public/assets'.'/*.*'); + $public_uploads['avatars'] = glob('public/avatars'.'/*.*'); + $public_uploads['categories'] = glob('public/categories'.'/*.*'); + $public_uploads['companies'] = glob('public/companies'.'/*.*'); + $public_uploads['components'] = glob('public/components'.'/*.*'); + $public_uploads['consumables'] = glob('public/consumables'.'/*.*'); + $public_uploads['departments'] = glob('public/departments'.'/*.*'); + $public_uploads['locations'] = glob('public/locations'.'/*.*'); + $public_uploads['manufacturers'] = glob('public/manufacturers'.'/*.*'); + $public_uploads['suppliers'] = glob('public/suppliers'.'/*.*'); + $public_uploads['assetmodels'] = glob('public/models'.'/*.*'); // iterate files - foreach($public_uploads as $public_type => $public_upload) - { + foreach ($public_uploads as $public_type => $public_upload) { $type_count = 0; - $this->info("- There are ".count($public_upload).' PUBLIC '.$public_type.' files.'); + $this->info('- There are '.count($public_upload).' PUBLIC '.$public_type.' files.'); for ($i = 0; $i < count($public_upload); $i++) { $type_count++; $filename = basename($public_upload[$i]); - try { + try { Storage::disk('public')->put('uploads/'.public_type.'/'.$filename, file_get_contents($public_upload[$i])); $new_url = Storage::disk('public')->url('uploads/'.$public_type.'/'.$filename, $filename); $this->info($type_count.'. PUBLIC: '.$filename.' was copied to '.$new_url); @@ -79,13 +76,11 @@ class MoveUploadsToNewDisk extends Command \Log::debug($e); $this->error($e); } - } - } - $logos = glob("public/uploads/setting*.*"); - $this->info("- There are ".count($logos).' files that might be logos.'); + $logos = glob('public/uploads/setting*.*'); + $this->info('- There are '.count($logos).' files that might be logos.'); $type_count = 0; foreach ($logos as $logo) { @@ -96,41 +91,35 @@ class MoveUploadsToNewDisk extends Command $this->info($type_count.'. LOGO: '.$filename.' was copied to '.env('PUBLIC_AWS_URL').'/uploads/'.$filename); } - $private_uploads['assets'] = glob('storage/private_uploads/assets'."/*.*"); - $private_uploads['signatures'] = glob('storage/private_uploads/signatures'."/*.*"); - $private_uploads['audits'] = glob('storage/private_uploads/audits'."/*.*"); - $private_uploads['assetmodels'] = glob('storage/private_uploads/assetmodels'."/*.*"); - $private_uploads['imports'] = glob('storage/private_uploads/imports'."/*.*"); - $private_uploads['licenses'] = glob('storage/private_uploads/licenses'."/*.*"); - $private_uploads['users'] = glob('storage/private_uploads/users'."/*.*"); - $private_uploads['backups'] = glob('storage/private_uploads/users'."/*.*"); + $private_uploads['assets'] = glob('storage/private_uploads/assets'.'/*.*'); + $private_uploads['signatures'] = glob('storage/private_uploads/signatures'.'/*.*'); + $private_uploads['audits'] = glob('storage/private_uploads/audits'.'/*.*'); + $private_uploads['assetmodels'] = glob('storage/private_uploads/assetmodels'.'/*.*'); + $private_uploads['imports'] = glob('storage/private_uploads/imports'.'/*.*'); + $private_uploads['licenses'] = glob('storage/private_uploads/licenses'.'/*.*'); + $private_uploads['users'] = glob('storage/private_uploads/users'.'/*.*'); + $private_uploads['backups'] = glob('storage/private_uploads/users'.'/*.*'); - - foreach($private_uploads as $private_type => $private_upload) - { - $this->info("- There are ".count($private_upload).' PRIVATE '.$private_type.' files.'); + foreach ($private_uploads as $private_type => $private_upload) { + $this->info('- There are '.count($private_upload).' PRIVATE '.$private_type.' files.'); $type_count = 0; for ($x = 0; $x < count($private_upload); $x++) { $type_count++; $filename = basename($private_upload[$x]); - try { + try { Storage::put($private_type.'/'.$filename, file_get_contents($private_upload[$i])); $new_url = Storage::url($private_type.'/'.$filename, $filename); $this->info($type_count.'. PRIVATE: '.$filename.' was copied to '.$new_url); - } catch (\Exception $e) { \Log::debug($e); $this->error($e); } - } - } - - if ($delete_local=='true') { + if ($delete_local == 'true') { $public_delete_count = 0; $private_delete_count = 0; @@ -139,10 +128,8 @@ class MoveUploadsToNewDisk extends Command $this->warn("\nTHIS WILL DELETE ALL OF YOUR LOCAL UPLOADED FILES. \n\nThis cannot be undone, so you should take a backup of your system before you proceed.\n"); $this->error('!!!!!!!!!!!!!!!!!!!!!!!!!!!!! WARNING!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); - if ($this->confirm("Do you wish to continue?")) { - - foreach($public_uploads as $public_type => $public_upload) { - + if ($this->confirm('Do you wish to continue?')) { + foreach ($public_uploads as $public_type => $public_upload) { for ($i = 0; $i < count($public_upload); $i++) { $filename = $public_upload[$i]; try { @@ -152,13 +139,10 @@ class MoveUploadsToNewDisk extends Command \Log::debug($e); $this->error($e); } - } } - foreach($private_uploads as $private_type => $private_upload) - { - + foreach ($private_uploads as $private_type => $private_upload) { for ($i = 0; $i < count($private_upload); $i++) { $filename = $private_upload[$i]; try { @@ -168,16 +152,11 @@ class MoveUploadsToNewDisk extends Command \Log::debug($e); $this->error($e); } - } } - $this->info($public_delete_count." PUBLIC local files and ".$private_delete_count." PRIVATE local files were deleted from your filesystem."); + $this->info($public_delete_count.' PUBLIC local files and '.$private_delete_count.' PRIVATE local files were deleted from your filesystem.'); } } - - - - } } diff --git a/app/Console/Commands/ObjectImportCommand.php b/app/Console/Commands/ObjectImportCommand.php index 71c974a21d..c89018400a 100644 --- a/app/Console/Commands/ObjectImportCommand.php +++ b/app/Console/Commands/ObjectImportCommand.php @@ -1,4 +1,5 @@ setShouldNotify($this->option('send-welcome')) ->setUsernameFormat($this->option('username_format')); - // This $logFile/useFiles() bit is currently broken, so commenting it out for now // $logFile = $this->option('logfile'); // \Log::useFiles($logFile); @@ -64,29 +65,28 @@ class ObjectImportCommand extends Command $this->bar = null; - if (!empty($this->errors)) { - $this->comment("The following Errors were encountered."); + if (! empty($this->errors)) { + $this->comment('The following Errors were encountered.'); foreach ($this->errors as $asset => $error) { - $this->comment('Error: Item: ' . $asset . ' failed validation: ' . json_encode($error)); + $this->comment('Error: Item: '.$asset.' failed validation: '.json_encode($error)); } } else { - $this->comment("All Items imported successfully!"); + $this->comment('All Items imported successfully!'); } - $this->comment(""); - - return; + $this->comment(''); } public function errorCallback($item, $field, $errorString) { $this->errors[$item->name][$field] = $errorString; } + public function progress($count) { - if (!$this->bar) { + if (! $this->bar) { $this->bar = $this->output->createProgressBar($count); } - static $index =0; + static $index = 0; $index++; if ($index < $count) { $this->bar->advance(); @@ -94,12 +94,12 @@ class ObjectImportCommand extends Command $this->bar->finish(); } } + // Tracks the current item for error messages private $updating; // An array of errors encountered while parsing private $errors; - /** * Log a message to file, configurable by the --log-file parameter. * If a warning message is passed, we'll spit it to the console as well. @@ -108,7 +108,7 @@ class ObjectImportCommand extends Command * @since 3.0 * @param string $string * @param string $level - */ + */ public function log($string, $level = 'info') { if ($level === 'warning') { @@ -121,6 +121,7 @@ class ObjectImportCommand extends Command } } } + /** * Get the console command arguments. * @@ -130,12 +131,11 @@ class ObjectImportCommand extends Command */ protected function getArguments() { - return array( - array('filename', InputArgument::REQUIRED, 'File for the CSV import.'), - ); + return [ + ['filename', InputArgument::REQUIRED, 'File for the CSV import.'], + ]; } - /** * Get the console command options. * @@ -145,16 +145,15 @@ class ObjectImportCommand extends Command */ protected function getOptions() { - return array( - array('email_format', null, InputOption::VALUE_REQUIRED, 'The format of the email addresses that should be generated. Options are firstname.lastname, firstname, filastname', null), - array('username_format', null, InputOption::VALUE_REQUIRED, 'The format of the username that should be generated. Options are firstname.lastname, firstname, filastname, email', null), - array('logfile', null, InputOption::VALUE_REQUIRED, 'The path to log output to. storage/logs/importer.log by default', storage_path('logs/importer.log') ), - array('item-type', null, InputOption::VALUE_REQUIRED, 'Item Type To import. Valid Options are Asset, Consumable, Accessory, License, or User', 'Asset'), - array('web-importer', null, InputOption::VALUE_NONE, 'Internal: packages output for use with the web importer'), - array('user_id', null, InputOption::VALUE_REQUIRED, 'ID of user creating items', 1), - array('update', null, InputOption::VALUE_NONE, 'If a matching item is found, update item information'), - array('send-welcome', null, InputOption::VALUE_NONE, 'Whether to send a welcome email to any new users that are created.'), - ); - + return [ + ['email_format', null, InputOption::VALUE_REQUIRED, 'The format of the email addresses that should be generated. Options are firstname.lastname, firstname, filastname', null], + ['username_format', null, InputOption::VALUE_REQUIRED, 'The format of the username that should be generated. Options are firstname.lastname, firstname, filastname, email', null], + ['logfile', null, InputOption::VALUE_REQUIRED, 'The path to log output to. storage/logs/importer.log by default', storage_path('logs/importer.log')], + ['item-type', null, InputOption::VALUE_REQUIRED, 'Item Type To import. Valid Options are Asset, Consumable, Accessory, License, or User', 'Asset'], + ['web-importer', null, InputOption::VALUE_NONE, 'Internal: packages output for use with the web importer'], + ['user_id', null, InputOption::VALUE_REQUIRED, 'ID of user creating items', 1], + ['update', null, InputOption::VALUE_NONE, 'If a matching item is found, update item information'], + ['send-welcome', null, InputOption::VALUE_NONE, 'Whether to send a welcome email to any new users that are created.'], + ]; } } diff --git a/app/Console/Commands/PaveIt.php b/app/Console/Commands/PaveIt.php index 32663b0a92..9ccb5bf7f3 100644 --- a/app/Console/Commands/PaveIt.php +++ b/app/Console/Commands/PaveIt.php @@ -2,23 +2,9 @@ namespace App\Console\Commands; -use App\Models\Accessory; use App\Models\Asset; -use App\Models\AssetModel; -use App\Models\Category; -use App\Models\Company; -use App\Models\Component; -use App\Models\Consumable; -use App\Models\Department; -use App\Models\Depreciation; -use App\Models\Group; -use App\Models\Import; -use App\Models\License; -use App\Models\LicenseSeat; -use App\Models\Location; -use App\Models\Manufacturer; -use App\Models\Statuslabel; -use App\Models\Supplier; +use App\Models\CustomField; +use Schema; use DB; use Illuminate\Console\Command; @@ -29,15 +15,14 @@ class PaveIt extends Command * * @var string */ - protected $signature = 'snipeit:pave - {--soft : Perform a "Soft" Delete, leaving all migrations, table structure, and the first user in place.}'; + protected $signature = 'snipeit:pave {--force : Skip the interactive yes/no prompt for confirmation}'; /** * The console command description. * * @var string */ - protected $description = 'Pave the database to start over. This should ALMOST NEVER BE USED. (It is primarily a quick tool for developers.)'; + protected $description = 'Clear the database tables, leaving all migrations, table structure, and the first user in place. (It is primarily a quick tool for developers.) If you want to destroy all tables as well, use php artisan db:wipe.'; /** * Create a new command instance. @@ -56,106 +41,51 @@ class PaveIt extends Command */ public function handle() { - if ($this->confirm("\n****************************************************\nTHIS WILL DELETE ALL OF THE DATA IN YOUR DATABASE. \nThere is NO undo. This WILL destroy ALL of your data. \n****************************************************\n\nDo you wish to continue? No backsies! [y|N]")) { - if ($this->option('soft')) { - Accessory::getQuery()->delete(); - Asset::getQuery()->delete(); - Category::getQuery()->delete(); - Company::getQuery()->delete(); - Component::getQuery()->delete(); - Consumable::getQuery()->delete(); - Department::getQuery()->delete(); - Depreciation::getQuery()->delete(); - License::getQuery()->delete(); - LicenseSeat::getQuery()->delete(); - Location::getQuery()->delete(); - Manufacturer::getQuery()->delete(); - AssetModel::getQuery()->delete(); - Statuslabel::getQuery()->delete(); - Supplier::getQuery()->delete(); - Group::getQuery()->delete(); - Import::getQuery()->delete(); - DB::statement('delete from accessories_users'); - DB::statement('delete from asset_logs'); - DB::statement('delete from asset_maintenances'); - DB::statement('delete from login_attempts'); - DB::statement('delete from asset_uploads'); - DB::statement('delete from action_logs'); - DB::statement('delete from checkout_requests'); - DB::statement('delete from checkout_acceptances'); - DB::statement('delete from consumables_users'); - DB::statement('delete from custom_field_custom_fieldset'); - DB::statement('delete from custom_fields'); - DB::statement('delete from custom_fieldsets'); - DB::statement('delete from components_assets'); - DB::statement('delete from kits'); - DB::statement('delete from kits_accessories'); - DB::statement('delete from kits_consumables'); - DB::statement('delete from kits_licenses'); - DB::statement('delete from kits_models'); - DB::statement('delete from login_attempts'); - DB::statement('delete from models_custom_fields'); - DB::statement('delete from permission_groups'); - DB::statement('delete from password_resets'); - DB::statement('delete from requested_assets'); - DB::statement('delete from requests'); - DB::statement('delete from throttle'); - DB::statement('delete from users_groups'); - DB::statement('delete from users WHERE id!=1'); - } else { - \DB::statement('drop table IF EXISTS accessories_users'); - \DB::statement('drop table IF EXISTS accessories'); - \DB::statement('drop table IF EXISTS asset_logs'); - \DB::statement('drop table IF EXISTS action_logs'); - \DB::statement('drop table IF EXISTS asset_maintenances'); - \DB::statement('drop table IF EXISTS asset_uploads'); - \DB::statement('drop table IF EXISTS assets'); - \DB::statement('drop table IF EXISTS categories'); - \DB::statement('drop table IF EXISTS checkout_requests'); - \DB::statement('drop table IF EXISTS checkout_acceptances'); - \DB::statement('drop table IF EXISTS companies'); - \DB::statement('drop table IF EXISTS components'); - \DB::statement('drop table IF EXISTS components_assets'); - \DB::statement('drop table IF EXISTS consumables_users'); - \DB::statement('drop table IF EXISTS consumables'); - \DB::statement('drop table IF EXISTS custom_field_custom_fieldset'); - \DB::statement('drop table IF EXISTS custom_fields'); - \DB::statement('drop table IF EXISTS custom_fieldsets'); - \DB::statement('drop table IF EXISTS depreciations'); - \DB::statement('drop table IF EXISTS departments'); - \DB::statement('drop table IF EXISTS groups'); - \DB::statement('drop table IF EXISTS history'); - \DB::statement('drop table IF EXISTS kits'); - \DB::statement('drop table IF EXISTS kits_accessories'); - \DB::statement('drop table IF EXISTS kits_consumables'); - \DB::statement('drop table IF EXISTS kits_licenses'); - \DB::statement('drop table IF EXISTS kits_models'); - \DB::statement('drop table IF EXISTS models_custom_fields'); - \DB::statement('drop table IF EXISTS permission_groups'); - \DB::statement('drop table IF EXISTS license_seats'); - \DB::statement('drop table IF EXISTS licenses'); - \DB::statement('drop table IF EXISTS locations'); - \DB::statement('drop table IF EXISTS login_attempts'); - \DB::statement('drop table IF EXISTS manufacturers'); - \DB::statement('drop table IF EXISTS models'); - \DB::statement('drop table IF EXISTS migrations'); - \DB::statement('drop table IF EXISTS oauth_access_tokens'); - \DB::statement('drop table IF EXISTS oauth_auth_codes'); - \DB::statement('drop table IF EXISTS oauth_clients'); - \DB::statement('drop table IF EXISTS oauth_personal_access_clients'); - \DB::statement('drop table IF EXISTS oauth_refresh_tokens'); - \DB::statement('drop table IF EXISTS password_resets'); - \DB::statement('drop table IF EXISTS requested_assets'); - \DB::statement('drop table IF EXISTS requests'); - \DB::statement('drop table IF EXISTS settings'); - \DB::statement('drop table IF EXISTS status_labels'); - \DB::statement('drop table IF EXISTS suppliers'); - \DB::statement('drop table IF EXISTS throttle'); - \DB::statement('drop table IF EXISTS users_groups'); - \DB::statement('drop table IF EXISTS users'); - \DB::statement('drop table IF EXISTS imports'); + if (!$this->option('force')) { + $confirmation = $this->confirm("\n****************************************************\nTHIS WILL DELETE ALL OF THE DATA IN YOUR DATABASE. \nThere is NO undo. This WILL destroy ALL of your data, \nINCLUDING ANY non-Snipe-IT tables you have in this database. \n****************************************************\n\nDo you wish to continue? No backsies! "); + if (!$confirmation) { + $this->error('ABORTING'); + exit(-1); } } + + // List all the tables in the database so we don't have to worry about missing some as the app grows + $tables = DB::connection()->getDoctrineSchemaManager()->listTableNames(); + + $except_tables = [ + 'oauth_access_tokens', + 'oauth_clients', + 'oauth_personal_access_clients', + 'migrations', + 'settings', + 'users', + ]; + + // We only need to find out what these are so we can nuke these columns on the assets table. + $custom_fields = CustomField::get(); + foreach ($custom_fields as $custom_field) { + $this->info('DROP the '.$custom_field->db_column.' column from assets as well.'); + + if (\Schema::hasColumn('assets', $custom_field->db_column)) { + \Schema::table('assets', function ($table) use ($custom_field) { + $table->dropColumn($custom_field->db_column); + }); + } + } + + foreach ($tables as $table) { + if (in_array($table, $except_tables)) { + $this->info($table. ' is SKIPPED.'); + } else { + \DB::statement('truncate '.$table); + $this->info($table. ' is TRUNCATED.'); + } + } + + // Leave in the demo oauth keys so we don't have to reset them every day in the demos + \DB::statement('delete from oauth_clients WHERE id > 2'); + \DB::statement('delete from oauth_access_tokens WHERE id > 2'); + } -} +} \ No newline at end of file diff --git a/app/Console/Commands/Purge.php b/app/Console/Commands/Purge.php index a9f1da7374..7abd83c85c 100644 --- a/app/Console/Commands/Purge.php +++ b/app/Console/Commands/Purge.php @@ -50,7 +50,7 @@ class Purge extends Command public function handle() { $force = $this->option('force'); - if (($this->confirm("\n****************************************************\nTHIS WILL PURGE ALL SOFT-DELETED ITEMS IN YOUR SYSTEM. \nThere is NO undo. This WILL permanently destroy \nALL of your deleted data. \n****************************************************\n\nDo you wish to continue? No backsies! [y|N]")) || $force == 'true') { + if (($this->confirm("\n****************************************************\nTHIS WILL PURGE ALL SOFT-DELETED ITEMS IN YOUR SYSTEM. \nThere is NO undo. This WILL permanently destroy \nALL of your deleted data. \n****************************************************\n\nDo you wish to continue? No backsies! [y|N]")) || $force == 'true') { /** * Delete assets @@ -80,9 +80,8 @@ class Purge extends Command $location->forceDelete(); } - $accessories = Accessory::whereNotNull('deleted_at')->withTrashed()->get(); - $accessory_assoc=0; + $accessory_assoc = 0; $this->info($accessories->count().' accessories purged.'); foreach ($accessories as $accessory) { $this->info('- Accessory "'.$accessory->name.'" deleted.'); @@ -92,7 +91,6 @@ class Purge extends Command } $this->info($accessory_assoc.' corresponding log records purged.'); - $consumables = Consumable::whereNotNull('deleted_at')->withTrashed()->get(); $this->info($consumables->count().' consumables purged.'); foreach ($consumables as $consumable) { @@ -101,7 +99,6 @@ class Purge extends Command $consumable->forceDelete(); } - $components = Component::whereNotNull('deleted_at')->withTrashed()->get(); $this->info($components->count().' components purged.'); foreach ($components as $component) { @@ -126,7 +123,6 @@ class Purge extends Command $model->forceDelete(); } - $categories = Category::whereNotNull('deleted_at')->withTrashed()->get(); $this->info($categories->count().' categories purged.'); foreach ($categories as $category) { @@ -165,11 +161,8 @@ class Purge extends Command $this->info('- Status Label "'.$status_label->name.'" deleted.'); $status_label->forceDelete(); } - - } else { $this->info('Action canceled. Nothing was purged.'); } - } } diff --git a/app/Console/Commands/PurgeLoginAttempts.php b/app/Console/Commands/PurgeLoginAttempts.php index 7a7a1394d7..44e1d1bd1e 100644 --- a/app/Console/Commands/PurgeLoginAttempts.php +++ b/app/Console/Commands/PurgeLoginAttempts.php @@ -38,7 +38,7 @@ class PurgeLoginAttempts extends Command public function handle() { if ($this->confirm("\n****************************************************\nTHIS WILL DELETE ALL OF THE YOUR LOGIN ATTEMPT RECORDS. \nThere is NO undo! \n****************************************************\n\nDo you wish to continue? No backsies! [y|N]")) { - \DB::statement('delete from login_attempts'); + \DB::statement('delete from login_attempts'); } } } diff --git a/app/Console/Commands/ReEncodeCustomFieldNames.php b/app/Console/Commands/ReEncodeCustomFieldNames.php index 14276b1bd3..f89864e951 100644 --- a/app/Console/Commands/ReEncodeCustomFieldNames.php +++ b/app/Console/Commands/ReEncodeCustomFieldNames.php @@ -48,15 +48,13 @@ class ReEncodeCustomFieldNames extends Command */ public function handle() { - - if ($this->confirm('This will regenerate all of the custom field database fieldnames in your database. THIS WILL CHANGE YOUR SCHEMA AND SHOULD NOT BE DONE WITHOUT MAKING A BACKUP FIRST. Do you wish to continue?')) - { + if ($this->confirm('This will regenerate all of the custom field database fieldnames in your database. THIS WILL CHANGE YOUR SCHEMA AND SHOULD NOT BE DONE WITHOUT MAKING A BACKUP FIRST. Do you wish to continue?')) { /** Get all of the custom fields */ $fields = CustomField::get(); $asset_columns = \DB::getSchemaBuilder()->getColumnListing('assets'); - $custom_field_columns = array(); + $custom_field_columns = []; /** Loop through the columns on the assets table */ foreach ($asset_columns as $asset_column) { @@ -71,18 +69,16 @@ class ReEncodeCustomFieldNames extends Command * Then use that ID as the array key for use comparing the actual assets field name * and the db_column value from the custom fields table. */ - $last_part = substr(strrchr($asset_column, "_snipeit_"), 1); + $last_part = substr(strrchr($asset_column, '_snipeit_'), 1); $custom_field_columns[$last_part] = $asset_column; } } foreach ($fields as $field) { - - $this->info($field->name .' ('.$field->id.') column should be '. $field->convertUnicodeDbSlug().''); + $this->info($field->name.' ('.$field->id.') column should be '.$field->convertUnicodeDbSlug().''); /** The assets table has the column it should have, all is well */ - if (\Schema::hasColumn('assets', $field->convertUnicodeDbSlug())) - { + if (\Schema::hasColumn('assets', $field->convertUnicodeDbSlug())) { $this->info('-- ✓ This field exists - all good'); /** @@ -90,24 +86,23 @@ class ReEncodeCustomFieldNames extends Command * what $field->convertUnicodeDbSlug() is *now* expecting. */ } else { - $this->warn('-- X Field mismatch: updating... '); + $this->warn('-- X Field mismatch: updating... '); - /** Make sure the custom_field_columns array has the ID */ - if (array_key_exists($field->id, $custom_field_columns)) { + /** Make sure the custom_field_columns array has the ID */ + if (array_key_exists($field->id, $custom_field_columns)) { - /** - * Update the asset schema to the corrected fieldname that will be recognized by the - * system elsewhere that we use $field->convertUnicodeDbSlug() - */ - \Schema::table('assets', function($table) use ($custom_field_columns, $field) { - $table->renameColumn($custom_field_columns[$field->id], $field->convertUnicodeDbSlug()); - }); + /** + * Update the asset schema to the corrected fieldname that will be recognized by the + * system elsewhere that we use $field->convertUnicodeDbSlug() + */ + \Schema::table('assets', function ($table) use ($custom_field_columns, $field) { + $table->renameColumn($custom_field_columns[$field->id], $field->convertUnicodeDbSlug()); + }); - $this->warn('-- ✓ Field updated from '.$custom_field_columns[$field->id].' to '.$field->convertUnicodeDbSlug()); - - } else { - $this->warn('-- X WARNING: There is no field on the assets table ending in '.$field->id.'. This may require more in-depth investigation and may mean the schema was altered manually.'); - } + $this->warn('-- ✓ Field updated from '.$custom_field_columns[$field->id].' to '.$field->convertUnicodeDbSlug()); + } else { + $this->warn('-- X WARNING: There is no field on the assets table ending in '.$field->id.'. This may require more in-depth investigation and may mean the schema was altered manually.'); + } } /** Update the db_column property in the custom fields table, just in case it doesn't match the other @@ -115,12 +110,7 @@ class ReEncodeCustomFieldNames extends Command */ $field->db_column = $field->convertUnicodeDbSlug(); $field->save(); - - } - } - - } } diff --git a/app/Console/Commands/RecryptFromMcrypt.php b/app/Console/Commands/RecryptFromMcrypt.php index 6c3a962823..805774a517 100644 --- a/app/Console/Commands/RecryptFromMcrypt.php +++ b/app/Console/Commands/RecryptFromMcrypt.php @@ -44,37 +44,35 @@ class RecryptFromMcrypt extends Command public function handle() { - // Check and see if they have a legacy app key listed in their .env // If not, we can try to use the current APP_KEY if looks like it's old $legacy_key = env('LEGACY_APP_KEY'); $key_parts = explode(':', $legacy_key); $legacy_cipher = env('LEGACY_CIPHER', 'rijndael-256'); - $errors = array(); + $errors = []; - if (!$legacy_key) { + if (! $legacy_key) { $this->error('ERROR: You do not have a LEGACY_APP_KEY set in your .env file. Please locate your old APP_KEY and ADD a line to your .env file like: LEGACY_APP_KEY=YOUR_OLD_APP_KEY'); + return false; } - // Do some basic legacy app key length checks if (strlen($legacy_key) == 32) { $legacy_length_check = true; - } elseif (array_key_exists('1', $key_parts) && (strlen($key_parts[1])==44)) { - $legacy_key = base64_decode($key_parts[1],true); + } elseif (array_key_exists('1', $key_parts) && (strlen($key_parts[1]) == 44)) { + $legacy_key = base64_decode($key_parts[1], true); $legacy_length_check = true; } else { $legacy_length_check = false; } - - // Check that the app key is 32 characters if ($legacy_length_check === true) { $this->comment('INFO: Your LEGACY_APP_KEY looks correct. Okay to continue.'); } else { $this->error('ERROR: Your LEGACY_APP_KEY is not the correct length (32 characters or base64 followed by 44 characters for later versions). Please locate your old APP_KEY and use that as your LEGACY_APP_KEY in your .env file to continue.'); + return false; } @@ -84,8 +82,7 @@ class RecryptFromMcrypt extends Command $force = ($this->option('force')) ? true : false; - if ($force || ($this->confirm("Are you SURE you wish to continue?"))) { - + if ($force || ($this->confirm('Are you SURE you wish to continue?'))) { $backup_file = 'backups/env-backups/'.'app_key-'.date('Y-m-d-gis'); try { @@ -95,15 +92,14 @@ class RecryptFromMcrypt extends Command $this->info('WARNING: Could not backup app keys'); } - - if ($legacy_cipher){ - $mcrypter = new McryptEncrypter($legacy_key,$legacy_cipher); - }else{ + if ($legacy_cipher) { + $mcrypter = new McryptEncrypter($legacy_key, $legacy_cipher); + } else { $mcrypter = new McryptEncrypter($legacy_key); } $settings = Setting::getSettings(); - if ($settings->ldap_pword=='') { + if ($settings->ldap_pword == '') { $this->comment('INFO: No LDAP password found. Skipping... '); } else { $decrypted_ldap_pword = $mcrypter->decrypt($settings->ldap_pword); @@ -111,30 +107,28 @@ class RecryptFromMcrypt extends Command $settings->save(); } /** @var CustomField[] $custom_fields */ - $custom_fields = CustomField::where('field_encrypted','=', 1)->get(); + $custom_fields = CustomField::where('field_encrypted', '=', 1)->get(); $this->comment('INFO: Retrieving encrypted custom fields...'); $query = Asset::withTrashed(); foreach ($custom_fields as $custom_field) { - $this->comment('FIELD TO RECRYPT: '.$custom_field->name .' ('.$custom_field->db_column.')'); + $this->comment('FIELD TO RECRYPT: '.$custom_field->name.' ('.$custom_field->db_column.')'); $query->orWhereNotNull($custom_field->db_column); } - // Get all assets with a value in any of the fields that were encrypted /** @var Asset[] $assets */ $assets = $query->get(); $bar = $this->output->createProgressBar(count($assets)); - foreach ($assets as $asset) { foreach ($custom_fields as $encrypted_field) { $columnName = $encrypted_field->db_column; // Make sure the value isn't null - if ($asset->{$columnName}!='') { + if ($asset->{$columnName} != '') { // Try to decrypt the payload using the legacy app key try { $decrypted_field = $mcrypter->decrypt($asset->{$columnName}); @@ -144,14 +138,11 @@ class RecryptFromMcrypt extends Command $errors[] = ' - ERROR: Could not decrypt field ['.$encrypted_field->name.']: '.$e->getMessage(); } } - } $asset->save(); $bar->advance(); } - - $bar->finish(); if (count($errors) > 0) { @@ -162,6 +153,5 @@ class RecryptFromMcrypt extends Command } } } - } } diff --git a/app/Console/Commands/RegenerateAssetTags.php b/app/Console/Commands/RegenerateAssetTags.php index 2646ebeb35..94ed5ce07c 100644 --- a/app/Console/Commands/RegenerateAssetTags.php +++ b/app/Console/Commands/RegenerateAssetTags.php @@ -40,30 +40,26 @@ class RegenerateAssetTags extends Command */ public function handle() { - - if ($this->confirm('This will regenerate all of the asset tags within your system. This action is data-destructive and should be used with caution. Do you wish to continue?')) - { - + if ($this->confirm('This will regenerate all of the asset tags within your system. This action is data-destructive and should be used with caution. Do you wish to continue?')) { $output['info'] = []; $output['warn'] = []; $output['error'] = []; $settings = Setting::getSettings(); - $start_tag = ($this->option('start')) ? $this->option('start') : (($settings->next_auto_tag_base) ? Setting::getSettings()->next_auto_tag_base : 1) ; + $start_tag = ($this->option('start')) ? $this->option('start') : (($settings->next_auto_tag_base) ? Setting::getSettings()->next_auto_tag_base : 1); $this->info('Starting at '.$start_tag); - $total_assets = Asset::orderBy('id','asc')->get(); + $total_assets = Asset::orderBy('id', 'asc')->get(); $bar = $this->output->createProgressBar(count($total_assets)); - try { + try { Artisan::call('backup:run'); } catch (\Exception $e) { $output['error'][] = $e; } foreach ($total_assets as $asset) { - $start_tag++; $output['info'][] = 'Asset tag:'.$asset->asset_tag; $asset->asset_tag = $settings->auto_increment_prefix.$settings->auto_increment_prefix.$start_tag; @@ -81,24 +77,21 @@ class RegenerateAssetTags extends Command $bar->finish(); $this->info("\n"); - - if (($this->option('output')=='all') || ($this->option('output')=='info')) { + if (($this->option('output') == 'all') || ($this->option('output') == 'info')) { foreach ($output['info'] as $key => $output_text) { $this->info($output_text); } } - if (($this->option('output')=='all') || ($this->option('output')=='warn')) { + if (($this->option('output') == 'all') || ($this->option('output') == 'warn')) { foreach ($output['warn'] as $key => $output_text) { $this->warn($output_text); } } - if (($this->option('output')=='all') || ($this->option('output')=='error')) { + if (($this->option('output') == 'all') || ($this->option('output') == 'error')) { foreach ($output['error'] as $key => $output_text) { $this->error($output_text); } } } - - } } diff --git a/app/Console/Commands/ResetDemoSettings.php b/app/Console/Commands/ResetDemoSettings.php index 6808b125c8..6326701fa9 100644 --- a/app/Console/Commands/ResetDemoSettings.php +++ b/app/Console/Commands/ResetDemoSettings.php @@ -81,8 +81,8 @@ class ResetDemoSettings extends Command $user->save(); } - \Storage::disk('local_public')->put('snipe-logo.png', file_get_contents(public_path('img/demo/snipe-logo.png'))); - \Storage::disk('local_public')->put('snipe-logo-lg.png', file_get_contents(public_path('img/demo/snipe-logo-lg.png'))); + \Storage::disk('public')->put('snipe-logo.png', file_get_contents(public_path('img/demo/snipe-logo.png'))); + \Storage::disk('public')->put('snipe-logo-lg.png', file_get_contents(public_path('img/demo/snipe-logo-lg.png'))); } diff --git a/app/Console/Commands/RestoreDeletedUsers.php b/app/Console/Commands/RestoreDeletedUsers.php index c17c18984a..4bf26a544d 100644 --- a/app/Console/Commands/RestoreDeletedUsers.php +++ b/app/Console/Commands/RestoreDeletedUsers.php @@ -43,16 +43,15 @@ class RestoreDeletedUsers extends Command */ public function handle() { - $start_date = $this->option('start_date'); $end_date = $this->option('end_date'); $asset_totals = 0; $license_totals = 0; $user_count = 0; - - if (($start_date=='') || ($end_date=='')) { + if (($start_date == '') || ($end_date == '')) { $this->info('ERROR: All fields are required.'); + return false; } @@ -63,15 +62,15 @@ class RestoreDeletedUsers extends Command foreach ($users as $user) { $user_count++; - $user_logs = Actionlog::where('target_id', $user->id)->where('target_type',User::class) - ->where('action_type','checkout')->with('item')->get(); + $user_logs = Actionlog::where('target_id', $user->id)->where('target_type', User::class) + ->where('action_type', 'checkout')->with('item')->get(); - $this->info($user_count.'. '.$user->username.' ('.$user->id.') was deleted at '.$user->deleted_at. ' and has '.$user_logs->count().' checkouts associated.'); + $this->info($user_count.'. '.$user->username.' ('.$user->id.') was deleted at '.$user->deleted_at.' and has '.$user_logs->count().' checkouts associated.'); foreach ($user_logs as $user_log) { $this->info(' * '.$user_log->item_type.': '.$user_log->item->name.' - item_id: '.$user_log->item_id); - if ($user_log->item_type==Asset::class) { + if ($user_log->item_type == Asset::class) { $asset_totals++; DB::table('assets') @@ -79,11 +78,10 @@ class RestoreDeletedUsers extends Command ->update(['assigned_to' => $user->id, 'assigned_type'=> User::class]); $this->info(' ** Asset '.$user_log->item->id.' ('.$user_log->item->asset_tag.') restored to user '.$user->id.''); - - } elseif ($user_log->item_type==License::class) { + } elseif ($user_log->item_type == License::class) { $license_totals++; - $avail_seat = DB::table('license_seats')->where('license_id','=',$user_log->item->id) + $avail_seat = DB::table('license_seats')->where('license_id', '=', $user_log->item->id) ->whereNull('assigned_to')->whereNull('asset_id')->whereBetween('updated_at', [$start_date, $end_date])->first(); if ($avail_seat) { $this->info(' ** Allocating seat '.$avail_seat->id.' for this License'); @@ -91,27 +89,17 @@ class RestoreDeletedUsers extends Command DB::table('license_seats') ->where('id', $avail_seat->id) ->update(['assigned_to' => $user->id]); - } else { $this->warn('ERROR: No available seats for '.$user_log->item->name); } - } - } $this->warn('Restoring user '.$user->username.'!'); $user->restore(); - - } $this->info($asset_totals.' assets affected'); $this->info($license_totals.' licenses affected'); - - - } - - } diff --git a/app/Console/Commands/RestoreFromBackup.php b/app/Console/Commands/RestoreFromBackup.php index 5d9042a046..8f8114229e 100644 --- a/app/Console/Commands/RestoreFromBackup.php +++ b/app/Console/Commands/RestoreFromBackup.php @@ -3,7 +3,6 @@ namespace App\Console\Commands; use Illuminate\Console\Command; - use ZipArchive; class RestoreFromBackup extends Command @@ -15,7 +14,8 @@ class RestoreFromBackup extends Command */ protected $signature = 'snipeit:restore {--force : Skip the danger prompt; assuming you hit "y"} - {filename : The zip file to be migrated}'; + {filename : The zip file to be migrated} + {--no-progress : Don\'t show a progress bar}'; /** * The console command description. @@ -42,73 +42,80 @@ class RestoreFromBackup extends Command public function handle() { $dir = getcwd(); - print "Current working directory is: $dir\n"; + echo "Current working directory is: $dir\n"; // $filename = $this->argument('filename'); - if (!$filename) { - return $this->error("Missing required filename"); + if (! $filename) { + return $this->error('Missing required filename'); } - if (!$this->option('force') && !$this->confirm('Are you sure you wish to restore from the given backup file? This can lead to MASSIVE DATA LOSS!')) { - return $this->error("Data loss not confirmed"); + if (! $this->option('force') && ! $this->confirm('Are you sure you wish to restore from the given backup file? This can lead to MASSIVE DATA LOSS!')) { + return $this->error('Data loss not confirmed'); } if (config('database.default') != 'mysql') { - return $this->error("DB_CONNECTION must be MySQL in order to perform a restore. Detected: ".config('database.default')); + return $this->error('DB_CONNECTION must be MySQL in order to perform a restore. Detected: '.config('database.default')); } $za = new ZipArchive(); - $errcode = $za->open($filename, ZipArchive::RDONLY); + $errcode = $za->open($filename/* , ZipArchive::RDONLY */); // that constant only exists in PHP 7.4 and higher if ($errcode !== true) { $errors = [ - ZipArchive::ER_EXISTS => "File already exists.", - ZipArchive::ER_INCONS => "Zip archive inconsistent.", - ZipArchive::ER_INVAL => "Invalid argument.", - ZipArchive::ER_MEMORY => "Malloc failure.", - ZipArchive::ER_NOENT => "No such file.", - ZipArchive::ER_NOZIP => "Not a zip archive.", + ZipArchive::ER_EXISTS => 'File already exists.', + ZipArchive::ER_INCONS => 'Zip archive inconsistent.', + ZipArchive::ER_INVAL => 'Invalid argument.', + ZipArchive::ER_MEMORY => 'Malloc failure.', + ZipArchive::ER_NOENT => 'No such file.', + ZipArchive::ER_NOZIP => 'Not a zip archive.', ZipArchive::ER_OPEN => "Can't open file.", - ZipArchive::ER_READ => "Read error.", - ZipArchive::ER_SEEK => "Seek error." + ZipArchive::ER_READ => 'Read error.', + ZipArchive::ER_SEEK => 'Seek error.', ]; - return $this->error("Could not access file: ".$filename." - ".array_key_exists($errcode,$errors) ? $errors[$errcode] : " Unknown reason: $errcode"); + return $this->error('Could not access file: '.$filename.' - '.array_key_exists($errcode, $errors) ? $errors[$errcode] : " Unknown reason: $errcode"); } - $private_dirs = [ - 'storage/private_uploads/assets', + 'storage/private_uploads/assets', // these are asset _files_, not the pictures. 'storage/private_uploads/audits', 'storage/private_uploads/imports', 'storage/private_uploads/assetmodels', 'storage/private_uploads/users', 'storage/private_uploads/licenses', - 'storage/private_uploads/signatures' // We probably don't want this in the first place. + 'storage/private_uploads/signatures', ]; $private_files = [ 'storage/oauth-private.key', - 'storage/oauth-public.key' + 'storage/oauth-public.key', ]; $public_dirs = [ 'public/uploads/companies', 'public/uploads/components', 'public/uploads/categories', 'public/uploads/manufacturers', - 'public/uploads/barcodes', // don't want this neither + //'public/uploads/barcodes', // we don't want this, let the barcodes be regenerated 'public/uploads/consumables', 'public/uploads/departments', 'public/uploads/avatars', 'public/uploads/suppliers', - 'public/uploads/assets', //wait, what?! + 'public/uploads/assets', // these are asset _pictures_, not asset files 'public/uploads/locations', 'public/uploads/accessories', 'public/uploads/models', + 'public/uploads/categories', + 'public/uploads/avatars', + 'public/uploads/manufacturers', ]; - + $public_files = [ - 'public/uploads/logo.png' + 'public/uploads/logo.*', + 'public/uploads/setting-email_logo*', + 'public/uploads/setting-label_logo*', + 'public/uploads/setting-logo*', + 'public/uploads/favicon.*', + 'public/uploads/favicon-uploaded.*', ]; $all_files = $private_dirs + $public_dirs; @@ -117,61 +124,79 @@ class RestoreFromBackup extends Command $sqlfile_indices = []; $interesting_files = []; - - for ($i=0; $i<$za->numFiles;$i++) { + $boring_files = []; + + for ($i = 0; $i < $za->numFiles; $i++) { $stat_results = $za->statIndex($i); // echo "index: $i\n"; // print_r($stat_results); - + $raw_path = $stat_results['name']; - // skip macOS resource fork files (?!?!?!) - if(strpos($raw_path,"__MACOSX")!==false && strpos($raw_path,"._") !== false) { - //print "SKIPPING macOS Resource fork file: $raw_path\n"; - continue; - } - if(strpos($raw_path,'\\')!==false) { //found a backslash, swap it to forward-slash - $raw_path = strtr($raw_path,'\\','/'); + if (strpos($raw_path, '\\') !== false) { //found a backslash, swap it to forward-slash + $raw_path = strtr($raw_path, '\\', '/'); //print "Translating file: ".$stat_results['name']." to: ".$raw_path."\n"; } - - if(@pathinfo($raw_path)['extension'] == "sql") { - print "Found a sql file!\n"; + + // skip macOS resource fork files (?!?!?!) + if (strpos($raw_path, '__MACOSX') !== false && strpos($raw_path, '._') !== false) { + //print "SKIPPING macOS Resource fork file: $raw_path\n"; + $boring_files[] = $raw_path; + continue; + } + if (@pathinfo($raw_path)['extension'] == 'sql') { + echo "Found a sql file!\n"; $sqlfiles[] = $raw_path; $sqlfile_indices[] = $i; + continue; } - - foreach($private_dirs+$public_dirs as $dir) { - $last_pos = strrpos($raw_path,$dir.'/'); - if($last_pos !== false ) { + + foreach (array_merge($private_dirs, $public_dirs) as $dir) { + $last_pos = strrpos($raw_path, $dir.'/'); + if ($last_pos !== false) { //print("INTERESTING - last_pos is $last_pos when searching $raw_path for $dir - last_pos+strlen(\$dir) is: ".($last_pos+strlen($dir))." and strlen(\$rawpath) is: ".strlen($raw_path)."\n"); - print("We would copy $raw_path to $dir.\n"); //FIXME append to a path? + //print("We would copy $raw_path to $dir.\n"); //FIXME append to a path? $interesting_files[$raw_path] = ['dest' =>$dir, 'index' => $i]; - if($last_pos + strlen($dir) +1 == strlen($raw_path)) { + continue 2; + if ($last_pos + strlen($dir) + 1 == strlen($raw_path)) { // we don't care about that; we just want files with the appropriate prefix //print("FOUND THE EXACT DIRECTORY: $dir AT: $raw_path!!!\n"); } } } - foreach($private_files+$public_files as $file) { - $last_pos = strrpos($raw_path,$file); // no trailing slash! - if($last_pos !== false ) { + $good_extensions = ['png', 'gif', 'jpg', 'svg', 'jpeg', 'doc', 'docx', 'pdf', 'txt', + 'zip', 'rar', 'xls', 'xlsx', 'lic', 'xml', 'rtf', 'webp', 'key', 'ico', ]; + foreach (array_merge($private_files, $public_files) as $file) { + $has_wildcard = (strpos($file, '*') !== false); + if ($has_wildcard) { + $file = substr($file, 0, -1); //trim last character (which should be the wildcard) + } + $last_pos = strrpos($raw_path, $file); // no trailing slash! + if ($last_pos !== false) { + $extension = strtolower(pathinfo($raw_path, PATHINFO_EXTENSION)); + if (! in_array($extension, $good_extensions)) { + $this->warn('Potentially unsafe file '.$raw_path.' is being skipped'); + $boring_files[] = $raw_path; + continue 2; + } //print("INTERESTING - last_pos is $last_pos when searching $raw_path for $file - last_pos+strlen(\$file) is: ".($last_pos+strlen($file))." and strlen(\$rawpath) is: ".strlen($raw_path)."\n"); - if($last_pos + strlen($file) == strlen($raw_path)) { //again, no trailing slash - print("FOUND THE EXACT FILE: $file AT: $raw_path!!!\n"); //we *do* care about this, though. - $interesting_files[$raw_path] = ['dest' => dirname($file),'index' => $i]; + //no wildcards found in $file, process 'normally' + if ($last_pos + strlen($file) == strlen($raw_path) || $has_wildcard) { //again, no trailing slash. or this is a wildcard and we just take it. + // print("FOUND THE EXACT FILE: $file AT: $raw_path!!!\n"); //we *do* care about this, though. + $interesting_files[$raw_path] = ['dest' => dirname($file), 'index' => $i]; + continue 2; } } - } - } + $boring_files[] = $raw_path; //if we've gotten to here and haven't continue'ed our way into the next iteration, we don't want this file + } // end of pre-processing the ZIP file for-loop // print_r($interesting_files);exit(-1); - if( count($sqlfiles) != 1) { - return $this->error("There should be exactly *one* sql backup file found, found: ".( count($sqlfiles) == 0 ? "None" : implode(", ",$sqlfiles))); + if (count($sqlfiles) != 1) { + return $this->error('There should be exactly *one* sql backup file found, found: '.(count($sqlfiles) == 0 ? 'None' : implode(', ', $sqlfiles))); } - if( strpos($sqlfiles[0], "db-dumps") === false ) { + if (strpos($sqlfiles[0], 'db-dumps') === false) { //return $this->error("SQL backup file is missing 'db-dumps' component of full pathname: ".$sqlfiles[0]); //older Snipe-IT installs don't have the db-dumps subdirectory component } @@ -179,16 +204,15 @@ class RestoreFromBackup extends Command //how to invoke the restore? $pipes = []; - // FIXME - absolutely can *NOT* be hardcoding paths like this!!!!!!! But I don't know how to do it right? (Maybe get the user's ENV and append the MYSQL_PWD to it?) $env_vars = getenv(); - $env_vars['MYSQL_PWD'] = config("database.connections.mysql.password"); - $proc_results = proc_open("mysql -h ".escapeshellarg(config('database.connections.mysql.host'))." -u ".escapeshellarg(config('database.connections.mysql.username'))." ".escapeshellarg(config('database.connections.mysql.database')), // yanked -p since we pass via ENV - [0 => ['pipe','r'],1 => ['pipe','w'],2 => ['pipe','w']], + $env_vars['MYSQL_PWD'] = config('database.connections.mysql.password'); + $proc_results = proc_open('mysql -h '.escapeshellarg(config('database.connections.mysql.host')).' -u '.escapeshellarg(config('database.connections.mysql.username')).' '.escapeshellarg(config('database.connections.mysql.database')), // yanked -p since we pass via ENV + [0 => ['pipe', 'r'], 1 => ['pipe', 'w'], 2 => ['pipe', 'w']], $pipes, null, $env_vars); // this is not super-duper awesome-secure, but definitely more secure than showing it on the CLI, or dropping temporary files with passwords in them. - if($proc_results === false) { - return $this->error("Unable to invoke mysql via CLI"); + if ($proc_results === false) { + return $this->error('Unable to invoke mysql via CLI'); } // $this->info("Stdout says? ".fgets($pipes[1])); //FIXME: I think we might need to set non-blocking mode to use this properly? @@ -199,51 +223,74 @@ class RestoreFromBackup extends Command //$sql_contents = fopen($sqlfiles[0], "r"); //NOPE! This isn't a real file yet, silly-billy! $sql_stat = $za->statIndex($sqlfile_indices[0]); - $this->info("SQL Stat is: ".print_r($sql_stat,true)); + //$this->info("SQL Stat is: ".print_r($sql_stat,true)); $sql_contents = $za->getStream($sql_stat['name']); if ($sql_contents === false) { $stdout = fgets($pipes[1]); $this->info($stdout); $stderr = fgets($pipes[2]); $this->info($stderr); + return false; } - while(($buffer = fgets($sql_contents)) !== false ) { + while (($buffer = fgets($sql_contents)) !== false) { //$this->info("Buffer is: '$buffer'"); - $bytes_written = fwrite($pipes[0],$buffer); - if($bytes_written === false) { + $bytes_written = fwrite($pipes[0], $buffer); + if ($bytes_written === false) { $stdout = fgets($pipes[1]); $this->info($stdout); $stderr = fgets($pipes[2]); $this->info($stderr); + return false; } } fclose($pipes[0]); fclose($sql_contents); + + $this->line(stream_get_contents($pipes[1])); fclose($pipes[1]); + + $this->error(stream_get_contents($pipes[2])); fclose($pipes[2]); + //wait, have to do fclose() on all pipes first? $close_results = proc_close($proc_results); - if($close_results != 0) { - return $this->error("There may have been a problem with the database import: Error number ".$close_results); + if ($close_results != 0) { + return $this->error('There may have been a problem with the database import: Error number '.$close_results); } - + //and now copy the files over too (right?) //FIXME - we don't prune the filesystem space yet!!!! - foreach($interesting_files AS $pretty_file_name => $file_details) { + if ($this->option('no-progress')) { + $bar = null; + } else { + $bar = $this->output->createProgressBar(count($interesting_files)); + } + foreach ($interesting_files as $pretty_file_name => $file_details) { $ugly_file_name = $za->statIndex($file_details['index'])['name']; $fp = $za->getStream($ugly_file_name); - $this->info("Weird problem, here are file details? ".print_r($file_details,true)); - $migrated_file = fopen($file_details['dest']."/".basename($pretty_file_name),"w"); - while(($buffer = fgets($fp))!== false) { - fwrite($migrated_file,$buffer); + //$this->info("Weird problem, here are file details? ".print_r($file_details,true)); + $migrated_file = fopen($file_details['dest'].'/'.basename($pretty_file_name), 'w'); + while (($buffer = fgets($fp)) !== false) { + fwrite($migrated_file, $buffer); } fclose($migrated_file); fclose($fp); - $this->info("Wrote $ugly_file_name to $pretty_file_name"); + //$this->info("Wrote $ugly_file_name to $pretty_file_name"); + if ($bar) { + $bar->advance(); + } + } + if ($bar) { + $bar->finish(); + $this->line(''); + } else { + $this->info(count($interesting_files).' files were succesfully transferred'); + } + foreach ($boring_files as $boring_file) { + $this->warn($boring_file.' was skipped.'); } - } } diff --git a/app/Console/Commands/RotateAppKey.php b/app/Console/Commands/RotateAppKey.php index 51c43d4ec9..08e528e4a4 100644 --- a/app/Console/Commands/RotateAppKey.php +++ b/app/Console/Commands/RotateAppKey.php @@ -2,12 +2,12 @@ namespace App\Console\Commands; -use Illuminate\Console\Command; -use Artisan; -use App\Models\CustomField; use App\Models\Asset; +use App\Models\CustomField; use App\Models\Setting; -use \Illuminate\Encryption\Encrypter; +use Artisan; +use Illuminate\Console\Command; +use Illuminate\Encryption\Encrypter; class RotateAppKey extends Command { @@ -42,9 +42,7 @@ class RotateAppKey extends Command */ public function handle() { - if ($this->confirm("\n****************************************************\nTHIS WILL MODIFY YOUR APP_KEY AND DE-CRYPT YOUR ENCRYPTED CUSTOM FIELDS AND \nRE-ENCRYPT THEM WITH A NEWLY GENERATED KEY. \n\nThere is NO undo. \n\nMake SURE you have a database backup and a backup of your .env generated BEFORE running this command. \n\nIf you do not save the newly generated APP_KEY to your .env in this process, \nyour encrypted data will no longer be decryptable. \n\nAre you SURE you wish to continue, and have confirmed you have a database backup and an .env backup? ")) { - - + if ($this->confirm("\n****************************************************\nTHIS WILL MODIFY YOUR APP_KEY AND DE-CRYPT YOUR ENCRYPTED CUSTOM FIELDS AND \nRE-ENCRYPT THEM WITH A NEWLY GENERATED KEY. \n\nThere is NO undo. \n\nMake SURE you have a database backup and a backup of your .env generated BEFORE running this command. \n\nIf you do not save the newly generated APP_KEY to your .env in this process, \nyour encrypted data will no longer be decryptable. \n\nAre you SURE you wish to continue, and have confirmed you have a database backup and an .env backup? ")) { // Get the existing app_key and ciphers // We put them in a variable since we clear the cache partway through here. @@ -73,33 +71,26 @@ class RotateAppKey extends Command $fields = CustomField::where('field_encrypted', '1')->get(); - foreach ($fields as $field) { - $assets = Asset::whereNotNull($field->db_column)->get(); foreach ($assets as $asset) { - $asset->{$field->db_column} = $oldEncrypter->decrypt($asset->{$field->db_column}); - $this->line('DECRYPTED: '. $field->db_column); + $this->line('DECRYPTED: '.$field->db_column); $asset->{$field->db_column} = $newEncrypter->encrypt($asset->{$field->db_column}); $this->line('ENCRYPTED: '.$field->db_column); $asset->save(); - } - } // Handle the LDAP password if one is provided $setting = Setting::first(); - if ($setting->ldap_pword!='') { - $setting->ldap_pword = $oldEncrypter->decrypt($setting->ldap_pword); - $setting->ldap_pword = $newEncrypter->encrypt($setting->ldap_pword); + if ($setting->ldap_pword != '') { + $setting->ldap_pword = $oldEncrypter->decrypt($setting->ldap_pword); + $setting->ldap_pword = $newEncrypter->encrypt($setting->ldap_pword); $setting->save(); $this->warn('LDAP password has been re-encrypted.'); } - - } else { $this->info('This operation has been canceled. No changes have been made.'); } @@ -113,7 +104,6 @@ class RotateAppKey extends Command */ protected function writeNewEnvironmentFileWith($key) { - file_put_contents($this->laravel->environmentFilePath(), preg_replace( $this->keyReplacementPattern(), 'APP_KEY='.$key, @@ -129,7 +119,7 @@ class RotateAppKey extends Command protected function keyReplacementPattern() { $escaped = preg_quote('='.$this->laravel['config']['app.key'], '/'); + return "/^APP_KEY{$escaped}/m"; } - } diff --git a/app/Console/Commands/SendCurrentInventoryToUsers.php b/app/Console/Commands/SendCurrentInventoryToUsers.php index 9f1fe0f761..74acc9cc0f 100644 --- a/app/Console/Commands/SendCurrentInventoryToUsers.php +++ b/app/Console/Commands/SendCurrentInventoryToUsers.php @@ -39,22 +39,16 @@ class SendCurrentInventoryToUsers extends Command */ public function handle() { - $users = User::whereNull('deleted_at')->whereNotNull('email')->with('assets', 'accessories', 'licenses')->get(); $count = 0; foreach ($users as $user) { - - if (($user->assets->count() > 0) || ($user->accessories->count() > 0) || ($user->licenses->count() > 0)) - { + if (($user->assets->count() > 0) || ($user->accessories->count() > 0) || ($user->licenses->count() > 0)) { $count++; $user->notify((new CurrentInventory($user))); } - } $this->info($count.' users notified.'); - - } } diff --git a/app/Console/Commands/SendExpectedCheckinAlerts.php b/app/Console/Commands/SendExpectedCheckinAlerts.php index b0cbb1f518..83a93a8a6b 100644 --- a/app/Console/Commands/SendExpectedCheckinAlerts.php +++ b/app/Console/Commands/SendExpectedCheckinAlerts.php @@ -3,12 +3,12 @@ namespace App\Console\Commands; use App\Models\Asset; +use App\Models\Recipients\AlertRecipient; use App\Models\Setting; use App\Notifications\ExpectedCheckinAdminNotification; use App\Notifications\ExpectedCheckinNotification; use Carbon\Carbon; use Illuminate\Console\Command; -use App\Models\Recipients\AlertRecipient; class SendExpectedCheckinAlerts extends Command { @@ -41,12 +41,12 @@ class SendExpectedCheckinAlerts extends Command */ public function handle() { - $settings = Setting::getSettings(); + $settings = Setting::getSettings(); $whenNotify = Carbon::now()->addDays(7); - $assets = Asset::with('assignedTo')->whereNotNull('assigned_to')->whereNotNull('expected_checkin')->where('expected_checkin', '<=', $whenNotify)->get(); + $assets = Asset::with('assignedTo')->whereNotNull('assigned_to')->whereNotNull('expected_checkin')->where('expected_checkin', '<=', $whenNotify)->get(); - $this->info($whenNotify . ' is deadline'); - $this->info($assets->count() . ' assets'); + $this->info($whenNotify.' is deadline'); + $this->info($assets->count().' assets'); foreach ($assets as $asset) { if ($asset->assigned && $asset->checkedOutToUser()) { diff --git a/app/Console/Commands/SendExpirationAlerts.php b/app/Console/Commands/SendExpirationAlerts.php index f88c345669..025ba2ce23 100644 --- a/app/Console/Commands/SendExpirationAlerts.php +++ b/app/Console/Commands/SendExpirationAlerts.php @@ -41,7 +41,7 @@ class SendExpirationAlerts extends Command */ public function handle() { - $settings = Setting::getSettings(); + $settings = Setting::getSettings(); $threshold = $settings->alert_interval; if (($settings->alert_email != '') && ($settings->alerts_enabled == 1)) { diff --git a/app/Console/Commands/SendUpcomingAuditReport.php b/app/Console/Commands/SendUpcomingAuditReport.php index bac5a21698..e9cba106c6 100644 --- a/app/Console/Commands/SendUpcomingAuditReport.php +++ b/app/Console/Commands/SendUpcomingAuditReport.php @@ -4,13 +4,13 @@ namespace App\Console\Commands; use App\Models\Asset; use App\Models\License; +use App\Models\Recipients; use App\Models\Setting; use App\Notifications\ExpiringAssetsNotification; -use App\Models\Recipients; -use DB; -use Illuminate\Console\Command; use App\Notifications\SendUpcomingAuditNotification; use Carbon\Carbon; +use DB; +use Illuminate\Console\Command; class SendUpcomingAuditReport extends Command { @@ -54,7 +54,6 @@ class SendUpcomingAuditReport extends Command return new \App\Models\Recipients\AlertRecipient($item); }); - // Assets due for auditing $assets = Asset::whereNotNull('next_audit_date') @@ -62,7 +61,6 @@ class SendUpcomingAuditReport extends Command ->orderBy('last_audit_date', 'asc')->get(); if ($assets->count() > 0) { - $this->info(trans_choice('mail.upcoming-audits', $assets->count(), ['count' => $assets->count(), 'threshold' => $settings->audit_warning_days])); \Notification::send($recipients, new SendUpcomingAuditNotification($assets, $settings->audit_warning_days)); @@ -70,14 +68,11 @@ class SendUpcomingAuditReport extends Command } else { $this->info('No assets to be audited. No report sent.'); } - - - - } elseif ($settings->alert_email=='') { + } elseif ($settings->alert_email == '') { $this->error('Could not send email. No alert email configured in settings'); - } elseif (!$settings->audit_warning_days) { + } elseif (! $settings->audit_warning_days) { $this->error('No audit warning days set in Admin Notifications. No mail will be sent.'); - } elseif ($settings->alerts_enabled!=1) { + } elseif ($settings->alerts_enabled != 1) { $this->info('Alerts are disabled in the settings. No mail will be sent'); } else { $this->error('Something went wrong. :( '); @@ -85,7 +80,5 @@ class SendUpcomingAuditReport extends Command $this->error('Admin Audit Warning Setting: '.$settings->audit_warning_days); $this->error('Admin Alerts Emnabled: '.$settings->alerts_enabled); } - - } } diff --git a/app/Console/Commands/SyncAssetCounters.php b/app/Console/Commands/SyncAssetCounters.php index 33104818e1..ab88168218 100644 --- a/app/Console/Commands/SyncAssetCounters.php +++ b/app/Console/Commands/SyncAssetCounters.php @@ -45,14 +45,14 @@ class SyncAssetCounters extends Command if ($assets) { if ($assets->count() > 0) { $bar = $this->output->createProgressBar($assets->count()); - + foreach ($assets as $asset) { $asset->checkin_counter = (int) $asset->checkins_count; $asset->checkout_counter = (int) $asset->checkouts_count; $asset->requests_counter = (int) $asset->user_requests_count; $asset->unsetEventDispatcher(); $asset->save(); - $output['info'][] = 'Asset: ' . $asset->id . ' has ' . $asset->checkin_counter . ' checkins, ' . $asset->checkout_counter . ' checkouts, and ' . $asset->requests_counter . ' requests'; + $output['info'][] = 'Asset: '.$asset->id.' has '.$asset->checkin_counter.' checkins, '.$asset->checkout_counter.' checkouts, and '.$asset->requests_counter.' requests'; $bar->advance(); } $bar->finish(); @@ -62,15 +62,10 @@ class SyncAssetCounters extends Command } $time_elapsed_secs = microtime(true) - $start; - $this->info('Sync executed in ' . $time_elapsed_secs . ' seconds'); - + $this->info('Sync executed in '.$time_elapsed_secs.' seconds'); } else { $this->info('No assets to sync'); } - } - - - } } diff --git a/app/Console/Commands/SyncAssetLocations.php b/app/Console/Commands/SyncAssetLocations.php index b5d3cd33e0..f510176bce 100644 --- a/app/Console/Commands/SyncAssetLocations.php +++ b/app/Console/Commands/SyncAssetLocations.php @@ -38,7 +38,6 @@ class SyncAssetLocations extends Command */ public function handle() { - $output['info'] = []; $output['warn'] = []; $output['error'] = []; @@ -51,96 +50,89 @@ class SyncAssetLocations extends Command $output['info'][] = 'There are '.$rtd_assets->count().' unassigned assets.'; foreach ($rtd_assets as $rtd_asset) { - $output['info'][] = 'Setting Unassigned Asset ' . $rtd_asset->id . ' ('.$rtd_asset->asset_tag.') to location: ' . $rtd_asset->rtd_location_id . " because their default location is: " . $rtd_asset->rtd_location_id; - $rtd_asset->location_id=$rtd_asset->rtd_location_id; + $output['info'][] = 'Setting Unassigned Asset '.$rtd_asset->id.' ('.$rtd_asset->asset_tag.') to location: '.$rtd_asset->rtd_location_id.' because their default location is: '.$rtd_asset->rtd_location_id; + $rtd_asset->location_id = $rtd_asset->rtd_location_id; $rtd_asset->unsetEventDispatcher(); $rtd_asset->save(); $bar->advance(); } - $assigned_user_assets = Asset::where('assigned_type','App\Models\User')->whereNotNull('assigned_to')->whereNull('deleted_at')->get(); + $assigned_user_assets = Asset::where('assigned_type', \App\Models\User::class)->whereNotNull('assigned_to')->whereNull('deleted_at')->get(); $output['info'][] = 'There are '.$assigned_user_assets->count().' assets checked out to users.'; foreach ($assigned_user_assets as $assigned_user_asset) { if (($assigned_user_asset->assignedTo) && ($assigned_user_asset->assignedTo->userLoc)) { $new_location = $assigned_user_asset->assignedTo->userLoc->id; - $output['info'][] ='Setting User Asset ' . $assigned_user_asset->id . ' ('.$assigned_user_asset->asset_tag.') to ' . $assigned_user_asset->assignedTo->userLoc->name . ' which is id: ' . $new_location; + $output['info'][] = 'Setting User Asset '.$assigned_user_asset->id.' ('.$assigned_user_asset->asset_tag.') to '.$assigned_user_asset->assignedTo->userLoc->name.' which is id: '.$new_location; } else { - $output['warn'][] ='Asset ' . $assigned_user_asset->id . ' ('.$assigned_user_asset->asset_tag.') still has no location! '; + $output['warn'][] = 'Asset '.$assigned_user_asset->id.' ('.$assigned_user_asset->asset_tag.') still has no location! '; $new_location = $assigned_user_asset->rtd_location_id; } - $assigned_user_asset->location_id=$new_location; + $assigned_user_asset->location_id = $new_location; $assigned_user_asset->unsetEventDispatcher(); $assigned_user_asset->save(); $bar->advance(); - } - $assigned_location_assets = Asset::where('assigned_type','App\Models\Location') + $assigned_location_assets = Asset::where('assigned_type', \App\Models\Location::class) ->whereNotNull('assigned_to')->whereNull('deleted_at')->get(); $output['info'][] = 'There are '.$assigned_location_assets->count().' assets checked out to locations.'; foreach ($assigned_location_assets as $assigned_location_asset) { if ($assigned_location_asset->assignedTo) { $assigned_location_asset->location_id = $assigned_location_asset->assignedTo->id; - $output['info'][] ='Setting Location Assigned asset ' . $assigned_location_asset->id . ' ('.$assigned_location_asset->asset_tag.') that is checked out to '.$assigned_location_asset->assignedTo->name.' (#'.$assigned_location_asset->assignedTo->id.') to location: ' . $assigned_location_asset->assetLoc()->id; + $output['info'][] = 'Setting Location Assigned asset '.$assigned_location_asset->id.' ('.$assigned_location_asset->asset_tag.') that is checked out to '.$assigned_location_asset->assignedTo->name.' (#'.$assigned_location_asset->assignedTo->id.') to location: '.$assigned_location_asset->assetLoc()->id; $assigned_location_asset->unsetEventDispatcher(); $assigned_location_asset->save(); } else { - $output['warn'][] ='Asset ' . $assigned_location_asset->id . ' ('.$assigned_location_asset->asset_tag.') did not return a valid associated location - perhaps it was deleted?'; + $output['warn'][] = 'Asset '.$assigned_location_asset->id.' ('.$assigned_location_asset->asset_tag.') did not return a valid associated location - perhaps it was deleted?'; } $bar->advance(); - } - // Assigned to assets - $assigned_asset_assets = Asset::where('assigned_type','App\Models\Asset') + $assigned_asset_assets = Asset::where('assigned_type', \App\Models\Asset::class) ->whereNotNull('assigned_to')->whereNull('deleted_at')->get(); - $output['info'][] ='Asset-assigned assets: '.$assigned_asset_assets->count(); + $output['info'][] = 'Asset-assigned assets: '.$assigned_asset_assets->count(); - foreach ($assigned_asset_assets as $assigned_asset_asset) { + foreach ($assigned_asset_assets as $assigned_asset_asset) { // Check to make sure there aren't any invalid relationships - if ($assigned_asset_asset->assetLoc()) { - $assigned_asset_asset->location_id = $assigned_asset_asset->assetLoc()->id; - $output['info'][] ='Setting Asset Assigned asset ' . $assigned_asset_asset->assetLoc()->id. ' ('.$assigned_asset_asset->asset_tag.') location to: ' . $assigned_asset_asset->assetLoc()->id; - $assigned_asset_asset->unsetEventDispatcher(); - $assigned_asset_asset->save(); - } else { - $output['warn'][] ='Asset Assigned asset ' . $assigned_asset_asset->id. ' ('.$assigned_asset_asset->asset_tag.') does not seem to have a valid location'; - } - - $bar->advance(); - + if ($assigned_asset_asset->assetLoc()) { + $assigned_asset_asset->location_id = $assigned_asset_asset->assetLoc()->id; + $output['info'][] = 'Setting Asset Assigned asset '.$assigned_asset_asset->assetLoc()->id.' ('.$assigned_asset_asset->asset_tag.') location to: '.$assigned_asset_asset->assetLoc()->id; + $assigned_asset_asset->unsetEventDispatcher(); + $assigned_asset_asset->save(); + } else { + $output['warn'][] = 'Asset Assigned asset '.$assigned_asset_asset->id.' ('.$assigned_asset_asset->asset_tag.') does not seem to have a valid location'; } - $unlocated_assets = Asset::whereNull("location_id")->whereNull('deleted_at')->get(); - $output['info'][] ='Assets still without a location: '.$unlocated_assets->count(); - foreach($unlocated_assets as $unlocated_asset) { - $output['warn'][] ='Asset: '.$unlocated_asset->id.' still has no location. '; + $bar->advance(); + } + + $unlocated_assets = Asset::whereNull('location_id')->whereNull('deleted_at')->get(); + $output['info'][] = 'Assets still without a location: '.$unlocated_assets->count(); + foreach ($unlocated_assets as $unlocated_asset) { + $output['warn'][] = 'Asset: '.$unlocated_asset->id.' still has no location. '; $bar->advance(); } $bar->finish(); $this->info("\n"); - - if (($this->option('output')=='all') || ($this->option('output')=='info')) { + if (($this->option('output') == 'all') || ($this->option('output') == 'info')) { foreach ($output['info'] as $key => $output_text) { $this->info($output_text); } } - if (($this->option('output')=='all') || ($this->option('output')=='warn')) { + if (($this->option('output') == 'all') || ($this->option('output') == 'warn')) { foreach ($output['warn'] as $key => $output_text) { $this->warn($output_text); } } - if (($this->option('output')=='all') || ($this->option('output')=='error')) { + if (($this->option('output') == 'all') || ($this->option('output') == 'error')) { foreach ($output['error'] as $key => $output_text) { $this->error($output_text); } } - - } } diff --git a/app/Console/Commands/SystemBackup.php b/app/Console/Commands/SystemBackup.php index 2e4965c28b..b7ca526052 100644 --- a/app/Console/Commands/SystemBackup.php +++ b/app/Console/Commands/SystemBackup.php @@ -6,7 +6,6 @@ use Illuminate\Console\Command; class SystemBackup extends Command { - /** * The console command name. * @@ -40,6 +39,5 @@ class SystemBackup extends Command { // $this->call('backup:run'); - } } diff --git a/app/Console/Commands/Version.php b/app/Console/Commands/Version.php index e73b6aae5e..0a10f4f541 100644 --- a/app/Console/Commands/Version.php +++ b/app/Console/Commands/Version.php @@ -37,7 +37,6 @@ class Version extends Command */ public function handle() { - $use_branch = $this->option('branch'); $use_type = $this->option('type'); $git_branch = trim(shell_exec('git rev-parse --abbrev-ref HEAD')); @@ -54,72 +53,66 @@ class Version extends Command $this->line('Type is: '.$use_type); $this->line('Current version is: '.$full_hash_version); - if (count($version)==3) { + if (count($version) == 3) { $this->line('This does not look like an alpha/beta release.'); } else { - if (array_key_exists('3',$version)) { + if (array_key_exists('3', $version)) { $this->line('The current version looks like a beta release.'); $prerelease_version = $version[1]; $hash_version = $version[3]; } } - $app_version_raw = explode('.', $app_version); $maj = str_replace('v', '', $app_version_raw[0]); $min = $app_version_raw[1]; $patch = ''; - - // This is a major release that might not have a third .0 if (array_key_exists(2, $app_version_raw)) { $patch = $app_version_raw[2]; } - if ($use_type=='major') { - $app_version = "v".($maj + 1).".$min.$patch"; - } elseif ($use_type=='minor') { - $app_version = "v"."$maj.".($min + 1).".$patch"; - } elseif ($use_type=='pre') { - $pre_raw = str_replace('beta','', $prerelease_version); - $pre_raw = str_replace('alpha','', $pre_raw); - $pre_raw = str_ireplace('rc','', $pre_raw); + if ($use_type == 'major') { + $app_version = 'v'.($maj + 1).".$min.$patch"; + } elseif ($use_type == 'minor') { + $app_version = 'v'."$maj.".($min + 1).".$patch"; + } elseif ($use_type == 'pre') { + $pre_raw = str_replace('beta', '', $prerelease_version); + $pre_raw = str_replace('alpha', '', $pre_raw); + $pre_raw = str_ireplace('rc', '', $pre_raw); $pre_raw = $pre_raw++; - $this->line('Setting the pre-release to '. $prerelease_version.'-'.$pre_raw); - $app_version = "v"."$maj.".($min + 1).".$patch"; - } elseif ($use_type=='patch') { - $app_version = "v" . "$maj.$min." . ($patch + 1); + $this->line('Setting the pre-release to '.$prerelease_version.'-'.$pre_raw); + $app_version = 'v'."$maj.".($min + 1).".$patch"; + } elseif ($use_type == 'patch') { + $app_version = 'v'."$maj.$min.".($patch + 1); // If nothing is passed, leave the version as it is, just increment the build } else { - $app_version = "v" . "$maj.$min." . $patch; + $app_version = 'v'."$maj.$min.".$patch; } // Determine if this tag already exists, or if this prior to a release $this->line('Running: git rev-parse master '.$current_app_version); // $pre_release = trim(shell_exec('git rev-parse '.$use_branch.' '.$current_app_version.' 2>&1 1> /dev/null')); - if ($use_branch=='develop') { + if ($use_branch == 'develop') { $app_version = $app_version.'-pre'; } $full_app_version = $app_version.' - build '.$build_version.'-'.$hash_version; - $array = var_export( - array( + [ 'app_version' => $app_version, 'full_app_version' => $full_app_version, 'build_version' => $build_version, 'prerelease_version' => $prerelease_version, 'hash_version' => $hash_version, 'full_hash' => $full_hash_version, - 'branch' => $git_branch), + 'branch' => $git_branch, ], true ); - - // Construct our file content $content = <<info('Setting NEW version: '. $full_app_version.' ('.$git_branch.')'); + $this->info('Setting NEW version: '.$full_app_version.' ('.$git_branch.')'); } - } diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 1dcac211b2..9a5294c2d2 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -10,7 +10,6 @@ use Illuminate\Foundation\Console\Kernel as ConsoleKernel; class Kernel extends ConsoleKernel { - /** * Define the application's command schedule. * diff --git a/app/Events/CheckoutAccepted.php b/app/Events/CheckoutAccepted.php index 5146b32ee9..cd5ee19776 100644 --- a/app/Events/CheckoutAccepted.php +++ b/app/Events/CheckoutAccepted.php @@ -18,6 +18,6 @@ class CheckoutAccepted */ public function __construct(CheckoutAcceptance $acceptance) { - $this->acceptance = $acceptance; + $this->acceptance = $acceptance; } } diff --git a/app/Events/CheckoutDeclined.php b/app/Events/CheckoutDeclined.php index 44f399423f..01d84b30f3 100644 --- a/app/Events/CheckoutDeclined.php +++ b/app/Events/CheckoutDeclined.php @@ -10,7 +10,7 @@ use Illuminate\Queue\SerializesModels; class CheckoutDeclined { use Dispatchable, SerializesModels; - + /** * Create a new event instance. * @@ -18,6 +18,6 @@ class CheckoutDeclined */ public function __construct(CheckoutAcceptance $acceptance) { - $this->acceptance = $acceptance; + $this->acceptance = $acceptance; } } diff --git a/app/Events/CheckoutableCheckedIn.php b/app/Events/CheckoutableCheckedIn.php index 54e3db6abc..9609f7d415 100644 --- a/app/Events/CheckoutableCheckedIn.php +++ b/app/Events/CheckoutableCheckedIn.php @@ -25,8 +25,8 @@ class CheckoutableCheckedIn { $this->checkoutable = $checkoutable; $this->checkedOutTo = $checkedOutTo; - $this->checkedInBy = $checkedInBy; - $this->note = $note; - $this->action_date = $action_date ?? date('Y-m-d'); + $this->checkedInBy = $checkedInBy; + $this->note = $note; + $this->action_date = $action_date ?? date('Y-m-d'); } } diff --git a/app/Events/CheckoutableCheckedOut.php b/app/Events/CheckoutableCheckedOut.php index 5e6ffd243a..30f70ca0d8 100644 --- a/app/Events/CheckoutableCheckedOut.php +++ b/app/Events/CheckoutableCheckedOut.php @@ -25,6 +25,6 @@ class CheckoutableCheckedOut $this->checkoutable = $checkoutable; $this->checkedOutTo = $checkedOutTo; $this->checkedOutBy = $checkedOutBy; - $this->note = $note; + $this->note = $note; } } diff --git a/app/Exceptions/CheckoutNotAllowed.php b/app/Exceptions/CheckoutNotAllowed.php index 6fe2c1d484..172f072aee 100644 --- a/app/Exceptions/CheckoutNotAllowed.php +++ b/app/Exceptions/CheckoutNotAllowed.php @@ -6,17 +6,17 @@ use Exception; class CheckoutNotAllowed extends Exception { - private $errorMessage; - function __construct($errorMessage = null) + public function __construct($errorMessage = null) { $this->errorMessage = $errorMessage; parent::__construct($errorMessage); } + public function __toString() { - return is_null($this->errorMessage) ? "A checkout is not allowed under these circumstances" : $this->errorMessage; + return is_null($this->errorMessage) ? 'A checkout is not allowed under these circumstances' : $this->errorMessage; } } diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index de890d3e4d..17a3682885 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -2,30 +2,22 @@ namespace App\Exceptions; -use Exception; -use Illuminate\Auth\AuthenticationException; use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; use App\Helpers\Helper; use Illuminate\Validation\ValidationException; use Log; +use Throwable; class Handler extends ExceptionHandler { /** - * A list of the exception types that should not be reported. + * A list of the exception types that are not reported. * * @var array */ protected $dontReport = [ - \Illuminate\Auth\AuthenticationException::class, - \Illuminate\Auth\Access\AuthorizationException::class, - \Symfony\Component\HttpKernel\Exception\HttpException::class, - \Illuminate\Database\Eloquent\ModelNotFoundException::class, - \Illuminate\Session\TokenMismatchException::class, - \Illuminate\Validation\ValidationException::class, - \Intervention\Image\Exception\NotSupportedException::class, - \League\OAuth2\Server\Exception\OAuthServerException::class, + // ]; /** @@ -33,25 +25,26 @@ class Handler extends ExceptionHandler * * This is a great spot to send exceptions to Sentry, Bugsnag, etc. * - * @param \Exception $exception + * @param \Throwable $exception * @return void */ - public function report(Exception $exception) + public function report(Throwable $exception) { if ($this->shouldReport($exception)) { - \Log::error($exception); + Log::error($exception); return parent::report($exception); } } /** * Render an exception into an HTTP response. + * * * @param \Illuminate\Http\Request $request * @param \Exception $e * @return \Illuminate\Http\Response */ - public function render($request, Exception $e) + public function render($request, Throwable $e) { @@ -96,31 +89,26 @@ class Handler extends ExceptionHandler } - /** - * Convert an authentication exception into an unauthenticated response. + /** + * A list of the inputs that are never flashed for validation exceptions. * - * @param \Illuminate\Http\Request $request - * @param \Illuminate\Auth\AuthenticationException $exception - * @return \Illuminate\Http\Response + * @var array */ - protected function unauthenticated($request, AuthenticationException $exception) - { - if ($request->expectsJson()) { - return response()->json(['error' => 'Unauthorized or unauthenticated.'], 401); - } - - return redirect()->guest('login'); - } + protected $dontFlash = [ + 'current_password', + 'password', + 'password_confirmation', + ]; /** - * Convert a validation exception into a JSON response. + * Register the exception handling callbacks for the application. * - * @param \Illuminate\Http\Request $request - * @param \Illuminate\Validation\ValidationException $exception - * @return \Illuminate\Http\JsonResponse + * @return void */ - protected function invalidJson($request, ValidationException $exception) + public function register() { - return response()->json(Helper::formatStandardApiResponse('error', null, $exception->errors(), 400)); + $this->reportable(function (Throwable $e) { + // + }); } } diff --git a/app/Helpers/Helper.php b/app/Helpers/Helper.php index b950064988..528e8851e0 100644 --- a/app/Helpers/Helper.php +++ b/app/Helpers/Helper.php @@ -1,4 +1,5 @@ ] * @since [v2.0] - * @return String + * @return string */ public static function parseEscapedMarkedown($str) { @@ -33,7 +32,6 @@ class Helper } } - /** * The importer has formatted number strings since v3, * so the value might be a string, or an integer. @@ -41,12 +39,16 @@ class Helper * * @author [A. Gianotto] [] * @since [v2.0] - * @return String + * @return string */ public static function formatCurrencyOutput($cost) { if (is_numeric($cost)) { - return number_format($cost, 2, '.', ''); + + if (Setting::getSettings()->digit_separator=='1.234,56') { + return number_format($cost, 2, ',', '.'); + } + return number_format($cost, 2, '.', ','); } // It's already been parsed. return $cost; @@ -58,283 +60,282 @@ class Helper * * @author [A. Gianotto] [] * @since [v3.3] - * @return Array + * @return array */ public static function defaultChartColors($index = 0) { $colors = [ - "#008941", - "#FF4A46", - "#006FA6", - "#A30059", - "#1CE6FF", - "#FFDBE5", - "#7A4900", - "#0000A6", - "#63FFAC", - "#B79762", - "#004D43", - "#8FB0FF", - "#997D87", - "#5A0007", - "#809693", - "#FEFFE6", - "#1B4400", - "#4FC601", - "#3B5DFF", - "#4A3B53", - "#FF2F80", - "#61615A", - "#BA0900", - "#6B7900", - "#00C2A0", - "#FFAA92", - "#FF90C9", - "#B903AA", - "#D16100", - "#DDEFFF", - "#000035", - "#7B4F4B", - "#A1C299", - "#300018", - "#0AA6D8", - "#013349", - "#00846F", - "#372101", - "#FFB500", - "#C2FFED", - "#A079BF", - "#CC0744", - "#C0B9B2", - "#C2FF99", - "#001E09", - "#00489C", - "#6F0062", - "#0CBD66", - "#EEC3FF", - "#456D75", - "#B77B68", - "#7A87A1", - "#788D66", - "#885578", - "#FAD09F", - "#FF8A9A", - "#D157A0", - "#BEC459", - "#456648", - "#0086ED", - "#886F4C", - "#34362D", - "#B4A8BD", - "#00A6AA", - "#452C2C", - "#636375", - "#A3C8C9", - "#FF913F", - "#938A81", - "#575329", - "#00FECF", - "#B05B6F", - "#8CD0FF", - "#3B9700", - "#04F757", - "#C8A1A1", - "#1E6E00", - "#7900D7", - "#A77500", - "#6367A9", - "#A05837", - "#6B002C", - "#772600", - "#D790FF", - "#9B9700", - "#549E79", - "#FFF69F", - "#201625", - "#72418F", - "#BC23FF", - "#99ADC0", - "#3A2465", - "#922329", - "#5B4534", - "#FDE8DC", - "#404E55", - "#0089A3", - "#CB7E98", - "#A4E804", - "#324E72", - "#6A3A4C", - "#83AB58", - "#001C1E", - "#D1F7CE", - "#004B28", - "#C8D0F6", - "#A3A489", - "#806C66", - "#222800", - "#BF5650", - "#E83000", - "#66796D", - "#DA007C", - "#FF1A59", - "#8ADBB4", - "#1E0200", - "#5B4E51", - "#C895C5", - "#320033", - "#FF6832", - "#66E1D3", - "#CFCDAC", - "#D0AC94", - "#7ED379", - "#012C58", - "#7A7BFF", - "#D68E01", - "#353339", - "#78AFA1", - "#FEB2C6", - "#75797C", - "#837393", - "#943A4D", - "#B5F4FF", - "#D2DCD5", - "#9556BD", - "#6A714A", - "#001325", - "#02525F", - "#0AA3F7", - "#E98176", - "#DBD5DD", - "#5EBCD1", - "#3D4F44", - "#7E6405", - "#02684E", - "#962B75", - "#8D8546", - "#9695C5", - "#E773CE", - "#D86A78", - "#3E89BE", - "#CA834E", - "#518A87", - "#5B113C", - "#55813B", - "#E704C4", - "#00005F", - "#A97399", - "#4B8160", - "#59738A", - "#FF5DA7", - "#F7C9BF", - "#643127", - "#513A01", - "#6B94AA", - "#51A058", - "#A45B02", - "#1D1702", - "#E20027", - "#E7AB63", - "#4C6001", - "#9C6966", - "#64547B", - "#97979E", - "#006A66", - "#391406", - "#F4D749", - "#0045D2", - "#006C31", - "#DDB6D0", - "#7C6571", - "#9FB2A4", - "#00D891", - "#15A08A", - "#BC65E9", - "#FFFFFE", - "#C6DC99", - "#203B3C", - "#671190", - "#6B3A64", - "#F5E1FF", - "#FFA0F2", - "#CCAA35", - "#374527", - "#8BB400", - "#797868", - "#C6005A", - "#3B000A", - "#C86240", - "#29607C", - "#402334", - "#7D5A44", - "#CCB87C", - "#B88183", - "#AA5199", - "#B5D6C3", - "#A38469", - "#9F94F0", - "#A74571", - "#B894A6", - "#71BB8C", - "#00B433", - "#789EC9", - "#6D80BA", - "#953F00", - "#5EFF03", - "#E4FFFC", - "#1BE177", - "#BCB1E5", - "#76912F", - "#003109", - "#0060CD", - "#D20096", - "#895563", - "#29201D", - "#5B3213", - "#A76F42", - "#89412E", - "#1A3A2A", - "#494B5A", - "#A88C85", - "#F4ABAA", - "#A3F3AB", - "#00C6C8", - "#EA8B66", - "#958A9F", - "#BDC9D2", - "#9FA064", - "#BE4700", - "#658188", - "#83A485", - "#453C23", - "#47675D", - "#3A3F00", - "#061203", - "#DFFB71", - "#868E7E", - "#98D058", - "#6C8F7D", - "#D7BFC2", - "#3C3E6E", - "#D83D66", - "#2F5D9B", - "#6C5E46", - "#D25B88", - "#5B656C", - "#00B57F", - "#545C46", - "#866097", - "#365D25", - "#252F99", - "#00CCFF", - "#674E60", - "#FC009C", - "#92896B", + '#008941', + '#FF4A46', + '#006FA6', + '#A30059', + '#1CE6FF', + '#FFDBE5', + '#7A4900', + '#0000A6', + '#63FFAC', + '#B79762', + '#004D43', + '#8FB0FF', + '#997D87', + '#5A0007', + '#809693', + '#FEFFE6', + '#1B4400', + '#4FC601', + '#3B5DFF', + '#4A3B53', + '#FF2F80', + '#61615A', + '#BA0900', + '#6B7900', + '#00C2A0', + '#FFAA92', + '#FF90C9', + '#B903AA', + '#D16100', + '#DDEFFF', + '#000035', + '#7B4F4B', + '#A1C299', + '#300018', + '#0AA6D8', + '#013349', + '#00846F', + '#372101', + '#FFB500', + '#C2FFED', + '#A079BF', + '#CC0744', + '#C0B9B2', + '#C2FF99', + '#001E09', + '#00489C', + '#6F0062', + '#0CBD66', + '#EEC3FF', + '#456D75', + '#B77B68', + '#7A87A1', + '#788D66', + '#885578', + '#FAD09F', + '#FF8A9A', + '#D157A0', + '#BEC459', + '#456648', + '#0086ED', + '#886F4C', + '#34362D', + '#B4A8BD', + '#00A6AA', + '#452C2C', + '#636375', + '#A3C8C9', + '#FF913F', + '#938A81', + '#575329', + '#00FECF', + '#B05B6F', + '#8CD0FF', + '#3B9700', + '#04F757', + '#C8A1A1', + '#1E6E00', + '#7900D7', + '#A77500', + '#6367A9', + '#A05837', + '#6B002C', + '#772600', + '#D790FF', + '#9B9700', + '#549E79', + '#FFF69F', + '#201625', + '#72418F', + '#BC23FF', + '#99ADC0', + '#3A2465', + '#922329', + '#5B4534', + '#FDE8DC', + '#404E55', + '#0089A3', + '#CB7E98', + '#A4E804', + '#324E72', + '#6A3A4C', + '#83AB58', + '#001C1E', + '#D1F7CE', + '#004B28', + '#C8D0F6', + '#A3A489', + '#806C66', + '#222800', + '#BF5650', + '#E83000', + '#66796D', + '#DA007C', + '#FF1A59', + '#8ADBB4', + '#1E0200', + '#5B4E51', + '#C895C5', + '#320033', + '#FF6832', + '#66E1D3', + '#CFCDAC', + '#D0AC94', + '#7ED379', + '#012C58', + '#7A7BFF', + '#D68E01', + '#353339', + '#78AFA1', + '#FEB2C6', + '#75797C', + '#837393', + '#943A4D', + '#B5F4FF', + '#D2DCD5', + '#9556BD', + '#6A714A', + '#001325', + '#02525F', + '#0AA3F7', + '#E98176', + '#DBD5DD', + '#5EBCD1', + '#3D4F44', + '#7E6405', + '#02684E', + '#962B75', + '#8D8546', + '#9695C5', + '#E773CE', + '#D86A78', + '#3E89BE', + '#CA834E', + '#518A87', + '#5B113C', + '#55813B', + '#E704C4', + '#00005F', + '#A97399', + '#4B8160', + '#59738A', + '#FF5DA7', + '#F7C9BF', + '#643127', + '#513A01', + '#6B94AA', + '#51A058', + '#A45B02', + '#1D1702', + '#E20027', + '#E7AB63', + '#4C6001', + '#9C6966', + '#64547B', + '#97979E', + '#006A66', + '#391406', + '#F4D749', + '#0045D2', + '#006C31', + '#DDB6D0', + '#7C6571', + '#9FB2A4', + '#00D891', + '#15A08A', + '#BC65E9', + '#FFFFFE', + '#C6DC99', + '#203B3C', + '#671190', + '#6B3A64', + '#F5E1FF', + '#FFA0F2', + '#CCAA35', + '#374527', + '#8BB400', + '#797868', + '#C6005A', + '#3B000A', + '#C86240', + '#29607C', + '#402334', + '#7D5A44', + '#CCB87C', + '#B88183', + '#AA5199', + '#B5D6C3', + '#A38469', + '#9F94F0', + '#A74571', + '#B894A6', + '#71BB8C', + '#00B433', + '#789EC9', + '#6D80BA', + '#953F00', + '#5EFF03', + '#E4FFFC', + '#1BE177', + '#BCB1E5', + '#76912F', + '#003109', + '#0060CD', + '#D20096', + '#895563', + '#29201D', + '#5B3213', + '#A76F42', + '#89412E', + '#1A3A2A', + '#494B5A', + '#A88C85', + '#F4ABAA', + '#A3F3AB', + '#00C6C8', + '#EA8B66', + '#958A9F', + '#BDC9D2', + '#9FA064', + '#BE4700', + '#658188', + '#83A485', + '#453C23', + '#47675D', + '#3A3F00', + '#061203', + '#DFFB71', + '#868E7E', + '#98D058', + '#6C8F7D', + '#D7BFC2', + '#3C3E6E', + '#D83D66', + '#2F5D9B', + '#6C5E46', + '#D25B88', + '#5B656C', + '#00B57F', + '#545C46', + '#866097', + '#365D25', + '#252F99', + '#00CCFF', + '#674E60', + '#FC009C', + '#92896B', ]; return $colors[$index]; - } /** @@ -345,33 +346,33 @@ class Helper * * @return string */ - public static function adjustBrightness($hexCode, $adjustPercent) { + public static function adjustBrightness($hexCode, $adjustPercent) + { $hexCode = ltrim($hexCode, '#'); if (strlen($hexCode) == 3) { - $hexCode = $hexCode[0] . $hexCode[0] . $hexCode[1] . $hexCode[1] . $hexCode[2] . $hexCode[2]; + $hexCode = $hexCode[0].$hexCode[0].$hexCode[1].$hexCode[1].$hexCode[2].$hexCode[2]; } $hexCode = array_map('hexdec', str_split($hexCode, 2)); - foreach ($hexCode as & $color) { + foreach ($hexCode as &$color) { $adjustableLimit = $adjustPercent < 0 ? $color : 255 - $color; $adjustAmount = ceil($adjustableLimit * $adjustPercent); $color = str_pad(dechex($color + $adjustAmount), 2, '0', STR_PAD_LEFT); } - return '#' . implode($hexCode); + return '#'.implode($hexCode); } - /** * Static background (highlight) colors for pie charts * This is inelegant, and could be refactored later. * * @author [A. Gianotto] [] * @since [v3.2] - * @return Array + * @return array */ public static function chartBackgroundColors() { @@ -387,6 +388,7 @@ class Helper '#3c8dbc', ]; + return $colors; } @@ -396,13 +398,26 @@ class Helper * * @author [A. Gianotto] [] * @since [v2.7] - * @return String + * @return string */ public static function ParseFloat($floatString) { + /******* + * + * WARNING: This does conversions based on *locale* - a Unix-ey-like thing. + * + * Everything else in the system tends to convert based on the Snipe-IT settings + * + * So it's very likely this is *not* what you want - instead look for the new + * + * ParseCurrency($currencyString) + * + * Which should be directly below here + * + */ $LocaleInfo = localeconv(); - $floatString = str_replace(",", "", $floatString); - $floatString = str_replace($LocaleInfo["decimal_point"], ".", $floatString); + $floatString = str_replace(',', '', $floatString); + $floatString = str_replace($LocaleInfo['decimal_point'], '.', $floatString); // Strip Currency symbol // If no currency symbol is set, default to $ because Murica $currencySymbol = $LocaleInfo['currency_symbol']; @@ -411,20 +426,42 @@ class Helper } $floatString = str_replace($currencySymbol, '', $floatString); + return floatval($floatString); } + + /** + * Format currency using comma or period for thousands, and period or comma for decimal, based on settings. + * + * @author [B. Wetherington] [] + * @since [v5.2] + * @return Float + */ + public static function ParseCurrency($currencyString) { + $without_currency = str_replace(Setting::getSettings()->default_currency, '', $currencyString); //generally shouldn't come up, since we don't do this in fields, but just in case it does... + if(Setting::getSettings()->digit_separator=='1.234,56') { + //EU format + $without_thousands = str_replace('.', '', $without_currency); + $corrected_decimal = str_replace(',', '.', $without_thousands); + } else { + $without_thousands = str_replace(',', '', $without_currency); + $corrected_decimal = $without_thousands; // decimal is already OK + } + return floatval($corrected_decimal); + } /** * Get the list of status labels in an array to make a dropdown menu * * @author [A. Gianotto] [] * @since [v2.5] - * @return Array + * @return array */ public static function statusLabelList() { - $statuslabel_list = array('' => trans('general.select_statuslabel')) + Statuslabel::orderBy('default_label', 'desc')->orderBy('name','asc')->orderBy('deployable','desc') + $statuslabel_list = ['' => trans('general.select_statuslabel')] + Statuslabel::orderBy('default_label', 'desc')->orderBy('name', 'asc')->orderBy('deployable', 'desc') ->pluck('name', 'id')->toArray(); + return $statuslabel_list; } @@ -437,14 +474,15 @@ class Helper * * @author [A. Gianotto] [] * @since [v5.1.0] - * @return Array + * @return array */ public static function deployableStatusLabelList() { - $statuslabel_list = Statuslabel::where('deployable', '=', '1')->orderBy('default_label', 'desc') - ->orderBy('name','asc') - ->orderBy('deployable','desc') + $statuslabel_list = Statuslabel::where('deployable', '=', '1')->orderBy('default_label', 'desc') + ->orderBy('name', 'asc') + ->orderBy('deployable', 'desc') ->pluck('name', 'id')->toArray(); + return $statuslabel_list; } @@ -453,16 +491,17 @@ class Helper * * @author [A. Gianotto] [] * @since [v2.5] - * @return Array + * @return array */ public static function statusTypeList() { $statuslabel_types = - array('' => trans('admin/hardware/form.select_statustype')) - + array('deployable' => trans('admin/hardware/general.deployable')) - + array('pending' => trans('admin/hardware/general.pending')) - + array('undeployable' => trans('admin/hardware/general.undeployable')) - + array('archived' => trans('admin/hardware/general.archived')); + ['' => trans('admin/hardware/form.select_statustype')] + + ['deployable' => trans('admin/hardware/general.deployable')] + + ['pending' => trans('admin/hardware/general.pending')] + + ['undeployable' => trans('admin/hardware/general.undeployable')] + + ['archived' => trans('admin/hardware/general.archived')]; + return $statuslabel_types; } @@ -471,12 +510,13 @@ class Helper * * @author [A. Gianotto] [] * @since [v2.5] - * @return Array + * @return array */ public static function depreciationList() { $depreciation_list = ['' => 'Do Not Depreciate'] + Depreciation::orderBy('name', 'asc') ->pluck('name', 'id')->toArray(); + return $depreciation_list; } @@ -485,18 +525,19 @@ class Helper * * @author [A. Gianotto] [] * @since [v2.5] - * @return Array + * @return array */ public static function categoryTypeList() { - $category_types = array( + $category_types = [ '' => '', 'accessory' => 'Accessory', 'asset' => 'Asset', 'consumable' => 'Consumable', 'component' => 'Component', - 'license' => 'License' - ); + 'license' => 'License', + ]; + return $category_types; } @@ -505,11 +546,12 @@ class Helper * * @author [A. Gianotto] [] * @since [v2.5] - * @return Array + * @return array */ public static function customFieldsetList() { - $customfields = array('' => trans('admin/models/general.no_custom_field')) + CustomFieldset::pluck('name', 'id')->toArray(); + $customfields = ['' => trans('admin/models/general.no_custom_field')] + CustomFieldset::pluck('name', 'id')->toArray(); + return $customfields; } @@ -518,7 +560,7 @@ class Helper * * @author [A. Gianotto] [] * @since [v3.4] - * @return Array + * @return array */ public static function predefined_formats() { @@ -533,7 +575,7 @@ class Helper * * @author [A. Gianotto] [] * @since [v3.3] - * @return Array + * @return array */ public static function barcodeDimensions($barcode_type = 'QRCODE') { @@ -547,6 +589,7 @@ class Helper $size['height'] = '-3'; $size['width'] = '-3'; } + return $size; } @@ -555,7 +598,7 @@ class Helper * * @author [A. Gianotto] [] * @since [v3.0] - * @return Array + * @return array */ public static function generateRandomString($length = 10) { @@ -565,17 +608,17 @@ class Helper for ($i = 0; $i < $length; $i++) { $randomString .= $characters[rand(0, $charactersLength - 1)]; } + return $randomString; } - /** * This nasty little method gets the low inventory info for the * alert dropdown * * @author [A. Gianotto] [] * @since [v3.0] - * @return Array + * @return array */ public static function checkLowInventory() { @@ -584,7 +627,7 @@ class Helper $components = Component::withCount('assets as assets_count')->whereNotNull('min_amt')->get(); $avail_consumables = 0; - $items_array = array(); + $items_array = []; $all_count = 0; foreach ($consumables as $consumable) { @@ -601,17 +644,14 @@ class Helper $items_array[$all_count]['type'] = 'consumables'; $items_array[$all_count]['percent'] = $percent; $items_array[$all_count]['remaining'] = $avail; - $items_array[$all_count]['min_amt']=$consumable->min_amt; + $items_array[$all_count]['min_amt'] = $consumable->min_amt; $all_count++; } - - } foreach ($accessories as $accessory) { $avail = $accessory->qty - $accessory->users_count; if ($avail < ($accessory->min_amt) + \App\Models\Setting::getSettings()->alert_threshold) { - if ($accessory->qty > 0) { $percent = number_format((($avail / $accessory->qty) * 100), 0); } else { @@ -623,10 +663,9 @@ class Helper $items_array[$all_count]['type'] = 'accessories'; $items_array[$all_count]['percent'] = $percent; $items_array[$all_count]['remaining'] = $avail; - $items_array[$all_count]['min_amt']=$accessory->min_amt; + $items_array[$all_count]['min_amt'] = $accessory->min_amt; $all_count++; } - } foreach ($components as $component) { @@ -643,27 +682,21 @@ class Helper $items_array[$all_count]['type'] = 'components'; $items_array[$all_count]['percent'] = $percent; $items_array[$all_count]['remaining'] = $avail; - $items_array[$all_count]['min_amt']=$component->min_amt; + $items_array[$all_count]['min_amt'] = $component->min_amt; $all_count++; } - } - - return $items_array; - - } - /** * Check if the file is an image, so we can show a preview * * @author [A. Gianotto] [] * @since [v3.0] * @param File $file - * @return String | Boolean + * @return string | Boolean */ public static function checkUploadIsImage($file) { @@ -671,7 +704,7 @@ class Helper $filetype = @finfo_file($finfo, $file); finfo_close($finfo); - if (($filetype=="image/jpeg") || ($filetype=="image/jpg") || ($filetype=="image/png") || ($filetype=="image/bmp") || ($filetype=="image/gif")) { + if (($filetype == 'image/jpeg') || ($filetype == 'image/jpg') || ($filetype == 'image/png') || ($filetype == 'image/bmp') || ($filetype == 'image/gif')) { return $filetype; } @@ -693,21 +726,17 @@ class Helper * @param array $permissions * @param array $selected_arr * @since [v1.0] - * @return Array + * @return array */ - public static function selectedPermissionsArray($permissions, $selected_arr = array()) + public static function selectedPermissionsArray($permissions, $selected_arr = []) { - - - $permissions_arr = array(); + $permissions_arr = []; foreach ($permissions as $permission) { - for ($x = 0; $x < count($permission); $x++) { $permission_name = $permission[$x]['permission']; if ($permission[$x]['display'] === true) { - if ($selected_arr) { if (array_key_exists($permission_name, $selected_arr)) { $permissions_arr[$permission_name] = $selected_arr[$permission_name]; @@ -718,11 +747,7 @@ class Helper $permissions_arr[$permission_name] = '0'; } } - - } - - } return $permissions_arr; @@ -738,7 +763,7 @@ class Helper * * @author [A. Gianotto] [] * @since [v3.0] - * @return boolean + * @return bool */ public static function checkIfRequired($class, $field) { @@ -750,12 +775,10 @@ class Helper } else { return true; } - } } } - /** * Check to see if the given key exists in the array, and trim excess white space before returning it * @@ -769,9 +792,9 @@ class Helper public static function array_smart_fetch(array $array, $key, $default = '') { array_change_key_case($array, CASE_LOWER); - return array_key_exists(strtolower($key), array_change_key_case($array)) ? e(trim($array[ $key ])) : $default; - } + return array_key_exists(strtolower($key), array_change_key_case($array)) ? e(trim($array[$key])) : $default; + } /** * Gracefully handle decrypting encrypted fields (custom fields, etc). @@ -781,52 +804,47 @@ class Helper * @author A. Gianotto * @since 3.6 * @param CustomField $field - * @param String $string + * @param string $string * @return string */ public static function gracefulDecrypt(CustomField $field, $string) { - if ($field->isFieldDecryptable($string)) { - try { Crypt::decrypt($string); - return Crypt::decrypt($string); + return Crypt::decrypt($string); } catch (DecryptException $e) { return 'Error Decrypting: '.$e->getMessage(); } + } - } return $string; - } + public static function formatStandardApiResponse($status, $payload = null, $messages = null) - - - public static function formatStandardApiResponse($status, $payload = null, $messages = null) { - + { $array['status'] = $status; $array['messages'] = $messages; - if (($messages) && (is_array($messages)) && (count($messages) > 0)) { + if (($messages) && (is_array($messages)) && (count($messages) > 0)) { $array['messages'] = $messages; } ($payload) ? $array['payload'] = $payload : $array['payload'] = null; + return $array; } - /* Possible solution for unicode fieldnames */ - public static function make_slug($string) { + public static function make_slug($string) + { return preg_replace('/\s+/u', '_', trim($string)); } - - public static function getFormattedDateObject($date, $type = 'datetime', $array = true) { - - if ($date=='') { + public static function getFormattedDateObject($date, $type = 'datetime', $array = true) + { + if ($date == '') { return null; } @@ -835,7 +853,7 @@ class Helper if ($type == 'datetime') { $dt['datetime'] = $tmp_date->format('Y-m-d H:i:s'); - $dt['formatted'] = $tmp_date->format($settings->date_display_format .' '. $settings->time_display_format); + $dt['formatted'] = $tmp_date->format($settings->date_display_format.' '.$settings->time_display_format); } else { $dt['date'] = $tmp_date->format('Y-m-d'); $dt['formatted'] = $tmp_date->format($settings->date_display_format); @@ -844,28 +862,28 @@ class Helper if ($array == 'true') { return $dt; } + return $dt['formatted']; - } - // Nicked from Drupal :) // Returns a file size limit in bytes based on the PHP upload_max_filesize // and post_max_size - public static function file_upload_max_size() { + public static function file_upload_max_size() + { static $max_size = -1; if ($max_size < 0) { // Start with post_max_size. - $post_max_size = Helper::parse_size(ini_get('post_max_size')); + $post_max_size = self::parse_size(ini_get('post_max_size')); if ($post_max_size > 0) { $max_size = $post_max_size; } // If upload_max_size is less, then reduce. Except if upload_max_size is // zero, which indicates no limit. - $upload_max = Helper::parse_size(ini_get('upload_max_filesize')); + $upload_max = self::parse_size(ini_get('upload_max_filesize')); if ($upload_max > 0 && $upload_max < $max_size) { $max_size = $upload_max; } @@ -874,76 +892,79 @@ class Helper return $max_size; } - public static function file_upload_max_size_readable() { + public static function file_upload_max_size_readable() + { static $max_size = -1; if ($max_size < 0) { // Start with post_max_size. - $post_max_size = Helper::parse_size(ini_get('post_max_size')); + $post_max_size = self::parse_size(ini_get('post_max_size')); if ($post_max_size > 0) { $max_size = ini_get('post_max_size'); } // If upload_max_size is less, then reduce. Except if upload_max_size is // zero, which indicates no limit. - $upload_max = Helper::parse_size(ini_get('upload_max_filesize')); - if ($upload_max > 0 && $upload_max < $max_size) { + $upload_max = self::parse_size(ini_get('upload_max_filesize')); + + if ($upload_max > 0 && $upload_max < $post_max_size) { $max_size = ini_get('upload_max_filesize'); } } + return $max_size; } - public static function parse_size($size) { + public static function parse_size($size) + { $unit = preg_replace('/[^bkmgtpezy]/i', '', $size); // Remove the non-unit characters from the size. $size = preg_replace('/[^0-9\.]/', '', $size); // Remove the non-numeric characters from the size. if ($unit) { // Find the position of the unit in the ordered string which is the power of magnitude to multiply a kilobyte by. return round($size * pow(1024, stripos('bkmgtpezy', $unit[0]))); - } - else { + } else { return round($size); } } - - public static function filetype_icon($filename) { - - $extension = substr(strrchr($filename,'.'),1); + public static function filetype_icon($filename) + { + $extension = substr(strrchr($filename, '.'), 1); $allowedExtensionMap = [ // Images - 'jpg' => 'fa fa-file-image-o', - 'jpeg' => 'fa fa-file-image-o', - 'gif' => 'fa fa-file-image-o', - 'png' => 'fa fa-file-image-o', + 'jpg' => 'far fa-image', + 'jpeg' => 'far fa-image', + 'gif' => 'far fa-image', + 'png' => 'far fa-image', // word - 'doc' => 'fa fa-file-word-o', - 'docx' => 'fa fa-file-word-o', + 'doc' => 'far fa-file-word', + 'docx' => 'far fa-file-word', // Excel - 'xls' => 'fa fa-file-excel-o', - 'xlsx' => 'fa fa-file-excel-o', + 'xls' => 'far fa-file-excel', + 'xlsx' => 'far fa-file-excel', // archive - 'zip' => 'fa fa-file-archive-o', - 'rar' => 'fa fa-file-archive-o', + 'zip' => 'fas fa-file-archive', + 'rar' => 'fas fa-file-archive', //Text - 'txt' => 'fa fa-file-text-o', - 'rtf' => 'fa fa-file-text-o', - 'xml' => 'fa fa-file-text-o', + 'txt' => 'far fa-file-alt', + 'rtf' => 'far fa-file-alt', + 'xml' => 'far fa-file-alt', // Misc - 'pdf' => 'fa fa-file-pdf-o', - 'lic' => 'fa fa-file-floppy-o', + 'pdf' => 'far fa-file-pdf', + 'lic' => 'far fa-save', ]; if ($extension && array_key_exists($extension, $allowedExtensionMap)) { return $allowedExtensionMap[$extension]; } - return "fa fa-file-o"; + + return 'far fa-file'; } - public static function show_file_inline($filename) { - - $extension = substr(strrchr($filename,'.'),1); + public static function show_file_inline($filename) + { + $extension = substr(strrchr($filename, '.'), 1); if ($extension) { switch ($extension) { @@ -957,6 +978,7 @@ class Helper return false; } } + return false; } @@ -971,7 +993,7 @@ class Helper */ public static function generateEncyrptedPassword(): string { - return bcrypt(Helper::generateUnencryptedPassword()); + return bcrypt(self::generateUnencryptedPassword()); } /** @@ -988,9 +1010,10 @@ class Helper $chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $password = ''; - for ( $i = 0; $i < 20; $i++ ) { - $password .= substr( $chars, random_int( 0, strlen( $chars ) - 1 ), 1 ); + for ($i = 0; $i < 20; $i++) { + $password .= substr($chars, random_int(0, strlen($chars) - 1), 1); } + return $password; } @@ -1001,7 +1024,8 @@ class Helper * @param string $save_path path to a folder where the image should be saved * @return string path to uploaded image or false if something went wrong */ - public static function processUploadedImage(String $image_data, String $save_path) { + public static function processUploadedImage(String $image_data, String $save_path) + { if ($image_data == null || $save_path == null) { return false; } @@ -1010,15 +1034,15 @@ class Helper // data:image/jpeg;base64,; This causes the image library to be unhappy, so we need to remove it. $header = explode(';', $image_data, 2)[0]; // Grab the image type from the header while we're at it. - $extension = substr($header, strpos($header, '/')+1); + $extension = substr($header, strpos($header, '/') + 1); // Start reading the image after the first comma, postceding the base64. - $image = substr($image_data, strpos($image_data, ',')+1); + $image = substr($image_data, strpos($image_data, ',') + 1); - $file_name = str_random(25).".".$extension; + $file_name = str_random(25).'.'.$extension; - $directory= public_path($save_path); + $directory = public_path($save_path); // Check if the uploads directory exists. If not, try to create it. - if (!file_exists($directory)) { + if (! file_exists($directory)) { mkdir($directory, 0755, true); } @@ -1035,5 +1059,4 @@ class Helper return $file_name; } - } diff --git a/app/Helpers/StorageHelper.php b/app/Helpers/StorageHelper.php index c5e084fa68..94dfe62c76 100644 --- a/app/Helpers/StorageHelper.php +++ b/app/Helpers/StorageHelper.php @@ -1,15 +1,17 @@ download(Storage::disk($disk)->path($filename)); //works for PRIVATE or public?! @@ -20,4 +22,4 @@ class StorageHelper return Storage::disk($disk)->download($filename); } } -} \ No newline at end of file +} diff --git a/app/Http/Controllers/Accessories/AccessoriesController.php b/app/Http/Controllers/Accessories/AccessoriesController.php index a96859d928..108f624947 100755 --- a/app/Http/Controllers/Accessories/AccessoriesController.php +++ b/app/Http/Controllers/Accessories/AccessoriesController.php @@ -1,4 +1,5 @@ authorize('index', Accessory::class); + return view('accessories/index'); } - /** * Returns a view with a form to create a new Accessory. * @@ -45,11 +46,11 @@ class AccessoriesController extends Controller { $this->authorize('create', Accessory::class); $category_type = 'accessory'; + return view('accessories/edit')->with('category_type', $category_type) ->with('item', new Accessory); } - /** * Validate and save new Accessory from form post * @@ -74,18 +75,19 @@ class AccessoriesController extends Controller $accessory->manufacturer_id = request('manufacturer_id'); $accessory->model_number = request('model_number'); $accessory->purchase_date = request('purchase_date'); - $accessory->purchase_cost = Helper::ParseFloat(request('purchase_cost')); + $accessory->purchase_cost = Helper::ParseCurrency(request('purchase_cost')); $accessory->qty = request('qty'); $accessory->user_id = Auth::user()->id; $accessory->supplier_id = request('supplier_id'); $accessory = $request->handleImages($accessory); - + // Was the accessory created? if ($accessory->save()) { // Redirect to the new accessory page return redirect()->route('accessories.index')->with('success', trans('admin/accessories/message.create.success')); } + return redirect()->back()->withInput()->withErrors($accessory->getErrors()); } @@ -102,6 +104,7 @@ class AccessoriesController extends Controller if ($item = Accessory::find($accessoryId)) { $this->authorize($item); + return view('accessories/edit', compact('item'))->with('category_type', 'accessory'); } @@ -137,7 +140,7 @@ class AccessoriesController extends Controller $accessory->order_number = request('order_number'); $accessory->model_number = request('model_number'); $accessory->purchase_date = request('purchase_date'); - $accessory->purchase_cost = request('purchase_cost'); + $accessory->purchase_cost = Helper::ParseCurrency(request('purchase_cost')); $accessory->qty = request('qty'); $accessory->supplier_id = request('supplier_id'); @@ -147,6 +150,7 @@ class AccessoriesController extends Controller if ($accessory->save()) { return redirect()->route('accessories.index')->with('success', trans('admin/accessories/message.update.success')); } + return redirect()->back()->withInput()->withErrors($accessory->getErrors()); } @@ -168,11 +172,11 @@ class AccessoriesController extends Controller if ($accessory->hasUsers() > 0) { - return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.assoc_users', array('count'=> $accessory->hasUsers()))); + return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.assoc_users', ['count'=> $accessory->hasUsers()])); } if ($accessory->image) { - try { + try { Storage::disk('public')->delete('accessories'.'/'.$accessory->image); } catch (\Exception $e) { \Log::debug($e); @@ -180,6 +184,7 @@ class AccessoriesController extends Controller } $accessory->delete(); + return redirect()->route('accessories.index')->with('success', trans('admin/accessories/message.delete.success')); } @@ -202,6 +207,7 @@ class AccessoriesController extends Controller if (isset($accessory->id)) { return view('accessories/view', compact('accessory')); } + return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.does_not_exist', ['id' => $accessoryID])); } } diff --git a/app/Http/Controllers/Accessories/AccessoryCheckinController.php b/app/Http/Controllers/Accessories/AccessoryCheckinController.php index 1cfbaec1b4..3424c2aa13 100644 --- a/app/Http/Controllers/Accessories/AccessoryCheckinController.php +++ b/app/Http/Controllers/Accessories/AccessoryCheckinController.php @@ -17,7 +17,7 @@ class AccessoryCheckinController extends Controller * * @author [A. Gianotto] [] * @param Request $request - * @param integer $accessoryUserId + * @param int $accessoryUserId * @param string $backto * @return View * @internal param int $accessoryId @@ -33,6 +33,7 @@ class AccessoryCheckinController extends Controller $accessory = Accessory::find($accessory_user->accessory_id); $this->authorize('checkin', $accessory); + return view('accessories/checkin', compact('accessory'))->with('backto', $backto); } @@ -49,7 +50,7 @@ class AccessoryCheckinController extends Controller */ public function store(Request $request, $accessoryUserId = null, $backto = null) { - // Check if the accessory exists + // Check if the accessory exists if (is_null($accessory_user = DB::table('accessories_users')->find($accessoryUserId))) { // Redirect to the accessory management page with error return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.does_not_exist')); @@ -60,7 +61,7 @@ class AccessoryCheckinController extends Controller $this->authorize('checkin', $accessory); $checkin_at = date('Y-m-d'); - if($request->filled('checkin_at')){ + if ($request->filled('checkin_at')) { $checkin_at = $request->input('checkin_at'); } @@ -70,7 +71,7 @@ class AccessoryCheckinController extends Controller event(new CheckoutableCheckedIn($accessory, User::find($return_to), Auth::user(), $request->input('note'), $checkin_at)); - return redirect()->route("accessories.show", $accessory->id)->with('success', trans('admin/accessories/message.checkin.success')); + return redirect()->route('accessories.show', $accessory->id)->with('success', trans('admin/accessories/message.checkin.success')); } // Redirect to the accessory management page with error return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.checkin.error')); diff --git a/app/Http/Controllers/Accessories/AccessoryCheckoutController.php b/app/Http/Controllers/Accessories/AccessoryCheckoutController.php index 656a040a55..7eb9b39a46 100644 --- a/app/Http/Controllers/Accessories/AccessoryCheckoutController.php +++ b/app/Http/Controllers/Accessories/AccessoryCheckoutController.php @@ -14,7 +14,6 @@ use Illuminate\Support\Facades\Input; class AccessoryCheckoutController extends Controller { - /** * Return the form to checkout an Accessory to a user. * @@ -32,7 +31,6 @@ class AccessoryCheckoutController extends Controller } if ($accessory->category) { - $this->authorize('checkout', $accessory); // Get the dropdown of users and then pass it to the checkout view @@ -56,7 +54,7 @@ class AccessoryCheckoutController extends Controller */ public function store(Request $request, $accessoryId) { - // Check if the accessory exists + // Check if the accessory exists if (is_null($accessory = Accessory::find($accessoryId))) { // Redirect to the accessory management page with error return redirect()->route('accessories.index')->with('error', trans('admin/accessories/message.user_not_found')); @@ -64,11 +62,11 @@ class AccessoryCheckoutController extends Controller $this->authorize('checkout', $accessory); - if (!$user = User::find($request->input('assigned_to'))) { + if (! $user = User::find($request->input('assigned_to'))) { return redirect()->route('checkout/accessory', $accessory->id)->with('error', trans('admin/accessories/message.checkout.user_does_not_exist')); } - // Update the accessory data + // Update the accessory data $accessory->assigned_to = e($request->input('assigned_to')); $accessory->users()->attach($accessory->id, [ @@ -76,14 +74,14 @@ class AccessoryCheckoutController extends Controller 'created_at' => Carbon::now(), 'user_id' => Auth::id(), 'assigned_to' => $request->get('assigned_to'), - 'note' => $request->input('note') + 'note' => $request->input('note'), ]); DB::table('accessories_users')->where('assigned_to', '=', $accessory->assigned_to)->where('accessory_id', '=', $accessory->id)->first(); event(new CheckoutableCheckedOut($accessory, $user, Auth::user(), $request->input('note'))); - // Redirect to the new accessory page + // Redirect to the new accessory page return redirect()->route('accessories.index')->with('success', trans('admin/accessories/message.checkout.success')); } } diff --git a/app/Http/Controllers/Account/AcceptanceController.php b/app/Http/Controllers/Account/AcceptanceController.php index 6502196b25..b25a8df45b 100644 --- a/app/Http/Controllers/Account/AcceptanceController.php +++ b/app/Http/Controllers/Account/AcceptanceController.php @@ -1,4 +1,5 @@ -pending()->get(); return view('account/accept.index', compact('acceptances')); @@ -29,12 +31,12 @@ class AcceptanceController extends Controller { /** * Shows a form to either accept or decline the checkout acceptance - * + * * @param int $id * @return mixed */ - public function create($id) { - + public function create($id) + { $acceptance = CheckoutAcceptance::find($id); if (is_null($acceptance)) { @@ -43,28 +45,28 @@ class AcceptanceController extends Controller { if (! $acceptance->isPending()) { return redirect()->route('account.accept')->with('error', trans('admin/users/message.error.asset_already_accepted')); - } + } if (! $acceptance->isCheckedOutTo(Auth::user())) { return redirect()->route('account.accept')->with('error', trans('admin/users/message.error.incorrect_user_accepted')); } - if (!Company::isCurrentUserHasAccess($acceptance->checkoutable)) { + if (! Company::isCurrentUserHasAccess($acceptance->checkoutable)) { return redirect()->route('account.accept')->with('error', trans('general.insufficient_permissions')); - } + } return view('account/accept.create', compact('acceptance')); - } + } /** * Stores the accept/decline of the checkout acceptance - * + * * @param Request $request * @param int $id * @return Redirect */ - public function store(Request $request, $id) { - + public function store(Request $request, $id) + { $acceptance = CheckoutAcceptance::find($id); if (is_null($acceptance)) { @@ -73,55 +75,50 @@ class AcceptanceController extends Controller { if (! $acceptance->isPending()) { return redirect()->route('account.accept')->with('error', trans('admin/users/message.error.asset_already_accepted')); - } + } if (! $acceptance->isCheckedOutTo(Auth::user())) { return redirect()->route('account.accept')->with('error', trans('admin/users/message.error.incorrect_user_accepted')); } - if (!Company::isCurrentUserHasAccess($acceptance->checkoutable)) { + if (! Company::isCurrentUserHasAccess($acceptance->checkoutable)) { return redirect()->route('account.accept')->with('error', trans('general.insufficient_permissions')); - } + } - if (!$request->filled('asset_acceptance')) { + if (! $request->filled('asset_acceptance')) { return redirect()->back()->with('error', trans('admin/users/message.error.accept_or_decline')); } /** * Get the signature and save it */ - - if (!Storage::exists('private_uploads/signatures')) Storage::makeDirectory('private_uploads/signatures', 775); - + if (! Storage::exists('private_uploads/signatures')) { + Storage::makeDirectory('private_uploads/signatures', 775); + } $sig_filename = ''; if ($request->filled('signature_output')) { - $sig_filename = "siglog-" .Str::uuid() . '-'.date('Y-m-d-his').".png"; + $sig_filename = 'siglog-'.Str::uuid().'-'.date('Y-m-d-his').'.png'; $data_uri = e($request->input('signature_output')); - $encoded_image = explode(",", $data_uri); + $encoded_image = explode(',', $data_uri); $decoded_image = base64_decode($encoded_image[1]); - Storage::put('private_uploads/signatures/'.$sig_filename, (string)$decoded_image); + Storage::put('private_uploads/signatures/'.$sig_filename, (string) $decoded_image); } - if ($request->input('asset_acceptance') == 'accepted') { - $acceptance->accept($sig_filename); event(new CheckoutAccepted($acceptance)); $return_msg = trans('admin/users/message.accepted'); - } else { - - $acceptance->decline($sig_filename); + $acceptance->decline($sig_filename); event(new CheckoutDeclined($acceptance)); $return_msg = trans('admin/users/message.declined'); - } return redirect()->to('account/accept')->with('success', $return_msg); - } + } } diff --git a/app/Http/Controllers/ActionlogController.php b/app/Http/Controllers/ActionlogController.php index f0d4faad2f..31ac13dab5 100644 --- a/app/Http/Controllers/ActionlogController.php +++ b/app/Http/Controllers/ActionlogController.php @@ -10,9 +10,10 @@ class ActionlogController extends Controller public function displaySig($filename) { $this->authorize('view', \App\Models\Asset::class); - $file = config('app.private_uploads') . '/signatures/' . $filename; + $file = config('app.private_uploads').'/signatures/'.$filename; $filetype = Helper::checkUploadIsImage($file); $contents = file_get_contents($file); + return Response::make($contents)->header('Content-Type', $filetype); } } diff --git a/app/Http/Controllers/Api/AccessoriesController.php b/app/Http/Controllers/Api/AccessoriesController.php index edbf90d15c..4ff90b837b 100644 --- a/app/Http/Controllers/Api/AccessoriesController.php +++ b/app/Http/Controllers/Api/AccessoriesController.php @@ -9,10 +9,11 @@ use App\Http\Transformers\SelectlistTransformer; use App\Models\Accessory; use App\Models\Company; use App\Models\User; -use Carbon\Carbon; use Auth; +use Carbon\Carbon; use DB; use Illuminate\Http\Request; +use App\Http\Requests\ImageUploadRequest; class AccessoriesController extends Controller { @@ -26,28 +27,47 @@ class AccessoriesController extends Controller public function index(Request $request) { $this->authorize('view', Accessory::class); - $allowed_columns = ['id','name','model_number','eol','notes','created_at','min_amt','company_id']; + $allowed_columns = ['id', 'name', 'model_number', 'eol', 'notes', 'created_at', 'min_amt', 'company_id']; + + // This array is what determines which fields should be allowed to be sorted on ON the table itself, no relations + // Relations will be handled in query scopes a little further down. + $allowed_columns = + [ + 'id', + 'name', + 'model_number', + 'eol', + 'notes', + 'created_at', + 'min_amt', + 'company_id' + ]; - $accessories = Accessory::with('category', 'company', 'manufacturer', 'users', 'location'); + + $accessories = Accessory::select('accessories.*')->with('category', 'company', 'manufacturer', 'users', 'location', 'supplier'); if ($request->filled('search')) { $accessories = $accessories->TextSearch($request->input('search')); } if ($request->filled('company_id')) { - $accessories->where('company_id','=',$request->input('company_id')); + $accessories->where('company_id', '=', $request->input('company_id')); } if ($request->filled('category_id')) { - $accessories->where('category_id','=',$request->input('category_id')); + $accessories->where('category_id', '=', $request->input('category_id')); } if ($request->filled('manufacturer_id')) { - $accessories->where('manufacturer_id','=',$request->input('manufacturer_id')); + $accessories->where('manufacturer_id', '=', $request->input('manufacturer_id')); } if ($request->filled('supplier_id')) { - $accessories->where('supplier_id','=',$request->input('supplier_id')); + $accessories->where('supplier_id', '=', $request->input('supplier_id')); + } + + if ($request->filled('location_id')) { + $accessories->where('location_id','=',$request->input('location_id')); } // Set the offset to the API call's offset, unless the offset is higher than the actual count of items in which @@ -57,26 +77,34 @@ class AccessoriesController extends Controller // Check to make sure the limit is not higher than the max allowed ((config('app.max_results') >= $request->input('limit')) && ($request->filled('limit'))) ? $limit = $request->input('limit') : $limit = config('app.max_results'); - $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; - $sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at'; + $sort_override = $request->input('sort'); + $column_sort = in_array($sort_override, $allowed_columns) ? $sort_override : 'created_at'; - switch ($sort) { + switch ($sort_override) { case 'category': $accessories = $accessories->OrderCategory($order); break; case 'company': $accessories = $accessories->OrderCompany($order); break; + case 'location': + $accessories = $accessories->OrderLocation($order); + break; + case 'manufacturer': + $accessories = $accessories->OrderManufacturer($order); + break; + case 'supplier': + $accessories = $accessories->OrderSupplier($order); + break; default: - $accessories = $accessories->orderBy($sort, $order); + $accessories = $accessories->orderBy($column_sort, $order); break; } - - $accessories->orderBy($sort, $order); - + $total = $accessories->count(); $accessories = $accessories->skip($offset)->take($limit)->get(); + return (new AccessoriesTransformer)->transformAccessories($accessories, $total); } @@ -86,18 +114,20 @@ class AccessoriesController extends Controller * * @author [A. Gianotto] [] * @since [v4.0] - * @param \Illuminate\Http\Request $request + * @param \App\Http\Requests\ImageUploadRequest $request * @return \Illuminate\Http\Response */ - public function store(Request $request) + public function store(ImageUploadRequest $request) { $this->authorize('create', Accessory::class); $accessory = new Accessory; $accessory->fill($request->all()); + $accessory = $request->handleImages($accessory); if ($accessory->save()) { return response()->json(Helper::formatStandardApiResponse('success', $accessory, trans('admin/accessories/message.create.success'))); } + return response()->json(Helper::formatStandardApiResponse('error', null, $accessory->getErrors())); } @@ -114,6 +144,7 @@ class AccessoriesController extends Controller { $this->authorize('view', Accessory::class); $accessory = Accessory::findOrFail($id); + return (new AccessoriesTransformer)->transformAccessory($accessory); } @@ -130,6 +161,7 @@ class AccessoriesController extends Controller { $this->authorize('view', Accessory::class); $accessory = Accessory::findOrFail($id); + return (new AccessoriesTransformer)->transformAccessory($accessory); } @@ -147,7 +179,7 @@ class AccessoriesController extends Controller $this->authorize('view', Accessory::class); $accessory = Accessory::with('lastCheckout')->findOrFail($id); - if (!Company::isCurrentUserHasAccess($accessory)) { + if (! Company::isCurrentUserHasAccess($accessory)) { return ['total' => 0, 'rows' => []]; } @@ -157,7 +189,7 @@ class AccessoriesController extends Controller $accessory_users = $accessory->users; $total = $accessory_users->count(); - if($total < $offset){ + if ($total < $offset) { $offset = 0; } @@ -165,9 +197,13 @@ class AccessoriesController extends Controller if ($request->filled('search')) { $accessory_users = $accessory->users() - ->where('first_name', 'like', '%'.$request->input('search').'%') - ->orWhere('last_name', 'like', '%'.$request->input('search').'%') - ->get(); + ->where(function ($query) use ($request) { + $search_str = '%' . $request->input('search') . '%'; + $query->where('first_name', 'like', $search_str) + ->orWhere('last_name', 'like', $search_str) + ->orWhere('note', 'like', $search_str); + }) + ->get(); $total = $accessory_users->count(); } @@ -180,15 +216,16 @@ class AccessoriesController extends Controller * * @author [A. Gianotto] [] * @since [v4.0] - * @param \Illuminate\Http\Request $request + * @param \App\Http\Requests\ImageUploadRequest $request * @param int $id * @return \Illuminate\Http\Response */ - public function update(Request $request, $id) + public function update(ImageUploadRequest $request, $id) { $this->authorize('update', Accessory::class); $accessory = Accessory::findOrFail($id); $accessory->fill($request->all()); + $accessory = $request->handleImages($accessory); if ($accessory->save()) { return response()->json(Helper::formatStandardApiResponse('success', $accessory, trans('admin/accessories/message.update.success'))); @@ -212,12 +249,12 @@ class AccessoriesController extends Controller $this->authorize($accessory); if ($accessory->hasUsers() > 0) { - return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/accessories/message.assoc_users', array('count'=> $accessory->hasUsers())))); + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/accessories/message.assoc_users', ['count'=> $accessory->hasUsers()]))); } $accessory->delete(); - return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/accessories/message.delete.success'))); + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/accessories/message.delete.success'))); } @@ -243,7 +280,7 @@ class AccessoriesController extends Controller if ($accessory->numRemaining() > 0) { - if (!$user = User::find($request->input('assigned_to'))) { + if (! $user = User::find($request->input('assigned_to'))) { return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/accessories/message.checkout.user_does_not_exist'))); } @@ -255,12 +292,12 @@ class AccessoriesController extends Controller 'created_at' => Carbon::now(), 'user_id' => Auth::id(), 'assigned_to' => $request->get('assigned_to'), - 'note' => $request->get('note') + 'note' => $request->get('note'), ]); $accessory->logCheckout($request->input('note'), $user); - return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/accessories/message.checkout.success'))); + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/accessories/message.checkout.success'))); } return response()->json(Helper::formatStandardApiResponse('error', null, 'No accessories remaining')); @@ -273,7 +310,7 @@ class AccessoriesController extends Controller * @uses Accessory::checkin_email() to determine if an email can and should be sent * @author [A. Gianotto] [] * @param Request $request - * @param integer $accessoryUserId + * @param int $accessoryUserId * @param string $backto * @return Redirect * @internal param int $accessoryId @@ -291,7 +328,7 @@ class AccessoriesController extends Controller // Was the accessory updated? if (DB::table('accessories_users')->where('id', '=', $accessory_user->id)->delete()) { - if (!is_null($accessory_user->assigned_to)) { + if (! is_null($accessory_user->assigned_to)) { $user = User::find($accessory_user->assigned_to); } @@ -306,7 +343,7 @@ class AccessoriesController extends Controller return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/accessories/message.checkin.success'))); } - return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/accessories/message.checkin.error'))); + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/accessories/message.checkin.error'))); } @@ -322,7 +359,7 @@ class AccessoriesController extends Controller $accessories = Accessory::select([ 'accessories.id', - 'accessories.name' + 'accessories.name', ]); if ($request->filled('search')) { @@ -331,10 +368,7 @@ class AccessoriesController extends Controller $accessories = $accessories->orderBy('name', 'ASC')->paginate(50); - return (new SelectlistTransformer)->transformSelectlist($accessories); } - - } diff --git a/app/Http/Controllers/Api/AssetMaintenancesController.php b/app/Http/Controllers/Api/AssetMaintenancesController.php index 519c7c0737..6dcc009fcf 100644 --- a/app/Http/Controllers/Api/AssetMaintenancesController.php +++ b/app/Http/Controllers/Api/AssetMaintenancesController.php @@ -1,4 +1,5 @@ * @version v1.0 * @since [v1.8] - * @return String JSON + * @return string JSON */ public function index(Request $request) { - $maintenances = AssetMaintenance::with('asset', 'asset.model','asset.location', 'supplier', 'asset.company', 'admin'); + $maintenances = AssetMaintenance::with('asset', 'asset.model', 'asset.location', 'supplier', 'asset.company', 'admin'); if ($request->filled('search')) { $maintenances = $maintenances->TextSearch($request->input('search')); @@ -50,7 +51,6 @@ class AssetMaintenancesController extends Controller // Check to make sure the limit is not higher than the max allowed ((config('app.max_results') >= $request->input('limit')) && ($request->filled('limit'))) ? $limit = $request->input('limit') : $limit = config('app.max_results'); - $allowed_columns = [ 'id', 'title', @@ -62,7 +62,7 @@ class AssetMaintenancesController extends Controller 'notes', 'asset_tag', 'asset_name', - 'user_id' + 'user_id', ]; $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; $sort = in_array($request->input('sort'), $allowed_columns) ? e($request->input('sort')) : 'created_at'; @@ -97,7 +97,7 @@ class AssetMaintenancesController extends Controller * @author Vincent Sposato * @version v1.0 * @since [v1.8] - * @return String JSON + * @return string JSON */ public function store(Request $request) { @@ -105,28 +105,28 @@ class AssetMaintenancesController extends Controller $assetMaintenance = new AssetMaintenance(); $assetMaintenance->supplier_id = $request->input('supplier_id'); $assetMaintenance->is_warranty = $request->input('is_warranty'); - $assetMaintenance->cost = e($request->input('cost')); + $assetMaintenance->cost = Helper::ParseCurrency($request->input('cost')); $assetMaintenance->notes = e($request->input('notes')); $asset = Asset::find(e($request->input('asset_id'))); - if (!Company::isCurrentUserHasAccess($asset)) { + if (! Company::isCurrentUserHasAccess($asset)) { return response()->json(Helper::formatStandardApiResponse('error', null, 'You cannot add a maintenance for that asset')); } // Save the asset maintenance data - $assetMaintenance->asset_id = $request->input('asset_id'); + $assetMaintenance->asset_id = $request->input('asset_id'); $assetMaintenance->asset_maintenance_type = $request->input('asset_maintenance_type'); - $assetMaintenance->title = $request->input('title'); - $assetMaintenance->start_date = $request->input('start_date'); - $assetMaintenance->completion_date = $request->input('completion_date'); - $assetMaintenance->user_id = Auth::id(); + $assetMaintenance->title = $request->input('title'); + $assetMaintenance->start_date = $request->input('start_date'); + $assetMaintenance->completion_date = $request->input('completion_date'); + $assetMaintenance->user_id = Auth::id(); - if (( $assetMaintenance->completion_date !== null ) - && ( $assetMaintenance->start_date !== "" ) - && ( $assetMaintenance->start_date !== "0000-00-00" ) + if (($assetMaintenance->completion_date !== null) + && ($assetMaintenance->start_date !== '') + && ($assetMaintenance->start_date !== '0000-00-00') ) { - $startDate = Carbon::parse($assetMaintenance->start_date); - $completionDate = Carbon::parse($assetMaintenance->completion_date); + $startDate = Carbon::parse($assetMaintenance->start_date); + $completionDate = Carbon::parse($assetMaintenance->completion_date); $assetMaintenance->asset_maintenance_time = $completionDate->diffInDays($startDate); } @@ -140,7 +140,6 @@ class AssetMaintenancesController extends Controller } - /** * Validates and stores an update to an asset maintenance * @@ -149,59 +148,59 @@ class AssetMaintenancesController extends Controller * @param int $request * @version v1.0 * @since [v4.0] - * @return String JSON + * @return string JSON */ public function update(Request $request, $assetMaintenanceId = null) { // Check if the asset maintenance exists $assetMaintenance = AssetMaintenance::findOrFail($assetMaintenanceId); - if (!Company::isCurrentUserHasAccess($assetMaintenance->asset)) { + if (! Company::isCurrentUserHasAccess($assetMaintenance->asset)) { return response()->json(Helper::formatStandardApiResponse('error', null, 'You cannot edit a maintenance for that asset')); } $assetMaintenance->supplier_id = e($request->input('supplier_id')); $assetMaintenance->is_warranty = e($request->input('is_warranty')); - $assetMaintenance->cost = Helper::ParseFloat(e($request->input('cost'))); + $assetMaintenance->cost = Helper::ParseCurrency($request->input('cost')); $assetMaintenance->notes = e($request->input('notes')); $asset = Asset::find(request('asset_id')); - if (!Company::isCurrentUserHasAccess($asset)) { + if (! Company::isCurrentUserHasAccess($asset)) { return response()->json(Helper::formatStandardApiResponse('error', null, 'You cannot edit a maintenance for that asset')); } // Save the asset maintenance data - $assetMaintenance->asset_id = $request->input('asset_id'); + $assetMaintenance->asset_id = $request->input('asset_id'); $assetMaintenance->asset_maintenance_type = $request->input('asset_maintenance_type'); - $assetMaintenance->title = $request->input('title'); - $assetMaintenance->start_date = $request->input('start_date'); - $assetMaintenance->completion_date = $request->input('completion_date'); + $assetMaintenance->title = $request->input('title'); + $assetMaintenance->start_date = $request->input('start_date'); + $assetMaintenance->completion_date = $request->input('completion_date'); - if (( $assetMaintenance->completion_date == null ) + if (($assetMaintenance->completion_date == null) ) { - if (( $assetMaintenance->asset_maintenance_time !== 0 ) - || ( !is_null($assetMaintenance->asset_maintenance_time) ) + if (($assetMaintenance->asset_maintenance_time !== 0) + || (! is_null($assetMaintenance->asset_maintenance_time)) ) { $assetMaintenance->asset_maintenance_time = null; } } - if (( $assetMaintenance->completion_date !== null ) - && ( $assetMaintenance->start_date !== "" ) - && ( $assetMaintenance->start_date !== "0000-00-00" ) + if (($assetMaintenance->completion_date !== null) + && ($assetMaintenance->start_date !== '') + && ($assetMaintenance->start_date !== '0000-00-00') ) { - $startDate = Carbon::parse($assetMaintenance->start_date); - $completionDate = Carbon::parse($assetMaintenance->completion_date); + $startDate = Carbon::parse($assetMaintenance->start_date); + $completionDate = Carbon::parse($assetMaintenance->completion_date); $assetMaintenance->asset_maintenance_time = $completionDate->diffInDays($startDate); } // Was the asset maintenance created? if ($assetMaintenance->save()) { - return response()->json(Helper::formatStandardApiResponse('success', $assetMaintenance, trans('admin/asset_maintenances/message.edit.success'))); } + return response()->json(Helper::formatStandardApiResponse('error', null, $assetMaintenance->getErrors())); } @@ -212,14 +211,14 @@ class AssetMaintenancesController extends Controller * @param int $assetMaintenanceId * @version v1.0 * @since [v4.0] - * @return String JSON + * @return string JSON */ public function destroy($assetMaintenanceId) { // Check if the asset maintenance exists $assetMaintenance = AssetMaintenance::findOrFail($assetMaintenanceId); - if (!Company::isCurrentUserHasAccess($assetMaintenance->asset)) { + if (! Company::isCurrentUserHasAccess($assetMaintenance->asset)) { return response()->json(Helper::formatStandardApiResponse('error', null, 'You cannot delete a maintenance for that asset')); } @@ -237,14 +236,15 @@ class AssetMaintenancesController extends Controller * @param int $assetMaintenanceId * @version v1.0 * @since [v4.0] - * @return String JSON + * @return string JSON */ public function show($assetMaintenanceId) { $assetMaintenance = AssetMaintenance::findOrFail($assetMaintenanceId); - if (!Company::isCurrentUserHasAccess($assetMaintenance->asset)) { + if (! Company::isCurrentUserHasAccess($assetMaintenance->asset)) { return response()->json(Helper::formatStandardApiResponse('error', null, 'You cannot view a maintenance for that asset')); } + return (new AssetMaintenancesTransformer())->transformAssetMaintenance($assetMaintenance); } diff --git a/app/Http/Controllers/Api/AssetModelsController.php b/app/Http/Controllers/Api/AssetModelsController.php index abc1f65a5a..e4385032d0 100644 --- a/app/Http/Controllers/Api/AssetModelsController.php +++ b/app/Http/Controllers/Api/AssetModelsController.php @@ -1,4 +1,5 @@ with('category','depreciation', 'manufacturer','fieldset') + ->with('category', 'depreciation', 'manufacturer', 'fieldset') ->withCount('assets as assets_count'); - - - if ($request->filled('status')) { + if ($request->input('status')=='deleted') { $assetmodels->onlyTrashed(); } @@ -98,6 +98,7 @@ class AssetModelsController extends Controller $total = $assetmodels->count(); $assetmodels = $assetmodels->skip($offset)->take($limit)->get(); + return (new AssetModelsTransformer)->transformAssetModels($assetmodels, $total); } @@ -107,20 +108,22 @@ class AssetModelsController extends Controller * * @author [A. Gianotto] [] * @since [v4.0] - * @param \Illuminate\Http\Request $request + * @param \App\Http\Requests\ImageUploadRequest $request * @return \Illuminate\Http\Response */ - public function store(Request $request) + public function store(ImageUploadRequest $request) { $this->authorize('create', AssetModel::class); $assetmodel = new AssetModel; $assetmodel->fill($request->all()); + $assetmodel = $request->handleImages($assetmodel); if ($assetmodel->save()) { return response()->json(Helper::formatStandardApiResponse('success', $assetmodel, trans('admin/models/message.create.success'))); } return response()->json(Helper::formatStandardApiResponse('error', null, $assetmodel->getErrors())); + } /** @@ -135,6 +138,7 @@ class AssetModelsController extends Controller { $this->authorize('view', AssetModel::class); $assetmodel = AssetModel::withCount('assets as assets_count')->findOrFail($id); + return (new AssetModelsTransformer)->transformAssetModel($assetmodel); } @@ -149,7 +153,8 @@ class AssetModelsController extends Controller public function assets($id) { $this->authorize('view', AssetModel::class); - $assets = Asset::where('model_id','=',$id)->get(); + $assets = Asset::where('model_id', '=', $id)->get(); + return (new AssetsTransformer)->transformAssets($assets, $assets->count()); } @@ -159,16 +164,17 @@ class AssetModelsController extends Controller * * @author [A. Gianotto] [] * @since [v4.0] - * @param \Illuminate\Http\Request $request + * @param \App\Http\Requests\ImageUploadRequest $request * @param int $id * @return \Illuminate\Http\Response */ - public function update(Request $request, $id) + public function update(ImageUploadRequest $request, $id) { $this->authorize('update', AssetModel::class); $assetmodel = AssetModel::findOrFail($id); $assetmodel->fill($request->all()); - + $assetmodel = $request->handleImages($assetmodel); + /** * Allow custom_fieldset_id to override and populate fieldset_id. * This is stupid, but required for legacy API support. @@ -178,7 +184,7 @@ class AssetModelsController extends Controller * it, but I'll be damned if I can think of one. - snipe */ if ($request->filled('custom_fieldset_id')) { - $assetmodel->fieldset_id = $request->get("custom_fieldset_id"); + $assetmodel->fieldset_id = $request->get('custom_fieldset_id'); } @@ -204,11 +210,11 @@ class AssetModelsController extends Controller $this->authorize('delete', $assetmodel); if ($assetmodel->assets()->count() > 0) { - return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/models/message.assoc_users'))); + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/models/message.assoc_users'))); } if ($assetmodel->image) { - try { + try { Storage::disk('public')->delete('assetmodels/'.$assetmodel->image); } catch (\Exception $e) { \Log::info($e); @@ -216,8 +222,8 @@ class AssetModelsController extends Controller } $assetmodel->delete(); - return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/models/message.delete.success'))); + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/models/message.delete.success'))); } /** @@ -226,11 +232,9 @@ class AssetModelsController extends Controller * @author [A. Gianotto] [] * @since [v4.0.16] * @see \App\Http\Transformers\SelectlistTransformer - * */ public function selectlist(Request $request) { - $assetmodels = AssetModel::select([ 'models.id', 'models.name', @@ -238,7 +242,7 @@ class AssetModelsController extends Controller 'models.model_number', 'models.manufacturer_id', 'models.category_id', - ])->with('manufacturer','category'); + ])->with('manufacturer', 'category'); $settings = \App\Models\Setting::getSettings(); @@ -249,7 +253,6 @@ class AssetModelsController extends Controller $assetmodels = $assetmodels->OrderCategory('ASC')->OrderManufacturer('ASC')->orderby('models.name', 'asc')->orderby('models.model_number', 'asc')->paginate(50); foreach ($assetmodels as $assetmodel) { - $assetmodel->use_text = ''; if ($settings->modellistCheckedValue('category')) { @@ -260,10 +263,10 @@ class AssetModelsController extends Controller $assetmodel->use_text .= (($assetmodel->manufacturer) ? $assetmodel->manufacturer->name.' ' : ''); } - $assetmodel->use_text .= $assetmodel->name; + $assetmodel->use_text .= $assetmodel->name; - if (($settings->modellistCheckedValue('model_number')) && ($assetmodel->model_number!='')) { - $assetmodel->use_text .= ' (#'.$assetmodel->model_number.')'; + if (($settings->modellistCheckedValue('model_number')) && ($assetmodel->model_number != '')) { + $assetmodel->use_text .= ' (#'.$assetmodel->model_number.')'; } $assetmodel->use_image = ($settings->modellistCheckedValue('image') && ($assetmodel->image)) ? Storage::disk('public')->url('models/'.e($assetmodel->image)) : null; @@ -271,5 +274,4 @@ class AssetModelsController extends Controller return (new SelectlistTransformer)->transformSelectlist($assetmodels); } - } diff --git a/app/Http/Controllers/Api/AssetsController.php b/app/Http/Controllers/Api/AssetsController.php index 8ac4307a55..6e56b317d2 100644 --- a/app/Http/Controllers/Api/AssetsController.php +++ b/app/Http/Controllers/Api/AssetsController.php @@ -1,13 +1,17 @@ authorize('index', Asset::class); + \Log::debug(Route::currentRouteName()); + + + /** + * This looks MAD janky (and it is), but the AssetsController@index does a LOT of heavy lifting throughout the + * app. This bit here just makes sure that someone without permission to view assets doesn't + * end up with priv escalations because they asked for a different endpoint. + * + * Since we never gave the specification for which transformer to use before, it should default + * gracefully to just use the AssetTransformer by default, which shouldn't break anything. + * + * It was either this mess, or repeating ALL of the searching and sorting and filtering code, + * which would have been far worse of a mess. *sad face* - snipe (Sept 1, 2021) + */ + if (Route::currentRouteName()=='api.depreciation-report.index') { + $transformer = 'App\Http\Transformers\DepreciationReportTransformer'; + $this->authorize('reports.view'); + } else { + $transformer = 'App\Http\Transformers\AssetsTransformer'; + $this->authorize('index', Asset::class); + } + + $settings = Setting::getSettings(); $allowed_columns = [ @@ -76,7 +102,7 @@ class AssetsController extends Controller 'requests_counter', ]; - $filter = array(); + $filter = []; if ($request->filled('filter')) { $filter = json_decode($request->input('filter'), true); @@ -84,13 +110,12 @@ class AssetsController extends Controller $all_custom_fields = CustomField::all(); //used as a 'cache' of custom fields throughout this page load foreach ($all_custom_fields as $field) { - $allowed_columns[]=$field->db_column_name(); + $allowed_columns[] = $field->db_column_name(); } - $assets = Company::scopeCompanyables(Asset::select('assets.*'),"company_id","assets") + $assets = Company::scopeCompanyables(Asset::select('assets.*'), 'company_id', 'assets') ->with('location', 'assetstatus', 'assetlog', 'company', 'defaultLoc','assignedTo', - 'model.category', 'model.manufacturer', 'model.fieldset','supplier'); - + 'model.category', 'model.manufacturer', 'model.fieldset', 'supplier'); // These are used by the API to query against specific ID numbers. // They are also used by the individual searches on detail pages like @@ -99,7 +124,7 @@ class AssetsController extends Controller $assets->where('assets.status_id', '=', $request->input('status_id')); } - if ($request->input('requestable')=='true') { + if ($request->input('requestable') == 'true') { $assets->where('assets.requestable', '=', '1'); } @@ -146,7 +171,6 @@ class AssetsController extends Controller // case we override with the actual count, so we should return 0 items. $offset = (($assets) && ($request->get('offset') > $assets->count())) ? $assets->count() : $request->get('offset', 0); - // Check to make sure the limit is not higher than the max allowed ((config('app.max_results') >= $request->input('limit')) && ($request->filled('limit'))) ? $limit = $request->input('limit') : $limit = config('app.max_results'); @@ -154,7 +178,6 @@ class AssetsController extends Controller // This is used by the audit reporting routes if (Gate::allows('audit', Asset::class)) { - switch ($audit) { case 'due': $assets->DueOrOverdueForAudit($settings); @@ -177,19 +200,19 @@ class AssetsController extends Controller $assets->onlyTrashed(); break; case 'Pending': - $assets->join('status_labels AS status_alias',function ($join) { - $join->on('status_alias.id', "=", "assets.status_id") - ->where('status_alias.deployable','=',0) - ->where('status_alias.pending','=',1) + $assets->join('status_labels AS status_alias', function ($join) { + $join->on('status_alias.id', '=', 'assets.status_id') + ->where('status_alias.deployable', '=', 0) + ->where('status_alias.pending', '=', 1) ->where('status_alias.archived', '=', 0); }); break; case 'RTD': $assets->whereNull('assets.assigned_to') - ->join('status_labels AS status_alias',function ($join) { - $join->on('status_alias.id', "=", "assets.status_id") - ->where('status_alias.deployable','=',1) - ->where('status_alias.pending','=',0) + ->join('status_labels AS status_alias', function ($join) { + $join->on('status_alias.id', '=', 'assets.status_id') + ->where('status_alias.deployable', '=', 1) + ->where('status_alias.pending', '=', 0) ->where('status_alias.archived', '=', 0); }); break; @@ -197,19 +220,19 @@ class AssetsController extends Controller $assets->Undeployable(); break; case 'Archived': - $assets->join('status_labels AS status_alias',function ($join) { - $join->on('status_alias.id', "=", "assets.status_id") - ->where('status_alias.deployable','=',0) - ->where('status_alias.pending','=',0) + $assets->join('status_labels AS status_alias', function ($join) { + $join->on('status_alias.id', '=', 'assets.status_id') + ->where('status_alias.deployable', '=', 0) + ->where('status_alias.pending', '=', 0) ->where('status_alias.archived', '=', 1); }); break; case 'Requestable': $assets->where('assets.requestable', '=', 1) - ->join('status_labels AS status_alias',function ($join) { - $join->on('status_alias.id', "=", "assets.status_id") - ->where('status_alias.deployable','=',1) - ->where('status_alias.pending','=',0) + ->join('status_labels AS status_alias', function ($join) { + $join->on('status_alias.id', '=', 'assets.status_id') + ->where('status_alias.deployable', '=', 1) + ->where('status_alias.pending', '=', 0) ->where('status_alias.archived', '=', 0); }); @@ -220,24 +243,24 @@ class AssetsController extends Controller break; default: - if ((!$request->filled('status_id')) && ($settings->show_archived_in_list!='1')) { + if ((! $request->filled('status_id')) && ($settings->show_archived_in_list != '1')) { // terrible workaround for complex-query Laravel bug in fulltext - $assets->join('status_labels AS status_alias',function ($join) { - $join->on('status_alias.id', "=", "assets.status_id") + $assets->join('status_labels AS status_alias', function ($join) { + $join->on('status_alias.id', '=', 'assets.status_id') ->where('status_alias.archived', '=', 0); }); // If there is a status ID, don't take show_archived_in_list into consideration } else { - $assets->join('status_labels AS status_alias',function ($join) { - $join->on('status_alias.id', "=", "assets.status_id"); + $assets->join('status_labels AS status_alias', function ($join) { + $join->on('status_alias.id', '=', 'assets.status_id'); }); } } - if ((!is_null($filter)) && (count($filter)) > 0) { + if ((! is_null($filter)) && (count($filter)) > 0) { $assets->ByFilter($filter); } elseif ($request->filled('search')) { $assets->TextSearch($request->input('search')); @@ -247,7 +270,7 @@ class AssetsController extends Controller // This is kinda gross, but we need to do this because the Bootstrap Tables // API passes custom field ordering as custom_fields.fieldname, and we have to strip // that out to let the default sorter below order them correctly on the assets table. - $sort_override = str_replace('custom_fields.','', $request->input('sort')) ; + $sort_override = str_replace('custom_fields.', '', $request->input('sort')); // This handles all of the pivot sorting (versus the assets.* fields // in the allowed_columns array) @@ -292,10 +315,26 @@ class AssetsController extends Controller $total = $assets->count(); $assets = $assets->skip($offset)->take($limit)->get(); - // dd($assets); - return (new AssetsTransformer)->transformAssets($assets, $total); - } + + /** + * Include additional associated relationships + */ + if ($request->input('components')) { + $assets->loadMissing(['components' => function ($query) { + $query->orderBy('created_at', 'desc'); + }]); + } + + + + + /** + * Here we're just determining which Transformer (via $transformer) to use based on the + * variables we set earlier on in this method - we default to AssetsTransformer. + */ + return (new $transformer)->transformAssets($assets, $total, $request); + } /** * Returns JSON with information about an asset (by tag) for detail view. @@ -305,14 +344,16 @@ class AssetsController extends Controller * @since [v4.2.1] * @return JsonResponse */ - public function showByTag($tag) + public function showByTag(Request $request, $tag) { - if ($asset = Asset::with('assetstatus')->with('assignedTo')->where('asset_tag',$tag)->first()) { + if ($asset = Asset::with('assetstatus')->with('assignedTo')->where('asset_tag', $tag)->first()) { $this->authorize('view', $asset); - return (new AssetsTransformer)->transformAsset($asset); + + return (new AssetsTransformer)->transformAsset($asset, $request); } return response()->json(Helper::formatStandardApiResponse('error', null, 'Asset not found'), 200); + } /** @@ -323,15 +364,16 @@ class AssetsController extends Controller * @since [v4.2.1] * @return JsonResponse */ - public function showBySerial($serial) + public function showBySerial(Request $request, $serial) { $this->authorize('index', Asset::class); if ($assets = Asset::with('assetstatus')->with('assignedTo') - ->withTrashed()->where('serial',$serial)->get()) { + ->withTrashed()->where('serial', $serial)->get()) { return (new AssetsTransformer)->transformAssets($assets, $assets->count()); } return response()->json(Helper::formatStandardApiResponse('error', null, 'Asset not found'), 200); + } @@ -343,22 +385,25 @@ class AssetsController extends Controller * @since [v4.0] * @return JsonResponse */ - public function show($id) + public function show(Request $request, $id) { if ($asset = Asset::with('assetstatus')->with('assignedTo')->withTrashed() ->withCount('checkins as checkins_count', 'checkouts as checkouts_count', 'userRequests as user_requests_count')->findOrFail($id)) { $this->authorize('view', $asset); - return (new AssetsTransformer)->transformAsset($asset); + + return (new AssetsTransformer)->transformAsset($asset, $request->input('components') ); } } - public function licenses($id) + + public function licenses(Request $request, $id) { $this->authorize('view', Asset::class); $this->authorize('view', License::class); $asset = Asset::where('id', $id)->withTrashed()->first(); $licenses = $asset->licenses()->get(); + return (new LicensesTransformer())->transformLicenses($licenses, $licenses->count()); } @@ -381,7 +426,7 @@ class AssetsController extends Controller 'assets.model_id', 'assets.assigned_to', 'assets.assigned_type', - 'assets.status_id' + 'assets.status_id', ])->with('model', 'assetstatus', 'assignedTo')->NotArchived(), 'company_id', 'assets'); if ($request->filled('assetStatusType') && $request->input('assetStatusType') === 'RTD') { @@ -408,15 +453,14 @@ class AssetsController extends Controller } - if ($asset->assetstatus->getStatuslabelType()=='pending') { - $asset->use_text .= '('.$asset->assetstatus->getStatuslabelType().')'; + if ($asset->assetstatus->getStatuslabelType() == 'pending') { + $asset->use_text .= '('.$asset->assetstatus->getStatuslabelType().')'; } $asset->use_image = ($asset->getImageUrl()) ? $asset->getImageUrl() : null; } return (new SelectlistTransformer)->transformSelectlist($assets); - } @@ -424,13 +468,12 @@ class AssetsController extends Controller * Accepts a POST request to create a new asset * * @author [A. Gianotto] [] - * @param Request $request + * @param \App\Http\Requests\ImageUploadRequest $request * @since [v4.0] * @return JsonResponse */ - public function store(Request $request) + public function store(ImageUploadRequest $request) { - $this->authorize('create', Asset::class); $asset = new Asset(); @@ -449,7 +492,7 @@ class AssetsController extends Controller $asset->depreciate = '0'; $asset->status_id = $request->get('status_id', 0); $asset->warranty_months = $request->get('warranty_months', null); - $asset->purchase_cost = Helper::ParseFloat($request->get('purchase_cost')); + $asset->purchase_cost = Helper::ParseCurrency($request->get('purchase_cost')); // this is the API's store method, so I don't know that I want to do this? Confusing. FIXME (or not?!) $asset->purchase_date = $request->get('purchase_date', null); $asset->assigned_to = $request->get('assigned_to', null); $asset->supplier_id = $request->get('supplier_id', 0); @@ -457,21 +500,15 @@ class AssetsController extends Controller $asset->rtd_location_id = $request->get('rtd_location_id', null); $asset->location_id = $request->get('rtd_location_id', null); - if ($request->has('image_source') && $request->input('image_source') != "") { - $saved_image_path = Helper::processUploadedImage( - $request->input('image_source'), 'uploads/assets/' - ); + /** + * this is here just legacy reasons. Api\AssetController + * used image_source once to allow encoded image uploads. + */ + if ($request->has('image_source')) { + $request->offsetSet('image', $request->offsetGet('image_source')); + } - if (!$saved_image_path) { - return response()->json(Helper::formatStandardApiResponse( - 'error', - null, - trans('admin/hardware/message.create.error') - ), 200); - } - - $asset->image = $saved_image_path; - } + $asset = $request->handleImages($asset); // Update custom fields in the database. // Validation for these fields is handled through the AssetRequest form request @@ -491,13 +528,12 @@ class AssetsController extends Controller // if the field is set to encrypted, make sure we encrypt the value if ($field->field_encrypted == '1') { - \Log::debug('This model field is encrypted in this fieldset.'); if (Gate::allows('admin')) { // If input value is null, use custom field's default value - if (($field_val == null) && ($request->has('model_id')!='')){ + if (($field_val == null) && ($request->has('model_id') != '')) { $field_val = \Crypt::encrypt($field->defaultValue($request->get('model_id'))); } else { $field_val = \Crypt::encrypt($request->input($field->convertUnicodeDbSlug())); @@ -507,12 +543,10 @@ class AssetsController extends Controller $asset->{$field->convertUnicodeDbSlug()} = $field_val; - } } if ($asset->save()) { - if ($request->get('assigned_user')) { $target = User::find(request('assigned_user')); } elseif ($request->get('assigned_asset')) { @@ -539,11 +573,11 @@ class AssetsController extends Controller * Accepts a POST request to update an asset * * @author [A. Gianotto] [] - * @param Request $request + * @param \App\Http\Requests\ImageUploadRequest $request * @since [v4.0] * @return JsonResponse */ - public function update(Request $request, $id) + public function update(ImageUploadRequest $request, $id) { $this->authorize('update', Asset::class); @@ -557,37 +591,24 @@ class AssetsController extends Controller ($request->filled('company_id')) ? $asset->company_id = Company::getIdForCurrentUser($request->get('company_id')) : ''; -($request->filled('rtd_location_id')) ? - $asset->location_id = $request->get('rtd_location_id') : null; - - - if ($request->filled('image_source')) { - if ($request->input('image_source') == "") { ($request->filled('rtd_location_id')) ? $asset->location_id = $request->get('rtd_location_id') : null; - $asset->image = null; - } else { - $saved_image_path = Helper::processUploadedImage( - $request->input('image_source'), 'uploads/assets/' - ); - if (!$saved_image_path) { - return response()->json(Helper::formatStandardApiResponse( - 'error', - null, - trans('admin/hardware/message.update.error') - ), 200); - } - - $asset->image = $saved_image_path; - } - } + /** + * this is here just legacy reasons. Api\AssetController + * used image_source once to allow encoded image uploads. + */ + if ($request->has('image_source')) { + $request->offsetSet('image', $request->offsetGet('image_source')); + } + $asset = $request->handleImages($asset); + // Update custom fields if (($model = AssetModel::find($asset->model_id)) && (isset($model->fieldset))) { foreach ($model->fieldset->fields as $field) { if ($request->has($field->convertUnicodeDbSlug())) { - if ($field->field_encrypted=='1') { + if ($field->field_encrypted == '1') { if (Gate::allows('admin')) { $asset->{$field->convertUnicodeDbSlug()} = \Crypt::encrypt($request->input($field->convertUnicodeDbSlug())); } @@ -600,15 +621,13 @@ class AssetsController extends Controller if ($asset->save()) { - if (($request->filled('assigned_user')) && ($target = User::find($request->get('assigned_user')))) { $location = $target->location_id; } elseif (($request->filled('assigned_asset')) && ($target = Asset::find($request->get('assigned_asset')))) { $location = $target->location_id; - Asset::where('assigned_type', '\\App\\Models\\Asset')->where('assigned_to', $id) + Asset::where('assigned_type', \App\Models\Asset::class)->where('assigned_to', $id) ->update(['location_id' => $target->location_id]); - } elseif (($request->filled('assigned_location')) && ($target = Location::find($request->get('assigned_location')))) { $location = $target->id; } @@ -623,8 +642,10 @@ class AssetsController extends Controller return response()->json(Helper::formatStandardApiResponse('success', $asset, trans('admin/hardware/message.update.success'))); } + return response()->json(Helper::formatStandardApiResponse('error', null, $asset->getErrors()), 200); } + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/hardware/message.does_not_exist')), 200); } @@ -642,12 +663,11 @@ class AssetsController extends Controller $this->authorize('delete', Asset::class); if ($asset = Asset::find($id)) { - $this->authorize('delete', $asset); DB::table('assets') ->where('id', $asset->id) - ->update(array('assigned_to' => null)); + ->update(['assigned_to' => null]); $asset->delete(); @@ -657,6 +677,37 @@ class AssetsController extends Controller return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/hardware/message.does_not_exist')), 200); } + /** + * Restore a soft-deleted asset. + * + * @author [A. Gianotto] [] + * @param int $assetId + * @since [v5.1.18] + * @return JsonResponse + */ + public function restore($assetId = null) + { + // Get asset information + $asset = Asset::withTrashed()->find($assetId); + $this->authorize('delete', $asset); + if (isset($asset->id)) { + // Restore the asset + Asset::withTrashed()->where('id', $assetId)->restore(); + + $logaction = new Actionlog(); + $logaction->item_type = Asset::class; + $logaction->item_id = $asset->id; + $logaction->created_at = date("Y-m-d H:i:s"); + $logaction->user_id = Auth::user()->id; + $logaction->logaction('restored'); + + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/hardware/message.restore.success'))); + + + } + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/hardware/message.does_not_exist')), 200); + } + /** @@ -672,7 +723,7 @@ class AssetsController extends Controller $this->authorize('checkout', Asset::class); $asset = Asset::findOrFail($asset_id); - if (!$asset->availableForCheckout()) { + if (! $asset->availableForCheckout()) { return response()->json(Helper::formatStandardApiResponse('error', ['asset'=> e($asset->asset_tag)], trans('admin/hardware/message.checkout.not_available'))); } @@ -686,21 +737,21 @@ class AssetsController extends Controller // This item is checked out to a location - if (request('checkout_to_type')=='location') { + if (request('checkout_to_type') == 'location') { $target = Location::find(request('assigned_location')); $asset->location_id = ($target) ? $target->id : ''; $error_payload['target_id'] = $request->input('assigned_location'); $error_payload['target_type'] = 'location'; - } elseif (request('checkout_to_type')=='asset') { - $target = Asset::where('id','!=',$asset_id)->find(request('assigned_asset')); + } elseif (request('checkout_to_type') == 'asset') { + $target = Asset::where('id', '!=', $asset_id)->find(request('assigned_asset')); $asset->location_id = $target->rtd_location_id; // Override with the asset's location_id if it has one $asset->location_id = (($target) && (isset($target->location_id))) ? $target->location_id : ''; $error_payload['target_id'] = $request->input('assigned_asset'); $error_payload['target_type'] = 'asset'; - } elseif (request('checkout_to_type')=='user') { + } elseif (request('checkout_to_type') == 'user') { // Fetch the target and set the asset's new location_id $target = User::find(request('assigned_user')); $asset->location_id = (($target) && (isset($target->location_id))) ? $target->location_id : ''; @@ -710,13 +761,13 @@ class AssetsController extends Controller - if (!isset($target)) { + if (! isset($target)) { return response()->json(Helper::formatStandardApiResponse('error', $error_payload, 'Checkout target for asset '.e($asset->asset_tag).' is invalid - '.$error_payload['target_type'].' does not exist.')); } - $checkout_at = request('checkout_at', date("Y-m-d H:i:s")); + $checkout_at = request('checkout_at', date('Y-m-d H:i:s')); $expected_checkin = request('expected_checkin', null); $note = request('note', null); $asset_name = request('name', null); @@ -770,18 +821,19 @@ class AssetsController extends Controller $asset->name = $request->input('name'); } - $asset->location_id = $asset->rtd_location_id; + $asset->location_id = $asset->rtd_location_id; if ($request->filled('location_id')) { - $asset->location_id = $request->input('location_id'); + $asset->location_id = $request->input('location_id'); } if ($request->has('status_id')) { - $asset->status_id = $request->input('status_id'); + $asset->status_id = $request->input('status_id'); } if ($asset->save()) { - $asset->logCheckin($target, e($request->input('note'))); + event(new CheckoutableCheckedIn($asset, $target, Auth::user(), $request->input('note'))); + return response()->json(Helper::formatStandardApiResponse('success', ['asset'=> e($asset->asset_tag)], trans('admin/hardware/message.checkin.success'))); } @@ -797,15 +849,16 @@ class AssetsController extends Controller * @since [v4.0] * @return JsonResponse */ - public function audit(Request $request) { + public function audit(Request $request) + { $this->authorize('audit', Asset::class); - $rules = array( + $rules = [ 'asset_tag' => 'required', 'location_id' => 'exists:locations,id|nullable|numeric', - 'next_audit_date' => 'date|nullable' - ); + 'next_audit_date' => 'date|nullable', + ]; $validator = Validator::make($request->all(), $rules); if ($validator->fails()) { @@ -815,7 +868,7 @@ class AssetsController extends Controller $settings = Setting::getSettings(); $dt = Carbon::now()->addMonths($settings->audit_interval)->toDateString(); - $asset = Asset::where('asset_tag','=', $request->input('asset_tag'))->first(); + $asset = Asset::where('asset_tag', '=', $request->input('asset_tag'))->first(); if ($asset) { @@ -829,18 +882,19 @@ class AssetsController extends Controller // Check to see if they checked the box to update the physical location, // not just note it in the audit notes - if ($request->input('update_location')=='1') { + if ($request->input('update_location') == '1') { $asset->location_id = $request->input('location_id'); } $asset->last_audit_date = date('Y-m-d H:i:s'); if ($asset->save()) { - $log = $asset->logAudit(request('note'),request('location_id')); + $log = $asset->logAudit(request('note'), request('location_id')); + return response()->json(Helper::formatStandardApiResponse('success', [ 'asset_tag'=> e($asset->asset_tag), 'note'=> e($request->input('note')), - 'next_audit_date' => Helper::getFormattedDateObject($asset->next_audit_date) + 'next_audit_date' => Helper::getFormattedDateObject($asset->next_audit_date), ], trans('admin/hardware/message.audit.success'))); } } @@ -866,9 +920,9 @@ class AssetsController extends Controller { $this->authorize('viewRequestable', Asset::class); - $assets = Company::scopeCompanyables(Asset::select('assets.*'),"company_id","assets") + $assets = Company::scopeCompanyables(Asset::select('assets.*'), 'company_id', 'assets') ->with('location', 'assetstatus', 'assetlog', 'company', 'defaultLoc','assignedTo', - 'model.category', 'model.manufacturer', 'model.fieldset','supplier')->where('assets.requestable', '=', '1'); + 'model.category', 'model.manufacturer', 'model.fieldset', 'supplier')->where('assets.requestable', '=', '1'); $offset = request('offset', 0); $limit = $request->input('limit', 50); @@ -893,9 +947,9 @@ class AssetsController extends Controller break; } - $total = $assets->count(); $assets = $assets->skip($offset)->take($limit)->get(); + return (new AssetsTransformer)->transformRequestedAssets($assets, $total); } } diff --git a/app/Http/Controllers/Api/CategoriesController.php b/app/Http/Controllers/Api/CategoriesController.php index ae085c0f35..b1e36b29e0 100644 --- a/app/Http/Controllers/Api/CategoriesController.php +++ b/app/Http/Controllers/Api/CategoriesController.php @@ -8,6 +8,7 @@ use App\Http\Transformers\CategoriesTransformer; use App\Http\Transformers\SelectlistTransformer; use App\Models\Category; use Illuminate\Http\Request; +use App\Http\Requests\ImageUploadRequest; use Illuminate\Support\Facades\Storage; class CategoriesController extends Controller @@ -22,10 +23,10 @@ class CategoriesController extends Controller public function index(Request $request) { $this->authorize('view', Category::class); - $allowed_columns = ['id', 'name','category_type', 'category_type','use_default_eula','eula_text', 'require_acceptance','checkin_email', 'assets_count', 'accessories_count', 'consumables_count', 'components_count','licenses_count', 'image']; + $allowed_columns = ['id', 'name', 'category_type', 'category_type', 'use_default_eula', 'eula_text', 'require_acceptance', 'checkin_email', 'assets_count', 'accessories_count', 'consumables_count', 'components_count', 'licenses_count', 'image']; - $categories = Category::select(['id', 'created_at', 'updated_at', 'name','category_type','use_default_eula','eula_text', 'require_acceptance','checkin_email','image']) - ->withCount('assets as assets_count', 'accessories as accessories_count', 'consumables as consumables_count', 'components as components_count','licenses as licenses_count'); + $categories = Category::select(['id', 'created_at', 'updated_at', 'name', 'category_type', 'use_default_eula', 'eula_text', 'require_acceptance', 'checkin_email', 'image']) + ->withCount('assets as assets_count', 'accessories as accessories_count', 'consumables as consumables_count', 'components as components_count', 'licenses as licenses_count'); if ($request->filled('search')) { $categories = $categories->TextSearch($request->input('search')); @@ -44,30 +45,32 @@ class CategoriesController extends Controller $total = $categories->count(); $categories = $categories->skip($offset)->take($limit)->get(); + return (new CategoriesTransformer)->transformCategories($categories, $total); } - /** * Store a newly created resource in storage. * * @author [A. Gianotto] [] * @since [v4.0] - * @param \Illuminate\Http\Request $request + * @param \App\Http\Requests\ImageUploadRequest $request * @return \Illuminate\Http\Response */ - public function store(Request $request) + public function store(ImageUploadRequest $request) { $this->authorize('create', Category::class); $category = new Category; $category->fill($request->all()); + $category->category_type = strtolower($request->input('category_type')); + $category = $request->handleImages($category); if ($category->save()) { return response()->json(Helper::formatStandardApiResponse('success', $category, trans('admin/categories/message.create.success'))); } - return response()->json(Helper::formatStandardApiResponse('error', null, $category->getErrors())); + return response()->json(Helper::formatStandardApiResponse('error', null, $category->getErrors())); } /** @@ -82,25 +85,26 @@ class CategoriesController extends Controller { $this->authorize('view', Category::class); $category = Category::findOrFail($id); + return (new CategoriesTransformer)->transformCategory($category); - } - /** * Update the specified resource in storage. * * @author [A. Gianotto] [] * @since [v4.0] - * @param \Illuminate\Http\Request $request + * @param \App\Http\Requests\ImageUploadRequest $request * @param int $id * @return \Illuminate\Http\Response */ - public function update(Request $request, $id) + public function update(ImageUploadRequest $request, $id) { $this->authorize('update', Category::class); $category = Category::findOrFail($id); $category->fill($request->all()); + $category->category_type = strtolower($request->input('category_type')); + $category = $request->handleImages($category); if ($category->save()) { return response()->json(Helper::formatStandardApiResponse('success', $category, trans('admin/categories/message.update.success'))); @@ -122,28 +126,25 @@ class CategoriesController extends Controller $this->authorize('delete', Category::class); $category = Category::findOrFail($id); - if (!$category->isDeletable()) { + if (! $category->isDeletable()) { return response()->json( - Helper::formatStandardApiResponse('error', null, trans('admin/categories/message.assoc_items', ['asset_type'=>$category->category_type])) + Helper::formatStandardApiResponse('error', null, trans('admin/categories/message.assoc_items', ['asset_type'=>$category->category_type])) ); } $category->delete(); - return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/categories/message.delete.success'))); + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/categories/message.delete.success'))); } - /** * Gets a paginated collection for the select2 menus * * @author [A. Gianotto] [] * @since [v4.0.16] * @see \App\Http\Transformers\SelectlistTransformer - * */ public function selectlist(Request $request, $category_type = 'asset') { - $categories = Category::select([ 'id', 'name', @@ -164,7 +165,5 @@ class CategoriesController extends Controller } return (new SelectlistTransformer)->transformSelectlist($categories); - } - } diff --git a/app/Http/Controllers/Api/CompaniesController.php b/app/Http/Controllers/Api/CompaniesController.php index c56ed9f871..6e53ad068e 100644 --- a/app/Http/Controllers/Api/CompaniesController.php +++ b/app/Http/Controllers/Api/CompaniesController.php @@ -8,6 +8,7 @@ use App\Http\Transformers\CompaniesTransformer; use App\Http\Transformers\SelectlistTransformer; use App\Models\Company; use Illuminate\Http\Request; +use App\Http\Requests\ImageUploadRequest; use Illuminate\Support\Facades\Storage; class CompaniesController extends Controller @@ -36,7 +37,7 @@ class CompaniesController extends Controller 'components_count', ]; - $companies = Company::withCount('assets as assets_count','licenses as licenses_count','accessories as accessories_count','consumables as consumables_count','components as components_count','users as users_count'); + $companies = Company::withCount('assets as assets_count', 'licenses as licenses_count', 'accessories as accessories_count', 'consumables as consumables_count', 'components as components_count', 'users as users_count'); if ($request->filled('search')) { $companies->TextSearch($request->input('search')); @@ -55,31 +56,31 @@ class CompaniesController extends Controller $total = $companies->count(); $companies = $companies->skip($offset)->take($limit)->get(); + return (new CompaniesTransformer)->transformCompanies($companies, $total); - } - /** * Store a newly created resource in storage. * * @author [A. Gianotto] [] * @since [v4.0] - * @param \Illuminate\Http\Request $request + * @param \App\Http\Requests\ImageUploadRequest $request * @return \Illuminate\Http\Response */ - public function store(Request $request) + public function store(ImageUploadRequest $request) { $this->authorize('create', Company::class); $company = new Company; $company->fill($request->all()); - + $company = $request->handleImages($company); + if ($company->save()) { return response()->json(Helper::formatStandardApiResponse('success', (new CompaniesTransformer)->transformCompany($company), trans('admin/companies/message.create.success'))); } + return response() ->json(Helper::formatStandardApiResponse('error', null, $company->getErrors())); - } /** @@ -94,25 +95,25 @@ class CompaniesController extends Controller { $this->authorize('view', Company::class); $company = Company::findOrFail($id); + return (new CompaniesTransformer)->transformCompany($company); - } - /** * Update the specified resource in storage. * * @author [A. Gianotto] [] * @since [v4.0] - * @param \Illuminate\Http\Request $request + * @param \App\Http\Requests\ImageUploadRequest $request * @param int $id * @return \Illuminate\Http\Response */ - public function update(Request $request, $id) + public function update(ImageUploadRequest $request, $id) { $this->authorize('update', Company::class); $company = Company::findOrFail($id); $company->fill($request->all()); + $company = $request->handleImages($company); if ($company->save()) { return response() @@ -137,13 +138,14 @@ class CompaniesController extends Controller $company = Company::findOrFail($id); $this->authorize('delete', $company); - if ( !$company->isDeletable() ) { + if (! $company->isDeletable()) { return response() - ->json(Helper::formatStandardApiResponse('error', null, trans('admin/companies/message.assoc_users'))); + ->json(Helper::formatStandardApiResponse('error', null, trans('admin/companies/message.assoc_users'))); } $company->delete(); + return response() - ->json(Helper::formatStandardApiResponse('success', null, trans('admin/companies/message.delete.success'))); + ->json(Helper::formatStandardApiResponse('success', null, trans('admin/companies/message.delete.success'))); } /** @@ -152,11 +154,9 @@ class CompaniesController extends Controller * @author [A. Gianotto] [] * @since [v4.0.16] * @see \App\Http\Transformers\SelectlistTransformer - * */ public function selectlist(Request $request) { - $companies = Company::select([ 'companies.id', 'companies.name', diff --git a/app/Http/Controllers/Api/ComponentsController.php b/app/Http/Controllers/Api/ComponentsController.php index d7af18b21c..0eb4ab9d12 100644 --- a/app/Http/Controllers/Api/ComponentsController.php +++ b/app/Http/Controllers/Api/ComponentsController.php @@ -8,6 +8,10 @@ use App\Http\Transformers\ComponentsTransformer; use App\Models\Company; use App\Models\Component; use Illuminate\Http\Request; +use App\Http\Requests\ImageUploadRequest; +use App\Events\CheckoutableCheckedIn; +use App\Events\ComponentCheckedIn; +use App\Models\Asset; class ComponentsController extends Controller { @@ -22,23 +26,40 @@ class ComponentsController extends Controller public function index(Request $request) { $this->authorize('view', Component::class); + + // This array is what determines which fields should be allowed to be sorted on ON the table itself, no relations + // Relations will be handled in query scopes a little further down. + $allowed_columns = + [ + 'id', + 'name', + 'min_amt', + 'order_number', + 'serial', + 'purchase_date', + 'purchase_cost', + 'qty', + 'image', + ]; + + $components = Company::scopeCompanyables(Component::select('components.*') - ->with('company', 'location', 'category')); + ->with('company', 'location', 'category', 'assets')); if ($request->filled('search')) { $components = $components->TextSearch($request->input('search')); } if ($request->filled('company_id')) { - $components->where('company_id','=',$request->input('company_id')); + $components->where('company_id', '=', $request->input('company_id')); } if ($request->filled('category_id')) { - $components->where('category_id','=',$request->input('category_id')); + $components->where('category_id', '=', $request->input('category_id')); } if ($request->filled('location_id')) { - $components->where('location_id','=',$request->input('location_id')); + $components->where('location_id', '=', $request->input('location_id')); } // Set the offset to the API call's offset, unless the offset is higher than the actual count of items in which @@ -48,11 +69,12 @@ class ComponentsController extends Controller // Check to make sure the limit is not higher than the max allowed ((config('app.max_results') >= $request->input('limit')) && ($request->filled('limit'))) ? $limit = $request->input('limit') : $limit = config('app.max_results'); - $allowed_columns = ['id','name','min_amt','order_number','serial','purchase_date','purchase_cost','company','category','qty','location','image']; + $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; - $sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at'; + $sort_override = $request->input('sort'); + $column_sort = in_array($sort_override, $allowed_columns) ? $sort_override : 'created_at'; - switch ($sort) { + switch ($sort_override) { case 'category': $components = $components->OrderCategory($order); break; @@ -63,12 +85,13 @@ class ComponentsController extends Controller $components = $components->OrderCompany($order); break; default: - $components = $components->orderBy($sort, $order); + $components = $components->orderBy($column_sort, $order); break; } $total = $components->count(); $components = $components->skip($offset)->take($limit)->get(); + return (new ComponentsTransformer)->transformComponents($components, $total); } @@ -78,18 +101,20 @@ class ComponentsController extends Controller * * @author [A. Gianotto] [] * @since [v4.0] - * @param \Illuminate\Http\Request $request + * @param \App\Http\Requests\ImageUploadRequest $request * @return \Illuminate\Http\Response */ - public function store(Request $request) + public function store(ImageUploadRequest $request) { $this->authorize('create', Component::class); $component = new Component; $component->fill($request->all()); + $component = $request->handleImages($component); if ($component->save()) { return response()->json(Helper::formatStandardApiResponse('success', $component, trans('admin/components/message.create.success'))); } + return response()->json(Helper::formatStandardApiResponse('error', null, $component->getErrors())); } @@ -110,21 +135,22 @@ class ComponentsController extends Controller } } - /** * Update the specified resource in storage. * * @author [A. Gianotto] [] * @since [v4.0] - * @param \Illuminate\Http\Request $request + * @param \App\Http\Requests\ImageUploadRequest $request * @param int $id * @return \Illuminate\Http\Response */ - public function update(Request $request, $id) + public function update(ImageUploadRequest $request, $id) { $this->authorize('update', Component::class); $component = Component::findOrFail($id); $component->fill($request->all()); + $component = $request->handleImages($component); + if ($component->save()) { return response()->json(Helper::formatStandardApiResponse('success', $component, trans('admin/components/message.update.success'))); @@ -147,6 +173,7 @@ class ComponentsController extends Controller $component = Component::findOrFail($id); $this->authorize('delete', $component); $component->delete(); + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/components/message.delete.success'))); } @@ -170,6 +197,122 @@ class ComponentsController extends Controller $limit = $request->input('limit', 50); $total = $assets->count(); $assets = $assets->skip($offset)->take($limit)->get(); + return (new ComponentsTransformer)->transformCheckedoutComponents($assets, $total); } + + + /** + * Validate and checkout the component. + * + * @author [A. Gianotto] [] + * t + * @since [v5.1.8] + * @param Request $request + * @param int $componentId + * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function checkout(Request $request, $componentId) + { + // Check if the component exists + if (is_null($component = Component::find($componentId))) { + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/components/message.does_not_exist'))); + } + + $this->authorize('checkout', $component); + + + if ($component->numRemaining() >= $request->get('assigned_qty')) { + + if (!$asset = Asset::find($request->input('assigned_to'))) { + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/hardware/message.does_not_exist'))); + } + + // Update the accessory data + $component->assigned_to = $request->input('assigned_to'); + + $component->assets()->attach($component->id, [ + 'component_id' => $component->id, + 'created_at' => \Carbon::now(), + 'assigned_qty' => $request->get('assigned_qty', 1), + 'user_id' => \Auth::id(), + 'asset_id' => $request->get('assigned_to') + ]); + + $component->logCheckout($request->input('note'), $asset); + + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/components/message.checkout.success'))); + } + + return response()->json(Helper::formatStandardApiResponse('error', null, 'Not enough components remaining: '.$component->numRemaining().' remaining, '.$request->get('assigned_qty').' requested.')); + } + + /** + * Validate and store checkin data. + * + * @author [A. Gianotto] [] + * @since [v5.1.8] + * @param Request $request + * @param $component_asset_id + * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function checkin(Request $request, $component_asset_id) + { + if ($component_assets = \DB::table('components_assets')->find($component_asset_id)) { + + if (is_null($component = Component::find($component_assets->component_id))) { + + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/components/message.not_found'))); + } + + $this->authorize('checkin', $component); + + $max_to_checkin = $component_assets->assigned_qty; + + if ($max_to_checkin > 1) { + + $validator = \Validator::make($request->all(), [ + "checkin_qty" => "required|numeric|between:1,$max_to_checkin" + ]); + + if ($validator->fails()) { + return response()->json(Helper::formatStandardApiResponse('error', null, 'Checkin quantity must be between 1 and '.$max_to_checkin)); + } + } + + + // Validation passed, so let's figure out what we have to do here. + $qty_remaining_in_checkout = ($component_assets->assigned_qty - (int)$request->input('checkin_qty', 1)); + + // We have to modify the record to reflect the new qty that's + // actually checked out. + $component_assets->assigned_qty = $qty_remaining_in_checkout; + + \Log::debug($component_asset_id.' - '.$qty_remaining_in_checkout.' remaining in record '.$component_assets->id); + + \DB::table('components_assets')->where('id', + $component_asset_id)->update(['assigned_qty' => $qty_remaining_in_checkout]); + + // If the checked-in qty is exactly the same as the assigned_qty, + // we can simply delete the associated components_assets record + if ($qty_remaining_in_checkout == 0) { + \DB::table('components_assets')->where('id', '=', $component_asset_id)->delete(); + } + + + $asset = Asset::find($component_assets->asset_id); + + event(new CheckoutableCheckedIn($component, $asset, \Auth::user(), $request->input('note'), \Carbon::now())); + + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/components/message.checkin.success'))); + + } + + return response()->json(Helper::formatStandardApiResponse('error', null, 'No matching checkouts for that component join record')); + + + } + } diff --git a/app/Http/Controllers/Api/ConsumablesController.php b/app/Http/Controllers/Api/ConsumablesController.php index e67215a00d..032cc402c0 100644 --- a/app/Http/Controllers/Api/ConsumablesController.php +++ b/app/Http/Controllers/Api/ConsumablesController.php @@ -10,6 +10,7 @@ use App\Models\Company; use App\Models\Consumable; use App\Models\User; use Illuminate\Http\Request; +use App\Http\Requests\ImageUploadRequest; class ConsumablesController extends Controller { @@ -24,6 +25,26 @@ class ConsumablesController extends Controller public function index(Request $request) { $this->authorize('index', Consumable::class); + + // This array is what determines which fields should be allowed to be sorted on ON the table itself, no relations + // Relations will be handled in query scopes a little further down. + $allowed_columns = + [ + 'id', + 'name', + 'order_number', + 'min_amt', + 'purchase_date', + 'purchase_cost', + 'company', + 'category', + 'model_number', + 'item_no', + 'qty', + 'image', + ]; + + $consumables = Company::scopeCompanyables( Consumable::select('consumables.*') ->with('company', 'location', 'category', 'users', 'manufacturer') @@ -34,15 +55,23 @@ class ConsumablesController extends Controller } if ($request->filled('company_id')) { - $consumables->where('company_id','=',$request->input('company_id')); + $consumables->where('company_id', '=', $request->input('company_id')); } if ($request->filled('category_id')) { - $consumables->where('category_id','=',$request->input('category_id')); + $consumables->where('category_id', '=', $request->input('category_id')); + } + + if ($request->filled('model_number')) { + $consumables->where('model_number','=',$request->input('model_number')); } if ($request->filled('manufacturer_id')) { - $consumables->where('manufacturer_id','=',$request->input('manufacturer_id')); + $consumables->where('manufacturer_id', '=', $request->input('manufacturer_id')); + } + + if ($request->filled('location_id')) { + $consumables->where('location_id','=',$request->input('location_id')); } @@ -53,12 +82,14 @@ class ConsumablesController extends Controller // Check to make sure the limit is not higher than the max allowed ((config('app.max_results') >= $request->input('limit')) && ($request->filled('limit'))) ? $limit = $request->input('limit') : $limit = config('app.max_results'); - $allowed_columns = ['id','name','order_number','min_amt','purchase_date','purchase_cost','company','category','model_number', 'item_no', 'manufacturer','location','qty','image']; + $allowed_columns = ['id', 'name', 'order_number', 'min_amt', 'purchase_date', 'purchase_cost', 'company', 'category', 'model_number', 'item_no', 'manufacturer', 'location', 'qty', 'image']; $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; - $sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at'; + + $sort_override = $request->input('sort'); + $column_sort = in_array($sort_override, $allowed_columns) ? $sort_override : 'created_at'; - switch ($sort) { + switch ($sort_override) { case 'category': $consumables = $consumables->OrderCategory($order); break; @@ -72,36 +103,35 @@ class ConsumablesController extends Controller $consumables = $consumables->OrderCompany($order); break; default: - $consumables = $consumables->orderBy($sort, $order); + $consumables = $consumables->orderBy($column_sort, $order); break; } - - $total = $consumables->count(); $consumables = $consumables->skip($offset)->take($limit)->get(); + return (new ConsumablesTransformer)->transformConsumables($consumables, $total); - } - /** * Store a newly created resource in storage. * * @author [A. Gianotto] [] * @since [v4.0] - * @param \Illuminate\Http\Request $request + * @param \App\Http\Requests\ImageUploadRequest $request * @return \Illuminate\Http\Response */ - public function store(Request $request) + public function store(ImageUploadRequest $request) { $this->authorize('create', Consumable::class); $consumable = new Consumable; $consumable->fill($request->all()); + $consumable = $request->handleImages($consumable); if ($consumable->save()) { return response()->json(Helper::formatStandardApiResponse('success', $consumable, trans('admin/consumables/message.create.success'))); } + return response()->json(Helper::formatStandardApiResponse('error', null, $consumable->getErrors())); } @@ -116,25 +146,26 @@ class ConsumablesController extends Controller { $this->authorize('view', Consumable::class); $consumable = Consumable::findOrFail($id); + return (new ConsumablesTransformer)->transformConsumable($consumable); } - /** * Update the specified resource in storage. * * @author [A. Gianotto] [] * @since [v4.0] - * @param \Illuminate\Http\Request $request + * @param \App\Http\Requests\ImageUploadRequest $request * @param int $id * @return \Illuminate\Http\Response */ - public function update(Request $request, $id) + public function update(ImageUploadRequest $request, $id) { $this->authorize('update', Consumable::class); $consumable = Consumable::findOrFail($id); $consumable->fill($request->all()); - + $consumable = $request->handleImages($consumable); + if ($consumable->save()) { return response()->json(Helper::formatStandardApiResponse('success', $consumable, trans('admin/consumables/message.update.success'))); } @@ -156,7 +187,8 @@ class ConsumablesController extends Controller $consumable = Consumable::findOrFail($id); $this->authorize('delete', $consumable); $consumable->delete(); - return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/consumables/message.delete.success'))); + + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/consumables/message.delete.success'))); } /** @@ -170,21 +202,20 @@ class ConsumablesController extends Controller */ public function getDataView($consumableId) { - $consumable = Consumable::with(array('consumableAssignments'=> - function ($query) { + $consumable = Consumable::with(['consumableAssignments'=> function ($query) { $query->orderBy($query->getModel()->getTable().'.created_at', 'DESC'); }, 'consumableAssignments.admin'=> function ($query) { }, 'consumableAssignments.user'=> function ($query) { }, - ))->find($consumableId); + ])->find($consumableId); - if (!Company::isCurrentUserHasAccess($consumable)) { + if (! Company::isCurrentUserHasAccess($consumable)) { return ['total' => 0, 'rows' => []]; } $this->authorize('view', Consumable::class); - $rows = array(); + $rows = []; foreach ($consumable->consumableAssignments as $consumable_assignment) { $rows[] = [ @@ -195,7 +226,8 @@ class ConsumablesController extends Controller } $consumableCount = $consumable->users->count(); - $data = array('total' => $consumableCount, 'rows' => $rows); + $data = ['total' => $consumableCount, 'rows' => $rows]; + return $data; } @@ -231,7 +263,7 @@ class ConsumablesController extends Controller $consumable->users()->attach($consumable->id, [ 'consumable_id' => $consumable->id, 'user_id' => $user->id, - 'assigned_to' => $assigned_to + 'assigned_to' => $assigned_to, ]); // Log checkout event @@ -244,7 +276,7 @@ class ConsumablesController extends Controller $data['note'] = $logaction->note; $data['require_acceptance'] = $consumable->requireAcceptance(); - return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/consumables/message.checkout.success'))); + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/consumables/message.checkout.success'))); } return response()->json(Helper::formatStandardApiResponse('error', null, 'No consumables remaining')); @@ -254,14 +286,12 @@ class ConsumablesController extends Controller * Gets a paginated collection for the select2 menus * * @see \App\Http\Transformers\SelectlistTransformer - * */ public function selectlist(Request $request) { - $consumables = Consumable::select([ 'consumables.id', - 'consumables.name' + 'consumables.name', ]); if ($request->filled('search')) { @@ -270,7 +300,6 @@ class ConsumablesController extends Controller $consumables = $consumables->orderBy('name', 'ASC')->paginate(50); - return (new SelectlistTransformer)->transformSelectlist($consumables); } } diff --git a/app/Http/Controllers/Api/CustomFieldsController.php b/app/Http/Controllers/Api/CustomFieldsController.php index c42e68b677..d137164956 100644 --- a/app/Http/Controllers/Api/CustomFieldsController.php +++ b/app/Http/Controllers/Api/CustomFieldsController.php @@ -18,26 +18,26 @@ class CustomFieldsController extends Controller * @author [Brady Wetherington] [] * @param int $id * @since [v3.0] - * @return Array + * @return array */ - public function index() { $this->authorize('index', CustomField::class); $fields = CustomField::get(); + return (new CustomFieldsTransformer)->transformCustomFields($fields, $fields->count()); } /** - * Shows the given field - * @author [V. Cordes] [] - * @param int $id - * @since [v4.1.10] - * @return View - */ + * Shows the given field + * @author [V. Cordes] [] + * @param int $id + * @since [v4.1.10] + * @return View + */ public function show($id) { - $this->authorize('view', CustomField::class); + $this->authorize('view', CustomField::class); if ($field = CustomField::find($id)) { return (new CustomFieldsTransformer)->transformCustomField($field); } @@ -45,7 +45,7 @@ class CustomFieldsController extends Controller return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/custom_fields/message.field.invalid')), 200); } - /** + /** * Update the specified field * * @author [V. Cordes] [] @@ -80,7 +80,6 @@ class CustomFieldsController extends Controller return response()->json(Helper::formatStandardApiResponse('error', null, $field->getErrors())); } - /** * Store a newly created field. * @@ -96,9 +95,9 @@ class CustomFieldsController extends Controller $data = $request->all(); $regex_format = null; - - if (str_contains($data["format"], "regex:")){ - $regex_format = $data["format"]; + + if (str_contains($data['format'], 'regex:')) { + $regex_format = $data['format']; } $validator = Validator::make($data, $field->validationRules($regex_format)); @@ -111,8 +110,8 @@ class CustomFieldsController extends Controller if ($field->save()) { return response()->json(Helper::formatStandardApiResponse('success', $field, trans('admin/custom_fields/message.field.create.success'))); } - return response()->json(Helper::formatStandardApiResponse('error', null, $field->getErrors())); + return response()->json(Helper::formatStandardApiResponse('error', null, $field->getErrors())); } public function postReorder(Request $request, $id) @@ -121,8 +120,8 @@ class CustomFieldsController extends Controller $this->authorize('update', $fieldset); - $fields = array(); - $order_array = array(); + $fields = []; + $order_array = []; $items = $request->input('item'); @@ -135,7 +134,6 @@ class CustomFieldsController extends Controller } return $fieldset->fields()->sync($fields); - } public function associate(Request $request, $field_id) @@ -152,7 +150,8 @@ class CustomFieldsController extends Controller } $fieldset = CustomFieldset::findOrFail($fieldset_id); - $fieldset->fields()->attach($field->id, ["required" => ($request->input('required') == "on"), "order" => $request->input('order', $fieldset->fields->count())]); + $fieldset->fields()->attach($field->id, ['required' => ($request->input('required') == 'on'), 'order' => $request->input('order', $fieldset->fields->count())]); + return response()->json(Helper::formatStandardApiResponse('success', $fieldset, trans('admin/custom_fields/message.fieldset.update.success'))); } @@ -166,10 +165,12 @@ class CustomFieldsController extends Controller foreach ($field->fieldset as $fieldset) { if ($fieldset->id == $fieldset_id) { $fieldset->fields()->detach($field->id); + return response()->json(Helper::formatStandardApiResponse('success', $fieldset, trans('admin/custom_fields/message.fieldset.update.success'))); } } $fieldset = CustomFieldset::findOrFail($fieldset_id); + return response()->json(Helper::formatStandardApiResponse('success', $fieldset, trans('admin/custom_fields/message.fieldset.update.success'))); } @@ -186,13 +187,12 @@ class CustomFieldsController extends Controller $this->authorize('delete', $field); - if ($field->fieldset->count() >0) { + if ($field->fieldset->count() > 0) { return response()->json(Helper::formatStandardApiResponse('error', null, 'Field is in use.')); } $field->delete(); - return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/custom_fields/message.field.delete.success'))); + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/custom_fields/message.field.delete.success'))); } - } diff --git a/app/Http/Controllers/Api/CustomFieldsetsController.php b/app/Http/Controllers/Api/CustomFieldsetsController.php index 321959b9fd..18da1b67c2 100644 --- a/app/Http/Controllers/Api/CustomFieldsetsController.php +++ b/app/Http/Controllers/Api/CustomFieldsetsController.php @@ -1,4 +1,5 @@ ] * @author [Josh Gibson] */ - class CustomFieldsetsController extends Controller { - /** - * Shows the given fieldset and its fields - * @author [A. Gianotto] [] - * @author [Josh Gibson] - * @param int $id - * @since [v1.8] - * @return View - */ + * Shows the given fieldset and its fields + * @author [A. Gianotto] [] + * @author [Josh Gibson] + * @param int $id + * @since [v1.8] + * @return View + */ public function index() { $this->authorize('index', CustomFieldset::class); $fieldsets = CustomFieldset::withCount('fields as fields_count', 'models as models_count')->get(); - return (new CustomFieldsetsTransformer)->transformCustomFieldsets($fieldsets, $fieldsets->count()); + return (new CustomFieldsetsTransformer)->transformCustomFieldsets($fieldsets, $fieldsets->count()); } /** - * Shows the given fieldset and its fields - * @author [A. Gianotto] [] - * @author [Josh Gibson] - * @param int $id - * @since [v1.8] - * @return View - */ + * Shows the given fieldset and its fields + * @author [A. Gianotto] [] + * @author [Josh Gibson] + * @param int $id + * @since [v1.8] + * @return View + */ public function show($id) { - $this->authorize('view', CustomFieldset::class); + $this->authorize('view', CustomFieldset::class); if ($fieldset = CustomFieldset::find($id)) { return (new CustomFieldsetsTransformer)->transformCustomFieldset($fieldset); } return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/custom_fields/message.fieldset.does_not_exist')), 200); - } - - /** + /** * Update the specified resource in storage. * * @author [A. Gianotto] [] @@ -82,7 +79,6 @@ class CustomFieldsetsController extends Controller return response()->json(Helper::formatStandardApiResponse('error', null, $fieldset->getErrors())); } - /** * Store a newly created resource in storage. * @@ -100,11 +96,10 @@ class CustomFieldsetsController extends Controller if ($fieldset->save()) { return response()->json(Helper::formatStandardApiResponse('success', $fieldset, trans('admin/custom_fields/message.fieldset.create.success'))); } + return response()->json(Helper::formatStandardApiResponse('error', null, $fieldset->getErrors())); - } - /** * Delete a custom fieldset. * @@ -120,18 +115,15 @@ class CustomFieldsetsController extends Controller $modelsCount = $fieldset->models->count(); $fieldsCount = $fieldset->fields->count(); - if (($modelsCount > 0) || ($fieldsCount > 0) ){ + if (($modelsCount > 0) || ($fieldsCount > 0)) { return response()->json(Helper::formatStandardApiResponse('error', null, 'Fieldset is in use.')); } - if ($fieldset->delete()) { - return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/custom_fields/message.fieldset.delete.success'))); - } + if ($fieldset->delete()) { + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/custom_fields/message.fieldset.delete.success'))); + } return response()->json(Helper::formatStandardApiResponse('error', null, 'Unspecified error')); - - - } /** @@ -147,6 +139,7 @@ class CustomFieldsetsController extends Controller $this->authorize('view', CustomFieldset::class); $set = CustomFieldset::findOrFail($id); $fields = $set->fields; + return (new CustomFieldsTransformer)->transformCustomFields($fields, $fields->count()); } diff --git a/app/Http/Controllers/Api/DepartmentsController.php b/app/Http/Controllers/Api/DepartmentsController.php index b692d378b7..21c2ac114e 100644 --- a/app/Http/Controllers/Api/DepartmentsController.php +++ b/app/Http/Controllers/Api/DepartmentsController.php @@ -9,6 +9,7 @@ use App\Http\Transformers\SelectlistTransformer; use App\Models\Department; use Auth; use Illuminate\Http\Request; +use App\Http\Requests\ImageUploadRequest; use Illuminate\Support\Facades\Storage; class DepartmentsController extends Controller @@ -23,7 +24,7 @@ class DepartmentsController extends Controller public function index(Request $request) { $this->authorize('view', Department::class); - $allowed_columns = ['id','name','image','users_count']; + $allowed_columns = ['id', 'name', 'image', 'users_count']; $departments = Department::select([ 'departments.id', @@ -33,7 +34,7 @@ class DepartmentsController extends Controller 'departments.manager_id', 'departments.created_at', 'departments.updated_at', - 'departments.image' + 'departments.image', ])->with('users')->with('location')->with('manager')->with('company')->withCount('users as users_count'); if ($request->filled('search')) { @@ -64,8 +65,8 @@ class DepartmentsController extends Controller $total = $departments->count(); $departments = $departments->skip($offset)->take($limit)->get(); - return (new DepartmentsTransformer)->transformDepartments($departments, $total); + return (new DepartmentsTransformer)->transformDepartments($departments, $total); } /** @@ -73,22 +74,24 @@ class DepartmentsController extends Controller * * @author [A. Gianotto] [] * @since [v4.0] - * @param \Illuminate\Http\Request $request + * @param \App\Http\Requests\ImageUploadRequest $request * @return \Illuminate\Http\Response */ - public function store(Request $request) + public function store(ImageUploadRequest $request) { $this->authorize('create', Department::class); $department = new Department; $department->fill($request->all()); + $department = $request->handleImages($department); + $department->user_id = Auth::user()->id; - $department->manager_id = ($request->filled('manager_id' ) ? $request->input('manager_id') : null); + $department->manager_id = ($request->filled('manager_id') ? $request->input('manager_id') : null); if ($department->save()) { return response()->json(Helper::formatStandardApiResponse('success', $department, trans('admin/departments/message.create.success'))); } - return response()->json(Helper::formatStandardApiResponse('error', null, $department->getErrors())); + return response()->json(Helper::formatStandardApiResponse('error', null, $department->getErrors())); } /** @@ -103,6 +106,7 @@ class DepartmentsController extends Controller { $this->authorize('view', Department::class); $department = Department::findOrFail($id); + return (new DepartmentsTransformer)->transformDepartment($department); } @@ -111,15 +115,16 @@ class DepartmentsController extends Controller * * @author [A. Gianotto] [] * @since [v5.0] - * @param \Illuminate\Http\Request $request + * @param \App\Http\Requests\ImageUploadRequest $request * @param int $id * @return \Illuminate\Http\Response */ - public function update(Request $request, $id) + public function update(ImageUploadRequest $request, $id) { $this->authorize('update', Department::class); $department = Department::findOrFail($id); $department->fill($request->all()); + $department = $request->handleImages($department); if ($department->save()) { return response()->json(Helper::formatStandardApiResponse('success', $department, trans('admin/departments/message.update.success'))); @@ -128,8 +133,6 @@ class DepartmentsController extends Controller return response()->json(Helper::formatStandardApiResponse('error', null, $department->getErrors())); } - - /** * Validates and deletes selected department. * @@ -149,8 +152,8 @@ class DepartmentsController extends Controller } $department->delete(); - return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/departments/message.delete.success'))); + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/departments/message.delete.success'))); } /** @@ -159,11 +162,9 @@ class DepartmentsController extends Controller * @author [A. Gianotto] [] * @since [v4.0.16] * @see \App\Http\Transformers\SelectlistTransformer - * */ public function selectlist(Request $request) { - $departments = Department::select([ 'id', 'name', @@ -184,7 +185,5 @@ class DepartmentsController extends Controller } return (new SelectlistTransformer)->transformSelectlist($departments); - } - } diff --git a/app/Http/Controllers/Api/DepreciationsController.php b/app/Http/Controllers/Api/DepreciationsController.php index 931d751d22..2dd6b9d8e5 100644 --- a/app/Http/Controllers/Api/DepreciationsController.php +++ b/app/Http/Controllers/Api/DepreciationsController.php @@ -20,9 +20,9 @@ class DepreciationsController extends Controller public function index(Request $request) { $this->authorize('view', Depreciation::class); - $allowed_columns = ['id','name','months','created_at']; + $allowed_columns = ['id','name','months','depreciation_min','created_at']; - $depreciations = Depreciation::select('id','name','months','user_id','created_at','updated_at'); + $depreciations = Depreciation::select('id','name','months','depreciation_min','user_id','created_at','updated_at'); if ($request->filled('search')) { $depreciations = $depreciations->TextSearch($request->input('search')); @@ -41,10 +41,10 @@ class DepreciationsController extends Controller $total = $depreciations->count(); $depreciations = $depreciations->skip($offset)->take($limit)->get(); + return (new DepreciationsTransformer)->transformDepreciations($depreciations, $total); } - /** * Store a newly created resource in storage. * @@ -62,8 +62,8 @@ class DepreciationsController extends Controller if ($depreciation->save()) { return response()->json(Helper::formatStandardApiResponse('success', $depreciation, trans('admin/depreciations/message.create.success'))); } - return response()->json(Helper::formatStandardApiResponse('error', null, $depreciation->getErrors())); + return response()->json(Helper::formatStandardApiResponse('error', null, $depreciation->getErrors())); } /** @@ -78,10 +78,10 @@ class DepreciationsController extends Controller { $this->authorize('view', Depreciation::class); $depreciation = Depreciation::findOrFail($id); + return (new DepreciationsTransformer)->transformDepreciation($depreciation); } - /** * Update the specified resource in storage. * @@ -123,10 +123,7 @@ class DepreciationsController extends Controller } $depreciation->delete(); - return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/depreciations/message.delete.success'))); + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/depreciations/message.delete.success'))); } - - - } diff --git a/app/Http/Controllers/Api/GroupsController.php b/app/Http/Controllers/Api/GroupsController.php index 120dbfe3bd..5a3fe0642d 100644 --- a/app/Http/Controllers/Api/GroupsController.php +++ b/app/Http/Controllers/Api/GroupsController.php @@ -20,9 +20,9 @@ class GroupsController extends Controller public function index(Request $request) { $this->authorize('view', Group::class); - $allowed_columns = ['id','name','created_at', 'users_count']; + $allowed_columns = ['id', 'name', 'created_at', 'users_count']; - $groups = Group::select('id','name','permissions','created_at','updated_at')->withCount('users as users_count'); + $groups = Group::select('id', 'name', 'permissions', 'created_at', 'updated_at')->withCount('users as users_count'); if ($request->filled('search')) { $groups = $groups->TextSearch($request->input('search')); @@ -41,10 +41,10 @@ class GroupsController extends Controller $total = $groups->count(); $groups = $groups->skip($offset)->take($limit)->get(); + return (new GroupsTransformer)->transformGroups($groups, $total); } - /** * Store a newly created resource in storage. * @@ -62,8 +62,8 @@ class GroupsController extends Controller if ($group->save()) { return response()->json(Helper::formatStandardApiResponse('success', $group, trans('admin/groups/message.create.success'))); } - return response()->json(Helper::formatStandardApiResponse('error', null, $group->getErrors())); + return response()->json(Helper::formatStandardApiResponse('error', null, $group->getErrors())); } /** @@ -78,10 +78,10 @@ class GroupsController extends Controller { $this->authorize('view', Group::class); $group = Group::findOrFail($id); + return (new GroupsTransformer)->transformGroup($group); } - /** * Update the specified resource in storage. * @@ -118,9 +118,7 @@ class GroupsController extends Controller $group = Group::findOrFail($id); $this->authorize('delete', $group); $group->delete(); - return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/groups/message.delete.success'))); + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/groups/message.delete.success'))); } - - } diff --git a/app/Http/Controllers/Api/ImportController.php b/app/Http/Controllers/Api/ImportController.php index 682f18d72b..0e8d969815 100644 --- a/app/Http/Controllers/Api/ImportController.php +++ b/app/Http/Controllers/Api/ImportController.php @@ -27,8 +27,8 @@ class ImportController extends Controller { $this->authorize('import'); $imports = Import::latest()->get(); - return (new ImportsTransformer)->transformImports($imports); + return (new ImportsTransformer)->transformImports($imports); } /** @@ -40,27 +40,28 @@ class ImportController extends Controller public function store() { $this->authorize('import'); - if (!config('app.lock_passwords')) { + if (! config('app.lock_passwords')) { $files = Request::file('files'); $path = config('app.private_uploads').'/imports'; $results = []; $import = new Import; foreach ($files as $file) { - if (!in_array($file->getMimeType(), array( + if (! in_array($file->getMimeType(), [ 'application/vnd.ms-excel', 'text/csv', 'application/csv', 'text/x-Algol68', // because wtf CSV files? 'text/plain', 'text/comma-separated-values', - 'text/tsv'))) { - $results['error']='File type must be CSV. Uploaded file is '.$file->getMimeType(); + 'text/tsv', ])) { + $results['error'] = 'File type must be CSV. Uploaded file is '.$file->getMimeType(); + return response()->json(Helper::formatStandardApiResponse('error', null, $results['error']), 500); } //TODO: is there a lighter way to do this? - if (! ini_get("auto_detect_line_endings")) { - ini_set("auto_detect_line_endings", '1'); + if (! ini_get('auto_detect_line_endings')) { + ini_set('auto_detect_line_endings', '1'); } $reader = Reader::createFromFileObject($file->openFile('r')); //file pointer leak? $import->header_row = $reader->fetchOne(0); @@ -68,20 +69,20 @@ class ImportController extends Controller //duplicate headers check $duplicate_headers = []; - for($i = 0; $iheader_row); $i++) { + for ($i = 0; $i < count($import->header_row); $i++) { $header = $import->header_row[$i]; - if(in_array($header, $import->header_row)) { + if (in_array($header, $import->header_row)) { $found_at = array_search($header, $import->header_row); - if($i > $found_at) { + if ($i > $found_at) { //avoid reporting duplicates twice, e.g. "1 is same as 17! 17 is same as 1!!!" //as well as "1 is same as 1!!!" (which is always true) //has to be > because otherwise the first result of array_search will always be $i itself(!) - array_push($duplicate_headers,"Duplicate header '$header' detected, first at column: ".($found_at+1).", repeats at column: ".($i+1)); + array_push($duplicate_headers, "Duplicate header '$header' detected, first at column: ".($found_at + 1).', repeats at column: '.($i + 1)); } } } - if(count($duplicate_headers) > 0) { - return response()->json(Helper::formatStandardApiResponse('error',null, implode("; ",$duplicate_headers)), 500); //should this be '4xx'? + if (count($duplicate_headers) > 0) { + return response()->json(Helper::formatStandardApiResponse('error', null, implode('; ', $duplicate_headers)), 500); //should this be '4xx'? } // Grab the first row to display via ajax as the user picks fields @@ -92,10 +93,11 @@ class ImportController extends Controller try { $file->move($path, $date.'-'.$fixed_filename); } catch (FileException $exception) { - $results['error']=trans('admin/hardware/message.upload.error'); + $results['error'] = trans('admin/hardware/message.upload.error'); if (config('app.debug')) { - $results['error'].= ' ' . $exception->getMessage(); + $results['error'] .= ' '.$exception->getMessage(); } + return response()->json(Helper::formatStandardApiResponse('error', null, $results['error']), 500); } $file_name = date('Y-m-d-his').'-'.$fixed_filename; @@ -105,12 +107,15 @@ class ImportController extends Controller $results[] = $import; } $results = (new ImportsTransformer)->transformImports($results); + return [ 'files' => $results, ]; } + return response()->json(Helper::formatStandardApiResponse('error', null, trans('general.feature_disabled')), 500); } + /** * Processes the specified Import. * @@ -130,25 +135,25 @@ class ImportController extends Controller } $errors = $request->import(Import::find($import_id)); - $redirectTo = "hardware.index"; + $redirectTo = 'hardware.index'; switch ($request->get('import-type')) { - case "asset": - $redirectTo = "hardware.index"; + case 'asset': + $redirectTo = 'hardware.index'; break; - case "accessory": - $redirectTo = "accessories.index"; + case 'accessory': + $redirectTo = 'accessories.index'; break; - case "consumable": - $redirectTo = "consumables.index"; + case 'consumable': + $redirectTo = 'consumables.index'; break; - case "component": - $redirectTo = "components.index"; + case 'component': + $redirectTo = 'components.index'; break; - case "license": - $redirectTo = "licenses.index"; + case 'license': + $redirectTo = 'licenses.index'; break; - case "user": - $redirectTo = "users.index"; + case 'user': + $redirectTo = 'users.index'; break; } @@ -157,8 +162,8 @@ class ImportController extends Controller } //Flash message before the redirect Session::flash('success', trans('admin/hardware/message.import.success')); - return response()->json(Helper::formatStandardApiResponse('success', null, ['redirect_url' => route($redirectTo)])); + return response()->json(Helper::formatStandardApiResponse('success', null, ['redirect_url' => route($redirectTo)])); } /** @@ -170,20 +175,20 @@ class ImportController extends Controller public function destroy($import_id) { $this->authorize('create', Asset::class); - + if ($import = Import::find($import_id)) { try { // Try to delete the file Storage::delete('imports/'.$import->file_path); $import->delete(); - return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/hardware/message.import.file_delete_success'))); + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/hardware/message.import.file_delete_success'))); } catch (\Exception $e) { // If the file delete didn't work, remove it from the database anyway and return a warning $import->delete(); + return response()->json(Helper::formatStandardApiResponse('warning', null, trans('admin/hardware/message.import.file_not_deleted_warning'))); } } - } } diff --git a/app/Http/Controllers/Api/LicenseSeatsController.php b/app/Http/Controllers/Api/LicenseSeatsController.php index f86856718d..0dd1c1fbd6 100644 --- a/app/Http/Controllers/Api/LicenseSeatsController.php +++ b/app/Http/Controllers/Api/LicenseSeatsController.php @@ -32,7 +32,7 @@ class LicenseSeatsController extends Controller $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; - if ($request->input('sort')=='department') { + if ($request->input('sort') == 'department') { $seats->OrderDepartments($order); } else { $seats->orderBy('id', $order); @@ -41,7 +41,7 @@ class LicenseSeatsController extends Controller $total = $seats->count(); $offset = (($seats) && (request('offset') > $total)) ? 0 : request('offset', 0); $limit = request('limit', 50); - + $seats = $seats->skip($offset)->take($limit)->get(); if ($seats) { @@ -65,13 +65,14 @@ class LicenseSeatsController extends Controller $this->authorize('view', License::class); // sanity checks: // 1. does the license seat exist? - if (!$licenseSeat = LicenseSeat::find($seatId)) { + if (! $licenseSeat = LicenseSeat::find($seatId)) { return response()->json(Helper::formatStandardApiResponse('error', null, 'Seat not found')); } // 2. does the seat belong to the specified license? - if (!$license = $licenseSeat->license()->first() || $license->id != intval($licenseId)) { + if (! $license = $licenseSeat->license()->first() || $license->id != intval($licenseId)) { return response()->json(Helper::formatStandardApiResponse('error', null, 'Seat does not belong to the specified license')); } + return (new LicenseSeatsTransformer)->transformLicenseSeat($licenseSeat); } @@ -89,11 +90,11 @@ class LicenseSeatsController extends Controller // sanity checks: // 1. does the license seat exist? - if (!$licenseSeat = LicenseSeat::find($seatId)) { + if (! $licenseSeat = LicenseSeat::find($seatId)) { return response()->json(Helper::formatStandardApiResponse('error', null, 'Seat not found')); } // 2. does the seat belong to the specified license? - if (!$license = $licenseSeat->license()->first() || $license->id != intval($licenseId)) { + if (! $license = $licenseSeat->license()->first() || $license->id != intval($licenseId)) { return response()->json(Helper::formatStandardApiResponse('error', null, 'Seat does not belong to the specified license')); } @@ -103,14 +104,14 @@ class LicenseSeatsController extends Controller // attempt to update the license seat $licenseSeat->fill($request->all()); $licenseSeat->user_id = Auth::user()->id; - + // check if this update is a checkin operation // 1. are relevant fields touched at all? $touched = $licenseSeat->isDirty('assigned_to') || $licenseSeat->isDirty('asset_id'); // 2. are they cleared? if yes then this is a checkin operation $is_checkin = ($touched && $licenseSeat->assigned_to === null && $licenseSeat->asset_id === null); - if (!$touched) { + if (! $touched) { // nothing to update return response()->json(Helper::formatStandardApiResponse('success', $licenseSeat, trans('admin/licenses/message.update.success'))); } @@ -128,11 +129,13 @@ class LicenseSeatsController extends Controller if ($is_checkin) { $licenseSeat->logCheckin($target, $request->input('note')); + return response()->json(Helper::formatStandardApiResponse('success', $licenseSeat, trans('admin/licenses/message.update.success'))); } // in this case, relevant fields are touched but it's not a checkin operation. so it must be a checkout operation. $licenseSeat->logCheckout($request->input('note'), $target); + return response()->json(Helper::formatStandardApiResponse('success', $licenseSeat, trans('admin/licenses/message.update.success'))); } diff --git a/app/Http/Controllers/Api/LicensesController.php b/app/Http/Controllers/Api/LicensesController.php index 268248ab77..ad6e75ab77 100644 --- a/app/Http/Controllers/Api/LicensesController.php +++ b/app/Http/Controllers/Api/LicensesController.php @@ -26,63 +26,72 @@ class LicensesController extends Controller public function index(Request $request) { $this->authorize('view', License::class); - $licenses = Company::scopeCompanyables(License::with('company', 'manufacturer', 'freeSeats', 'supplier','category')->withCount('freeSeats as free_seats_count')); - + $licenses = Company::scopeCompanyables(License::with('company', 'manufacturer', 'freeSeats', 'supplier', 'category')->withCount('freeSeats as free_seats_count')); if ($request->filled('company_id')) { - $licenses->where('company_id','=',$request->input('company_id')); + $licenses->where('company_id', '=', $request->input('company_id')); } if ($request->filled('name')) { - $licenses->where('licenses.name','=',$request->input('name')); + $licenses->where('licenses.name', '=', $request->input('name')); } if ($request->filled('product_key')) { - $licenses->where('licenses.serial','=',$request->input('product_key')); + $licenses->where('licenses.serial', '=', $request->input('product_key')); } if ($request->filled('order_number')) { - $licenses->where('order_number','=',$request->input('order_number')); + $licenses->where('order_number', '=', $request->input('order_number')); } if ($request->filled('purchase_order')) { - $licenses->where('purchase_order','=',$request->input('purchase_order')); + $licenses->where('purchase_order', '=', $request->input('purchase_order')); } if ($request->filled('license_name')) { - $licenses->where('license_name','=',$request->input('license_name')); + $licenses->where('license_name', '=', $request->input('license_name')); } if ($request->filled('license_email')) { - $licenses->where('license_email','=',$request->input('license_email')); + $licenses->where('license_email', '=', $request->input('license_email')); } if ($request->filled('manufacturer_id')) { - $licenses->where('manufacturer_id','=',$request->input('manufacturer_id')); + $licenses->where('manufacturer_id', '=', $request->input('manufacturer_id')); } if ($request->filled('supplier_id')) { - $licenses->where('supplier_id','=',$request->input('supplier_id')); + $licenses->where('supplier_id', '=', $request->input('supplier_id')); } if ($request->filled('category_id')) { - $licenses->where('category_id','=',$request->input('category_id')); + $licenses->where('category_id', '=', $request->input('category_id')); } if ($request->filled('depreciation_id')) { - $licenses->where('depreciation_id','=',$request->input('depreciation_id')); + $licenses->where('depreciation_id', '=', $request->input('depreciation_id')); } if ($request->filled('supplier_id')) { - $licenses->where('supplier_id','=',$request->input('supplier_id')); + $licenses->where('supplier_id', '=', $request->input('supplier_id')); } + if (($request->filled('maintained')) && ($request->input('maintained')=='true')) { + $licenses->where('maintained','=',1); + } elseif (($request->filled('maintained')) && ($request->input('maintained')=='false')) { + $licenses->where('maintained','=',0); + } + + if (($request->filled('expires')) && ($request->input('expires')=='true')) { + $licenses->whereNotNull('expiration_date'); + } elseif (($request->filled('expires')) && ($request->input('expires')=='false')) { + $licenses->whereNull('expiration_date'); + } if ($request->filled('search')) { $licenses = $licenses->TextSearch($request->input('search')); } - // Set the offset to the API call's offset, unless the offset is higher than the actual count of items in which // case we override with the actual count, so we should return 0 items. $offset = (($licenses) && ($request->get('offset') > $licenses->count())) ? $licenses->count() : $request->get('offset', 0); @@ -92,7 +101,6 @@ class LicensesController extends Controller $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; - switch ($request->input('sort')) { case 'manufacturer': $licenses = $licenses->leftJoin('manufacturers', 'licenses.manufacturer_id', '=', 'manufacturers.id')->orderBy('manufacturers.name', $order); @@ -128,25 +136,20 @@ class LicensesController extends Controller 'free_seats_count', 'seats', 'termination_date', - 'depreciation_id' + 'depreciation_id', ]; $sort = in_array($request->input('sort'), $allowed_columns) ? e($request->input('sort')) : 'created_at'; $licenses = $licenses->orderBy($sort, $order); break; } - - $total = $licenses->count(); $licenses = $licenses->skip($offset)->take($limit)->get(); + return (new LicensesTransformer)->transformLicenses($licenses, $total); - } - - - /** * Store a newly created resource in storage. * @@ -162,9 +165,10 @@ class LicensesController extends Controller $license = new License; $license->fill($request->all()); - if($license->save()) { + if ($license->save()) { return response()->json(Helper::formatStandardApiResponse('success', $license, trans('admin/licenses/message.create.success'))); } + return response()->json(Helper::formatStandardApiResponse('error', null, $license->getErrors())); } @@ -180,10 +184,10 @@ class LicensesController extends Controller $this->authorize('view', License::class); $license = License::withCount('freeSeats')->findOrFail($id); $license = $license->load('assignedusers', 'licenseSeats.user', 'licenseSeats.asset'); + return (new LicensesTransformer)->transformLicense($license); } - /** * Update the specified resource in storage. * @@ -222,22 +226,23 @@ class LicensesController extends Controller $license = License::findOrFail($id); $this->authorize('delete', $license); - if($license->assigned_seats_count == 0) { + if ($license->assigned_seats_count == 0) { // Delete the license and the associated license seats DB::table('license_seats') ->where('id', $license->id) - ->update(array('assigned_to' => null,'asset_id' => null)); + ->update(['assigned_to' => null, 'asset_id' => null]); $licenseSeats = $license->licenseseats(); $licenseSeats->delete(); $license->delete(); // Redirect to the licenses management page - return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/licenses/message.delete.success'))); + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/licenses/message.delete.success'))); } + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/licenses/message.assoc_users'))); } - + /** * Gets a paginated collection for the select2 menus * @@ -245,10 +250,9 @@ class LicensesController extends Controller */ public function selectlist(Request $request) { - $licenses = License::select([ 'licenses.id', - 'licenses.name' + 'licenses.name', ]); if ($request->filled('search')) { @@ -257,9 +261,6 @@ class LicensesController extends Controller $licenses = $licenses->orderBy('name', 'ASC')->paginate(50); - return (new SelectlistTransformer)->transformSelectlist($licenses); } - - } diff --git a/app/Http/Controllers/Api/LocationsController.php b/app/Http/Controllers/Api/LocationsController.php index ed71685159..43be34a27f 100644 --- a/app/Http/Controllers/Api/LocationsController.php +++ b/app/Http/Controllers/Api/LocationsController.php @@ -2,12 +2,13 @@ namespace App\Http\Controllers\Api; -use Illuminate\Http\Request; -use App\Http\Controllers\Controller; use App\Helpers\Helper; -use App\Models\Location; +use App\Http\Requests\ImageUploadRequest; +use App\Http\Controllers\Controller; use App\Http\Transformers\LocationsTransformer; use App\Http\Transformers\SelectlistTransformer; +use App\Models\Location; +use Illuminate\Http\Request; use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Support\Collection; @@ -24,9 +25,9 @@ class LocationsController extends Controller { $this->authorize('view', Location::class); $allowed_columns = [ - 'id','name','address','address2','city','state','country','zip','created_at', - 'updated_at','manager_id','image', - 'assigned_assets_count','users_count','assets_count','currency','ldap_ou']; + 'id', 'name', 'address', 'address2', 'city', 'state', 'country', 'zip', 'created_at', + 'updated_at', 'manager_id', 'image', + 'assigned_assets_count', 'users_count', 'assets_count', 'currency', 'ldap_ou', ]; $locations = Location::with('parent', 'manager', 'children')->select([ 'locations.id', @@ -43,7 +44,7 @@ class LocationsController extends Controller 'locations.updated_at', 'locations.image', 'locations.ldap_ou', - 'locations.currency' + 'locations.currency', ])->withCount('assignedAssets as assigned_assets_count') ->withCount('assets as assets_count') ->withCount('users as users_count'); @@ -52,8 +53,6 @@ class LocationsController extends Controller $locations = $locations->TextSearch($request->input('search')); } - - $offset = (($locations) && (request('offset') > $locations->count())) ? $locations->count() : request('offset', 0); // Check to make sure the limit is not higher than the max allowed @@ -74,9 +73,9 @@ class LocationsController extends Controller break; } - $total = $locations->count(); $locations = $locations->skip($offset)->take($limit)->get(); + return (new LocationsTransformer)->transformLocations($locations, $total); } @@ -86,18 +85,20 @@ class LocationsController extends Controller * * @author [A. Gianotto] [] * @since [v4.0] - * @param \Illuminate\Http\Request $request + * @param \App\Http\Requests\ImageUploadRequest $request * @return \Illuminate\Http\Response */ - public function store(Request $request) + public function store(ImageUploadRequest $request) { $this->authorize('create', Location::class); $location = new Location; $location->fill($request->all()); + $location = $request->handleImages($location); if ($location->save()) { return response()->json(Helper::formatStandardApiResponse('success', (new LocationsTransformer)->transformLocation($location), trans('admin/locations/message.create.success'))); } + return response()->json(Helper::formatStandardApiResponse('error', null, $location->getErrors())); } @@ -127,35 +128,35 @@ class LocationsController extends Controller 'locations.created_at', 'locations.updated_at', 'locations.image', - 'locations.currency' + 'locations.currency', ]) ->withCount('assignedAssets as assigned_assets_count') ->withCount('assets as assets_count') ->withCount('users as users_count')->findOrFail($id); + return (new LocationsTransformer)->transformLocation($location); } - /** * Update the specified resource in storage. * * @author [A. Gianotto] [] * @since [v4.0] - * @param \Illuminate\Http\Request $request + * @param \App\Http\Requests\ImageUploadRequest $request * @param int $id * @return \Illuminate\Http\JsonResponse */ - public function update(Request $request, $id) + public function update(ImageUploadRequest $request, $id) { $this->authorize('update', Location::class); $location = Location::findOrFail($id); $location->fill($request->all()); - + $location = $request->handleImages($location); if ($location->isValid()) { - $location->save(); + return response()->json( Helper::formatStandardApiResponse( 'success', @@ -180,12 +181,13 @@ class LocationsController extends Controller { $this->authorize('delete', Location::class); $location = Location::findOrFail($id); - if(!$location->isDeletable()) { + if (! $location->isDeletable()) { return response() - ->json(Helper::formatStandardApiResponse('error', null, trans('admin/companies/message.assoc_users'))); + ->json(Helper::formatStandardApiResponse('error', null, trans('admin/companies/message.assoc_users'))); } $this->authorize('delete', $location); $location->delete(); + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/locations/message.delete.success'))); } @@ -216,11 +218,9 @@ class LocationsController extends Controller * @author [A. Gianotto] [] * @since [v4.0.16] * @see \App\Http\Transformers\SelectlistTransformer - * */ public function selectlist(Request $request) { - $locations = Location::select([ 'locations.id', 'locations.name', @@ -242,26 +242,22 @@ class LocationsController extends Controller $locations_with_children = []; foreach ($locations as $location) { - if (!array_key_exists($location->parent_id, $locations_with_children)) { + if (! array_key_exists($location->parent_id, $locations_with_children)) { $locations_with_children[$location->parent_id] = []; } $locations_with_children[$location->parent_id][] = $location; } if ($request->filled('search')) { - $locations_formatted = $locations; + $locations_formatted = $locations; } else { $location_options = Location::indenter($locations_with_children); $locations_formatted = new Collection($location_options); - } - $paginated_results = new LengthAwarePaginator($locations_formatted->forPage($page, 500), $locations_formatted->count(), 500, $page, []); + $paginated_results = new LengthAwarePaginator($locations_formatted->forPage($page, 500), $locations_formatted->count(), 500, $page, []); //return []; return (new SelectlistTransformer)->transformSelectlist($paginated_results); - } - - } diff --git a/app/Http/Controllers/Api/ManufacturersController.php b/app/Http/Controllers/Api/ManufacturersController.php index 6b9212137f..5392c1d217 100644 --- a/app/Http/Controllers/Api/ManufacturersController.php +++ b/app/Http/Controllers/Api/ManufacturersController.php @@ -8,6 +8,7 @@ use App\Http\Transformers\ManufacturersTransformer; use App\Http\Transformers\SelectlistTransformer; use App\Models\Manufacturer; use Illuminate\Http\Request; +use App\Http\Requests\ImageUploadRequest; use Illuminate\Support\Facades\Storage; class ManufacturersController extends Controller @@ -22,13 +23,13 @@ class ManufacturersController extends Controller public function index(Request $request) { $this->authorize('view', Manufacturer::class); - $allowed_columns = ['id','name','url','support_url','support_email','support_phone','created_at','updated_at','image', 'assets_count', 'consumables_count', 'components_count', 'licenses_count']; + $allowed_columns = ['id', 'name', 'url', 'support_url', 'support_email', 'support_phone', 'created_at', 'updated_at', 'image', 'assets_count', 'consumables_count', 'components_count', 'licenses_count']; $manufacturers = Manufacturer::select( - array('id','name','url','support_url','support_email','support_phone','created_at','updated_at','image', 'deleted_at') + ['id', 'name', 'url', 'support_url', 'support_email', 'support_phone', 'created_at', 'updated_at', 'image', 'deleted_at'] )->withCount('assets as assets_count')->withCount('licenses as licenses_count')->withCount('consumables as consumables_count')->withCount('accessories as accessories_count'); - if ($request->input('deleted')=='true') { + if ($request->input('deleted') == 'true') { $manufacturers->onlyTrashed(); } @@ -36,7 +37,6 @@ class ManufacturersController extends Controller $manufacturers = $manufacturers->TextSearch($request->input('search')); } - // Set the offset to the API call's offset, unless the offset is higher than the actual count of items in which // case we override with the actual count, so we should return 0 items. $offset = (($manufacturers) && ($request->get('offset') > $manufacturers->count())) ? $manufacturers->count() : $request->get('offset', 0); @@ -50,29 +50,30 @@ class ManufacturersController extends Controller $total = $manufacturers->count(); $manufacturers = $manufacturers->skip($offset)->take($limit)->get(); + return (new ManufacturersTransformer)->transformManufacturers($manufacturers, $total); } - /** * Store a newly created resource in storage. * * @author [A. Gianotto] [] * @since [v4.0] - * @param \Illuminate\Http\Request $request + * @param \App\Http\Requests\ImageUploadRequest $request * @return \Illuminate\Http\Response */ - public function store(Request $request) + public function store(ImageUploadRequest $request) { $this->authorize('create', Manufacturer::class); $manufacturer = new Manufacturer; $manufacturer->fill($request->all()); + $manufacturer = $request->handleImages($manufacturer); if ($manufacturer->save()) { return response()->json(Helper::formatStandardApiResponse('success', $manufacturer, trans('admin/manufacturers/message.create.success'))); } - return response()->json(Helper::formatStandardApiResponse('error', null, $manufacturer->getErrors())); + return response()->json(Helper::formatStandardApiResponse('error', null, $manufacturer->getErrors())); } /** @@ -87,24 +88,25 @@ class ManufacturersController extends Controller { $this->authorize('view', Manufacturer::class); $manufacturer = Manufacturer::withCount('assets as assets_count')->withCount('licenses as licenses_count')->withCount('consumables as consumables_count')->withCount('accessories as accessories_count')->findOrFail($id); + return (new ManufacturersTransformer)->transformManufacturer($manufacturer); } - /** * Update the specified resource in storage. * * @author [A. Gianotto] [] * @since [v4.0] - * @param \Illuminate\Http\Request $request + * @param \App\Http\Requests\ImageUploadRequest $request * @param int $id * @return \Illuminate\Http\Response */ - public function update(Request $request, $id) + public function update(ImageUploadRequest $request, $id) { $this->authorize('update', Manufacturer::class); $manufacturer = Manufacturer::findOrFail($id); $manufacturer->fill($request->all()); + $manufacturer = $request->handleImages($manufacturer); if ($manufacturer->save()) { return response()->json(Helper::formatStandardApiResponse('success', $manufacturer, trans('admin/manufacturers/message.update.success'))); @@ -123,22 +125,17 @@ class ManufacturersController extends Controller */ public function destroy($id) { - $this->authorize('delete', Manufacturer::class); $manufacturer = Manufacturer::findOrFail($id); $this->authorize('delete', $manufacturer); if ($manufacturer->isDeletable()) { $manufacturer->delete(); - return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/manufacturers/message.delete.success'))); + + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/manufacturers/message.delete.success'))); } - return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/manufacturers/message.assoc_users'))); - - - - - + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/manufacturers/message.assoc_users'))); } /** @@ -147,11 +144,9 @@ class ManufacturersController extends Controller * @author [A. Gianotto] [] * @since [v4.0.16] * @see \App\Http\Transformers\SelectlistTransformer - * */ public function selectlist(Request $request) { - $manufacturers = Manufacturer::select([ 'id', 'name', @@ -173,6 +168,5 @@ class ManufacturersController extends Controller } return (new SelectlistTransformer)->transformSelectlist($manufacturers); - } } diff --git a/app/Http/Controllers/Api/PredefinedKitsController.php b/app/Http/Controllers/Api/PredefinedKitsController.php index 6d6f2797f1..97514850f6 100644 --- a/app/Http/Controllers/Api/PredefinedKitsController.php +++ b/app/Http/Controllers/Api/PredefinedKitsController.php @@ -37,11 +37,10 @@ class PredefinedKitsController extends Controller $total = $kits->count(); $kits = $kits->skip($offset)->take($limit)->get(); + return (new PredefinedKitsTransformer)->transformPredefinedKits($kits, $total); - } - /** * Store a newly created resource in storage. * @@ -57,8 +56,8 @@ class PredefinedKitsController extends Controller if ($kit->save()) { return response()->json(Helper::formatStandardApiResponse('success', $kit, trans('admin/kits/general.create_success'))); } - return response()->json(Helper::formatStandardApiResponse('error', null, $kit->getErrors())); + return response()->json(Helper::formatStandardApiResponse('error', null, $kit->getErrors())); } /** @@ -71,10 +70,10 @@ class PredefinedKitsController extends Controller { $this->authorize('view', PredefinedKit::class); $kit = PredefinedKit::findOrFail($id); + return (new PredefinedKitsTransformer)->transformPredefinedKit($kit); } - /** * Update the specified resource in storage. * @@ -113,23 +112,20 @@ class PredefinedKitsController extends Controller $kit->accessories()->detach(); $kit->delete(); - return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/kits/general.delete_success'))); // TODO: trans + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/kits/general.delete_success'))); // TODO: trans } - /** * Gets a paginated collection for the select2 menus * * @see \App\Http\Transformers\SelectlistTransformer - * */ public function selectlist(Request $request) { - $kits = PredefinedKit::select([ 'id', - 'name' + 'name', ]); if ($request->filled('search')) { @@ -139,7 +135,6 @@ class PredefinedKitsController extends Controller $kits = $kits->orderBy('name', 'ASC')->paginate(50); return (new SelectlistTransformer)->transformSelectlist($kits); - } /** @@ -148,38 +143,40 @@ class PredefinedKitsController extends Controller * @param int $id * @return \Illuminate\Http\Response */ - public function indexLicenses($kit_id) { + public function indexLicenses($kit_id) + { $this->authorize('view', PredefinedKit::class); $kit = PredefinedKit::findOrFail($kit_id); $licenses = $kit->licenses; + return (new PredefinedKitsTransformer)->transformElements($licenses, $licenses->count()); } - /** * Store the specified resource. * * @param int $id * @return \Illuminate\Http\Response */ - public function storeLicense(Request $request, $kit_id) - { - $this->authorize('update', PredefinedKit::class); - - $kit = PredefinedKit::findOrFail($kit_id); - $quantity = $request->input('quantity', 1); - if( $quantity < 1) { - $quantity = 1; - } + public function storeLicense(Request $request, $kit_id) + { + $this->authorize('update', PredefinedKit::class); - $license_id = $request->get('license'); - $relation = $kit->licenses(); - if( $relation->find($license_id) ) { - return response()->json(Helper::formatStandardApiResponse('error', null, ['license' => 'License already attached to kit'])); - } + $kit = PredefinedKit::findOrFail($kit_id); + $quantity = $request->input('quantity', 1); + if ($quantity < 1) { + $quantity = 1; + } - $relation->attach( $license_id, ['quantity' => $quantity]); - return response()->json(Helper::formatStandardApiResponse('success', $kit, 'License added successfull')); // TODO: trans + $license_id = $request->get('license'); + $relation = $kit->licenses(); + if ($relation->find($license_id)) { + return response()->json(Helper::formatStandardApiResponse('error', null, ['license' => 'License already attached to kit'])); + } + + $relation->attach($license_id, ['quantity' => $quantity]); + + return response()->json(Helper::formatStandardApiResponse('success', $kit, 'License added successfull')); // TODO: trans } /** @@ -189,20 +186,20 @@ class PredefinedKitsController extends Controller * @param int $kit_id * @return \Illuminate\Http\Response */ - public function updateLicense(Request $request, $kit_id, $license_id) - { - $this->authorize('update', PredefinedKit::class); - $kit = PredefinedKit::findOrFail($kit_id); - $quantity = $request->input('quantity', 1); - if( $quantity < 1) { - $quantity = 1; - } - $kit->licenses()->syncWithoutDetaching([$license_id => ['quantity' => $quantity]]); - - return response()->json(Helper::formatStandardApiResponse('success', $kit, 'License updated')); // TODO: trans - } + public function updateLicense(Request $request, $kit_id, $license_id) + { + $this->authorize('update', PredefinedKit::class); + $kit = PredefinedKit::findOrFail($kit_id); + $quantity = $request->input('quantity', 1); + if ($quantity < 1) { + $quantity = 1; + } + $kit->licenses()->syncWithoutDetaching([$license_id => ['quantity' => $quantity]]); - /** + return response()->json(Helper::formatStandardApiResponse('success', $kit, 'License updated')); // TODO: trans + } + + /** * Remove the specified resource from storage. * * @param int $kit_id @@ -214,48 +211,49 @@ class PredefinedKitsController extends Controller $kit = PredefinedKit::findOrFail($kit_id); $kit->licenses()->detach($license_id); - return response()->json(Helper::formatStandardApiResponse('success', $kit, trans('admin/kits/general.delete_success'))); + + return response()->json(Helper::formatStandardApiResponse('success', $kit, trans('admin/kits/general.delete_success'))); } - + /** * Display the specified resource. * * @param int $kit_id * @return \Illuminate\Http\Response */ - public function indexModels($kit_id) { + public function indexModels($kit_id) + { $this->authorize('view', PredefinedKit::class); $kit = PredefinedKit::findOrFail($kit_id); $models = $kit->models; + return (new PredefinedKitsTransformer)->transformElements($models, $models->count()); } - + /** * Store the specified resource. * * @param int $id * @return \Illuminate\Http\Response */ - public function storeModel(Request $request, $kit_id) - { - - + public function storeModel(Request $request, $kit_id) + { $this->authorize('update', PredefinedKit::class); - - $kit = PredefinedKit::findOrFail($kit_id); - + + $kit = PredefinedKit::findOrFail($kit_id); + $model_id = $request->get('model'); $quantity = $request->input('quantity', 1); - if( $quantity < 1) { + if ($quantity < 1) { $quantity = 1; } - + $relation = $kit->models(); - if( $relation->find($model_id) ) { + if ($relation->find($model_id)) { return response()->json(Helper::formatStandardApiResponse('error', null, ['model' => 'Model already attached to kit'])); } $relation->attach($model_id, ['quantity' => $quantity]); - + return response()->json(Helper::formatStandardApiResponse('success', $kit, 'Model added successfull')); } @@ -266,20 +264,20 @@ class PredefinedKitsController extends Controller * @param int $kit_id * @return \Illuminate\Http\Response */ - public function updateModel(Request $request, $kit_id, $model_id) - { - $this->authorize('update', PredefinedKit::class); - $kit = PredefinedKit::findOrFail($kit_id); - $quantity = $request->input('quantity', 1); - if( $quantity < 1) { - $quantity = 1; - } - $kit->models()->syncWithoutDetaching([$model_id => ['quantity' => $quantity]]); - - return response()->json(Helper::formatStandardApiResponse('success', $kit, 'License updated')); // TODO: trans - } + public function updateModel(Request $request, $kit_id, $model_id) + { + $this->authorize('update', PredefinedKit::class); + $kit = PredefinedKit::findOrFail($kit_id); + $quantity = $request->input('quantity', 1); + if ($quantity < 1) { + $quantity = 1; + } + $kit->models()->syncWithoutDetaching([$model_id => ['quantity' => $quantity]]); - /** + return response()->json(Helper::formatStandardApiResponse('success', $kit, 'License updated')); // TODO: trans + } + + /** * Remove the specified resource from storage. * * @param int $kit_id @@ -291,49 +289,50 @@ class PredefinedKitsController extends Controller $kit = PredefinedKit::findOrFail($kit_id); $kit->models()->detach($model_id); - return response()->json(Helper::formatStandardApiResponse('success', $kit, trans('admin/kits/general.model_removed_success'))); + + return response()->json(Helper::formatStandardApiResponse('success', $kit, trans('admin/kits/general.model_removed_success'))); } - - /** * Display the specified resource. * * @param int $kit_id * @return \Illuminate\Http\Response */ - public function indexConsumables($kit_id) { + public function indexConsumables($kit_id) + { $this->authorize('view', PredefinedKit::class); $kit = PredefinedKit::findOrFail($kit_id); $consumables = $kit->consumables; + return (new PredefinedKitsTransformer)->transformElements($consumables, $consumables->count()); } - /** * Store the specified resource. * * @param int $id * @return \Illuminate\Http\Response */ - public function storeConsumable(Request $request, $kit_id) - { - $this->authorize('update', PredefinedKit::class); - - $kit = PredefinedKit::findOrFail($kit_id); - $quantity = $request->input('quantity', 1); - if( $quantity < 1) { - $quantity = 1; - } + public function storeConsumable(Request $request, $kit_id) + { + $this->authorize('update', PredefinedKit::class); - $consumable_id = $request->get('consumable'); - $relation = $kit->consumables(); - if( $relation->find($consumable_id) ) { - return response()->json(Helper::formatStandardApiResponse('error', null, ['consumable' => 'Consumable already attached to kit'])); - } + $kit = PredefinedKit::findOrFail($kit_id); + $quantity = $request->input('quantity', 1); + if ($quantity < 1) { + $quantity = 1; + } - $relation->attach( $consumable_id, ['quantity' => $quantity]); - return response()->json(Helper::formatStandardApiResponse('success', $kit, 'Consumable added successfull')); // TODO: trans + $consumable_id = $request->get('consumable'); + $relation = $kit->consumables(); + if ($relation->find($consumable_id)) { + return response()->json(Helper::formatStandardApiResponse('error', null, ['consumable' => 'Consumable already attached to kit'])); + } + + $relation->attach($consumable_id, ['quantity' => $quantity]); + + return response()->json(Helper::formatStandardApiResponse('success', $kit, 'Consumable added successfull')); // TODO: trans } /** @@ -343,20 +342,20 @@ class PredefinedKitsController extends Controller * @param int $kit_id * @return \Illuminate\Http\Response */ - public function updateConsumable(Request $request, $kit_id, $consumable_id) - { - $this->authorize('update', PredefinedKit::class); - $kit = PredefinedKit::findOrFail($kit_id); - $quantity = $request->input('quantity', 1); - if( $quantity < 1) { - $quantity = 1; - } - $kit->consumables()->syncWithoutDetaching([$consumable_id => ['quantity' => $quantity]]); - - return response()->json(Helper::formatStandardApiResponse('success', $kit, 'Consumable updated')); // TODO: trans - } + public function updateConsumable(Request $request, $kit_id, $consumable_id) + { + $this->authorize('update', PredefinedKit::class); + $kit = PredefinedKit::findOrFail($kit_id); + $quantity = $request->input('quantity', 1); + if ($quantity < 1) { + $quantity = 1; + } + $kit->consumables()->syncWithoutDetaching([$consumable_id => ['quantity' => $quantity]]); - /** + return response()->json(Helper::formatStandardApiResponse('success', $kit, 'Consumable updated')); // TODO: trans + } + + /** * Remove the specified resource from storage. * * @param int $kit_id @@ -368,48 +367,50 @@ class PredefinedKitsController extends Controller $kit = PredefinedKit::findOrFail($kit_id); $kit->consumables()->detach($consumable_id); - return response()->json(Helper::formatStandardApiResponse('success', $kit, 'Delete was successfull')); // TODO: trans + + return response()->json(Helper::formatStandardApiResponse('success', $kit, 'Delete was successfull')); // TODO: trans } - /** * Display the specified resource. * * @param int $kit_id * @return \Illuminate\Http\Response */ - public function indexAccessories($kit_id) { + public function indexAccessories($kit_id) + { $this->authorize('view', PredefinedKit::class); $kit = PredefinedKit::findOrFail($kit_id); $accessories = $kit->accessories; + return (new PredefinedKitsTransformer)->transformElements($accessories, $accessories->count()); } - /** * Store the specified resource. * * @param int $kit_id * @return \Illuminate\Http\Response */ - public function storeAccessory(Request $request, $kit_id) - { - $this->authorize('update', PredefinedKit::class); - - $kit = PredefinedKit::findOrFail($kit_id); - $quantity = $request->input('quantity', 1); - if( $quantity < 1) { - $quantity = 1; - } + public function storeAccessory(Request $request, $kit_id) + { + $this->authorize('update', PredefinedKit::class); - $accessory_id = $request->get('accessory'); - $relation = $kit->accessories(); - if( $relation->find($accessory_id) ) { - return response()->json(Helper::formatStandardApiResponse('error', null, ['accessory' => 'Accessory already attached to kit'])); - } + $kit = PredefinedKit::findOrFail($kit_id); + $quantity = $request->input('quantity', 1); + if ($quantity < 1) { + $quantity = 1; + } - $relation->attach( $accessory_id, ['quantity' => $quantity]); - return response()->json(Helper::formatStandardApiResponse('success', $kit, 'Accessory added successfull')); // TODO: trans + $accessory_id = $request->get('accessory'); + $relation = $kit->accessories(); + if ($relation->find($accessory_id)) { + return response()->json(Helper::formatStandardApiResponse('error', null, ['accessory' => 'Accessory already attached to kit'])); + } + + $relation->attach($accessory_id, ['quantity' => $quantity]); + + return response()->json(Helper::formatStandardApiResponse('success', $kit, 'Accessory added successfull')); // TODO: trans } /** @@ -419,20 +420,20 @@ class PredefinedKitsController extends Controller * @param int $kit_id * @return \Illuminate\Http\Response */ - public function updateAccessory(Request $request, $kit_id, $accessory_id) - { - $this->authorize('update', PredefinedKit::class); - $kit = PredefinedKit::findOrFail($kit_id); - $quantity = $request->input('quantity', 1); - if( $quantity < 1) { - $quantity = 1; - } - $kit->accessories()->syncWithoutDetaching([$accessory_id => ['quantity' => $quantity]]); - - return response()->json(Helper::formatStandardApiResponse('success', $kit, 'Accessory updated')); // TODO: trans - } + public function updateAccessory(Request $request, $kit_id, $accessory_id) + { + $this->authorize('update', PredefinedKit::class); + $kit = PredefinedKit::findOrFail($kit_id); + $quantity = $request->input('quantity', 1); + if ($quantity < 1) { + $quantity = 1; + } + $kit->accessories()->syncWithoutDetaching([$accessory_id => ['quantity' => $quantity]]); - /** + return response()->json(Helper::formatStandardApiResponse('success', $kit, 'Accessory updated')); // TODO: trans + } + + /** * Remove the specified resource from storage. * * @param int $kit_id @@ -444,6 +445,7 @@ class PredefinedKitsController extends Controller $kit = PredefinedKit::findOrFail($kit_id); $kit->accessories()->detach($accessory_id); - return response()->json(Helper::formatStandardApiResponse('success', $kit, 'Delete was successfull')); // TODO: trans + + return response()->json(Helper::formatStandardApiResponse('success', $kit, 'Delete was successfull')); // TODO: trans } } diff --git a/app/Http/Controllers/Api/ProfileController.php b/app/Http/Controllers/Api/ProfileController.php index f6c31d5db1..fd98225320 100644 --- a/app/Http/Controllers/Api/ProfileController.php +++ b/app/Http/Controllers/Api/ProfileController.php @@ -15,7 +15,7 @@ class ProfileController extends Controller * @author [A. Gianotto] [] * @since [v4.3.0] * - * @return Array + * @return array */ public function requestedAssets() { @@ -24,7 +24,6 @@ class ProfileController extends Controller $results = []; $results['total'] = $checkoutRequests->count(); - foreach ($checkoutRequests as $checkoutRequest) { // Make sure the asset and request still exist @@ -39,10 +38,8 @@ class ProfileController extends Controller 'request_date' => Helper::getFormattedDateObject($checkoutRequest->created_at, 'datetime'), ]; } - } + return $results; } - - } diff --git a/app/Http/Controllers/Api/ReportsController.php b/app/Http/Controllers/Api/ReportsController.php index ba88d6acc3..1406dba791 100644 --- a/app/Http/Controllers/Api/ReportsController.php +++ b/app/Http/Controllers/Api/ReportsController.php @@ -19,25 +19,25 @@ class ReportsController extends Controller public function index(Request $request) { $this->authorize('reports.view'); - - $actionlogs = Actionlog::with('item', 'user', 'target','location'); + + $actionlogs = Actionlog::with('item', 'user', 'target', 'location'); if ($request->filled('search')) { $actionlogs = $actionlogs->TextSearch(e($request->input('search'))); } - if (($request->filled('target_type')) && ($request->filled('target_id'))) { - $actionlogs = $actionlogs->where('target_id','=',$request->input('target_id')) - ->where('target_type','=',"App\\Models\\".ucwords($request->input('target_type'))); + if (($request->filled('target_type')) && ($request->filled('target_id'))) { + $actionlogs = $actionlogs->where('target_id', '=', $request->input('target_id')) + ->where('target_type', '=', 'App\\Models\\'.ucwords($request->input('target_type'))); } - if (($request->filled('item_type')) && ($request->filled('item_id'))) { - $actionlogs = $actionlogs->where('item_id','=',$request->input('item_id')) - ->where('item_type','=',"App\\Models\\".ucwords($request->input('item_type'))); + if (($request->filled('item_type')) && ($request->filled('item_id'))) { + $actionlogs = $actionlogs->where('item_id', '=', $request->input('item_id')) + ->where('item_type', '=', 'App\\Models\\'.ucwords($request->input('item_type'))); } if ($request->filled('action_type')) { - $actionlogs = $actionlogs->where('action_type','=',$request->input('action_type'))->orderBy('created_at', 'desc'); + $actionlogs = $actionlogs->where('action_type', '=', $request->input('action_type'))->orderBy('created_at', 'desc'); } if ($request->filled('uploads')) { @@ -51,9 +51,9 @@ class ReportsController extends Controller 'user_id', 'accept_signature', 'action_type', - 'note' + 'note', ]; - + $sort = in_array($request->input('sort'), $allowed_columns) ? e($request->input('sort')) : 'created_at'; $order = ($request->input('order') == 'asc') ? 'asc' : 'desc'; $offset = request('offset', 0); @@ -62,6 +62,5 @@ class ReportsController extends Controller $actionlogs = $actionlogs->orderBy($sort, $order)->skip($offset)->take($limit)->get(); return response()->json((new ActionlogsTransformer)->transformActionlogs($actionlogs, $total), 200, ['Content-Type' => 'application/json;charset=utf8'], JSON_UNESCAPED_UNICODE); - } } diff --git a/app/Http/Controllers/Api/SettingsController.php b/app/Http/Controllers/Api/SettingsController.php index 462c685361..852530c207 100644 --- a/app/Http/Controllers/Api/SettingsController.php +++ b/app/Http/Controllers/Api/SettingsController.php @@ -4,60 +4,59 @@ namespace App\Http\Controllers\Api; use App\Http\Controllers\Controller; use App\Http\Transformers\LoginAttemptsTransformer; +use App\Models\Ldap; use App\Models\Setting; use App\Notifications\MailTest; use App\Services\LdapAd; +use GuzzleHttp\Client; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Http\Response; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Notification; -use GuzzleHttp\Client; use Illuminate\Support\Facades\Storage; -use Illuminate\Support\Facades\Validator; -use App\Models\Ldap; // forward-port of v4 LDAP model for Sync - +use Illuminate\Support\Facades\Validator; // forward-port of v4 LDAP model for Sync class SettingsController extends Controller { - /** * Test the ldap settings - * + * * @author Wes Hulette - * + * * @since 5.0.0 - * + * * @param App\Models\LdapAd $ldap - * + * * @return \Illuminate\Http\JsonResponse */ public function ldapAdSettingsTest(LdapAd $ldap): JsonResponse { - if(!$ldap->init()) { + if (! $ldap->init()) { Log::info('LDAP is not enabled so we cannot test.'); + return response()->json(['message' => 'LDAP is not enabled, cannot test.'], 400); } // The connect, bind and resulting users message $message = []; - // This is all kinda fucked right now. The connection test doesn't actually do what you think, // // and the way we parse the errors - // on the JS side is horrible. + // on the JS side is horrible. Log::info('Preparing to test LDAP user login'); // Test user can connect to the LDAP server try { $ldap->testLdapAdUserConnection(); $message['login'] = [ - 'message' => 'Successfully connected to LDAP server.' + 'message' => 'Successfully connected to LDAP server.', ]; } catch (\Exception $ex) { - \Log::debug('Connection to LDAP server '.Setting::getSettings()->ldap_server.' failed. Please check your LDAP settings and try again. Server Responded with error: ' . $ex->getMessage()); + \Log::debug('Connection to LDAP server '.Setting::getSettings()->ldap_server.' failed. Please check your LDAP settings and try again. Server Responded with error: '.$ex->getMessage()); + return response()->json( - ['message' => 'Connection to LDAP server '.Setting::getSettings()->ldap_server." failed. Verify that the LDAP hostname is entered correctly and that it can be reached from this web server. \n\nServer Responded with error: " . $ex->getMessage() + ['message' => 'Connection to LDAP server '.Setting::getSettings()->ldap_server." failed. Verify that the LDAP hostname is entered correctly and that it can be reached from this web server. \n\nServer Responded with error: ".$ex->getMessage(), ], 400); } @@ -68,15 +67,15 @@ class SettingsController extends Controller Log::info('Testing Bind'); $ldap->testLdapAdBindConnection(); $message['bind'] = [ - 'message' => 'Successfully bound to LDAP server.' + 'message' => 'Successfully bound to LDAP server.', ]; } catch (\Exception $ex) { Log::info('LDAP Bind failed'); - return response()->json(['message' => 'Connection to LDAP successful, but we were unable to Bind the LDAP user '.Setting::getSettings()->ldap_uname.". Verify your that your LDAP Bind username and password are correct. \n\nServer Responded with error: " . $ex->getMessage() + + return response()->json(['message' => 'Connection to LDAP successful, but we were unable to Bind the LDAP user '.Setting::getSettings()->ldap_uname.". Verify your that your LDAP Bind username and password are correct. \n\nServer Responded with error: ".$ex->getMessage(), ], 400); } - Log::info('Preparing to get sample user set from LDAP directory'); // Get a sample of 10 users so user can verify the data is correct $settings = Setting::getSettings(); @@ -96,21 +95,22 @@ class SettingsController extends Controller ]; }); if ($users->count() > 0) { - $message['user_sync'] = [ - 'users' => $users + $message['user_sync'] = [ + 'users' => $users, ]; } else { - $message['user_sync'] = [ - 'message' => 'Connection to LDAP was successful, however there were no users returned from your query. You should confirm the Base Bind DN above.' + $message['user_sync'] = [ + 'message' => 'Connection to LDAP was successful, however there were no users returned from your query. You should confirm the Base Bind DN above.', ]; + return response()->json($message, 400); } - } catch (\Exception $ex) { Log::info('LDAP sync failed'); - $message['user_sync'] = [ - 'message' => 'Error getting users from LDAP directory, error: ' . $ex->getMessage() + $message['user_sync'] = [ + 'message' => 'Error getting users from LDAP directory, error: '.$ex->getMessage(), ]; + return response()->json($message, 400); } @@ -119,25 +119,24 @@ class SettingsController extends Controller public function ldaptestlogin(Request $request, LdapAd $ldap) { - - if (Setting::getSettings()->ldap_enabled!='1') { + if (Setting::getSettings()->ldap_enabled != '1') { \Log::debug('LDAP is not enabled. Cannot test.'); + return response()->json(['message' => 'LDAP is not enabled, cannot test.'], 400); } - - $rules = array( + $rules = [ 'ldaptest_user' => 'required', - 'ldaptest_password' => 'required' - ); + 'ldaptest_password' => 'required', + ]; $validator = Validator::make($request->all(), $rules); if ($validator->fails()) { \Log::debug('LDAP Validation test failed.'); - $validation_errors = implode(' ',$validator->errors()->all()); + $validation_errors = implode(' ', $validator->errors()->all()); + return response()->json(['message' => $validator->errors()->all()], 400); } - \Log::debug('Preparing to test LDAP login'); try { @@ -147,52 +146,48 @@ class SettingsController extends Controller // can't do this because that's a protected property. $results = $ldap->ldapLogin($request->input('ldaptest_user'), $request->input('ldaptest_password')); // this would normally create a user on success (if they didn't already exist), but for the transaction - if($results) { - return response()->json(['message' => 'It worked! '. $request->input('ldaptest_user').' successfully binded to LDAP.'], 200); + if ($results) { + return response()->json(['message' => 'It worked! '.$request->input('ldaptest_user').' successfully binded to LDAP.'], 200); } else { - return response()->json(['message' => 'Login Failed. '. $request->input('ldaptest_user').' did not successfully bind to LDAP.'], 400); + return response()->json(['message' => 'Login Failed. '.$request->input('ldaptest_user').' did not successfully bind to LDAP.'], 400); } } catch (\Exception $e) { \Log::debug('Connection failed'); + return response()->json(['message' => $e->getMessage()], 400); } finally { DB::rollBack(); // ALWAYS rollback, whether success or failure } - - } public function slacktest(Request $request) { - $slack = new Client([ 'base_url' => e($request->input('slack_endpoint')), 'defaults' => [ - 'exceptions' => false - ] + 'exceptions' => false, + ], ]); - $payload = json_encode( [ 'channel' => e($request->input('slack_channel')), 'text' => trans('general.slack_test_msg'), 'username' => e($request->input('slack_botname')), - 'icon_emoji' => ':heart:' + 'icon_emoji' => ':heart:', ]); try { - $slack->post($request->input('slack_endpoint'),['body' => $payload]); + $slack->post($request->input('slack_endpoint'), ['body' => $payload]); + return response()->json(['message' => 'Success'], 200); } catch (\Exception $e) { return response()->json(['message' => 'Oops! Please check the channel name and webhook endpoint URL. Slack responded with: '.$e->getMessage()], 400); } return response()->json(['message' => 'Something went wrong :( '], 400); - } - /** * Test the email configuration * @@ -202,19 +197,19 @@ class SettingsController extends Controller */ public function ajaxTestEmail() { - if (!config('app.lock_passwords')) { + if (! config('app.lock_passwords')) { try { Notification::send(Setting::first(), new MailTest()); + return response()->json(['message' => 'Mail sent to '.config('mail.reply_to.address')], 200); } catch (\Exception $e) { return response()->json(['message' => $e->getMessage()], 500); } } + return response()->json(['message' => 'Mail would have been sent, but this application is in demo mode! '], 200); - } - /** * Delete server-cached barcodes * @@ -224,23 +219,20 @@ class SettingsController extends Controller */ public function purgeBarcodes() { - $file_count = 0; $files = Storage::disk('public')->files('barcodes'); foreach ($files as $file) { // iterate files - $file_parts = explode(".", $file); + $file_parts = explode('.', $file); $extension = end($file_parts); \Log::debug($extension); // Only generated barcodes would have a .png file extension - if ($extension =='png') { - + if ($extension == 'png') { \Log::debug('Deleting: '.$file); - - try { + try { Storage::disk('public')->delete($file); \Log::debug('Deleting: '.$file); $file_count++; @@ -248,17 +240,11 @@ class SettingsController extends Controller \Log::debug($e); } } - } return response()->json(['message' => 'Deleted '.$file_count.' barcodes'], 200); - } - - - - /** * Get a list of login attempts * @@ -269,20 +255,16 @@ class SettingsController extends Controller */ public function showLoginAttempts(Request $request) { - $allowed_columns = ['id', 'username', 'remote_ip', 'user_agent','successful','created_at']; + $allowed_columns = ['id', 'username', 'remote_ip', 'user_agent', 'successful', 'created_at']; - $login_attempts = DB::table('login_attempts'); + $login_attempts = DB::table('login_attempts'); $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; $sort = in_array($request->get('sort'), $allowed_columns) ? $request->get('sort') : 'created_at'; $total = $login_attempts->count(); $login_attempts->orderBy($sort, $order); - $login_attempt_results = $login_attempts->skip(request('offset', 0))->take(request('limit', 20))->get(); + $login_attempt_results = $login_attempts->skip(request('offset', 0))->take(request('limit', 20))->get(); return (new LoginAttemptsTransformer)->transformLoginAttempts($login_attempt_results, $total); - } - - - } diff --git a/app/Http/Controllers/Api/StatuslabelsController.php b/app/Http/Controllers/Api/StatuslabelsController.php index 567159c58f..08025567b2 100644 --- a/app/Http/Controllers/Api/StatuslabelsController.php +++ b/app/Http/Controllers/Api/StatuslabelsController.php @@ -22,7 +22,7 @@ class StatuslabelsController extends Controller public function index(Request $request) { $this->authorize('view', Statuslabel::class); - $allowed_columns = ['id','name','created_at', 'assets_count','color','default_label']; + $allowed_columns = ['id', 'name', 'created_at', 'assets_count', 'color', 'notes', 'default_label']; $statuslabels = Statuslabel::withCount('assets as assets_count'); @@ -43,6 +43,7 @@ class StatuslabelsController extends Controller $total = $statuslabels->count(); $statuslabels = $statuslabels->skip($offset)->take($limit)->get(); + return (new StatuslabelsTransformer)->transformStatuslabels($statuslabels, $total); } @@ -58,25 +59,29 @@ class StatuslabelsController extends Controller public function store(Request $request) { $this->authorize('create', Statuslabel::class); - $request->except('deployable', 'pending','archived'); + $request->except('deployable', 'pending', 'archived'); - if (!$request->filled('type')) { - return response()->json(Helper::formatStandardApiResponse('error', null, ["type" => ["Status label type is required."]]),500); + if (! $request->filled('type')) { + return response()->json(Helper::formatStandardApiResponse('error', null, ['type' => ['Status label type is required.']]), 500); } $statuslabel = new Statuslabel; $statuslabel->fill($request->all()); $statusType = Statuslabel::getStatuslabelTypesForDB($request->input('type')); - $statuslabel->deployable = $statusType['deployable']; - $statuslabel->pending = $statusType['pending']; - $statuslabel->archived = $statusType['archived']; + $statuslabel->deployable = $statusType['deployable']; + $statuslabel->pending = $statusType['pending']; + $statuslabel->archived = $statusType['archived']; + $statuslabel->color = $request->input('color'); + $statuslabel->show_in_nav = $request->input('show_in_nav', 0); + $statuslabel->default_label = $request->input('default_label', 0); + if ($statuslabel->save()) { return response()->json(Helper::formatStandardApiResponse('success', $statuslabel, trans('admin/statuslabels/message.create.success'))); } - return response()->json(Helper::formatStandardApiResponse('error', null, $statuslabel->getErrors())); + return response()->json(Helper::formatStandardApiResponse('error', null, $statuslabel->getErrors())); } /** @@ -91,10 +96,10 @@ class StatuslabelsController extends Controller { $this->authorize('view', Statuslabel::class); $statuslabel = Statuslabel::findOrFail($id); + return (new StatuslabelsTransformer)->transformStatuslabel($statuslabel); } - /** * Update the specified resource in storage. * @@ -109,18 +114,21 @@ class StatuslabelsController extends Controller $this->authorize('update', Statuslabel::class); $statuslabel = Statuslabel::findOrFail($id); - $request->except('deployable', 'pending','archived'); + $request->except('deployable', 'pending', 'archived'); - if (!$request->filled('type')) { + if (! $request->filled('type')) { return response()->json(Helper::formatStandardApiResponse('error', null, 'Status label type is required.')); } $statuslabel->fill($request->all()); $statusType = Statuslabel::getStatuslabelTypesForDB($request->input('type')); - $statuslabel->deployable = $statusType['deployable']; - $statuslabel->pending = $statusType['pending']; - $statuslabel->archived = $statusType['archived']; + $statuslabel->deployable = $statusType['deployable']; + $statuslabel->pending = $statusType['pending']; + $statuslabel->archived = $statusType['archived']; + $statuslabel->color = $request->input('color'); + $statuslabel->show_in_nav = $request->input('show_in_nav', 0); + $statuslabel->default_label = $request->input('default_label', 0); if ($statuslabel->save()) { return response()->json(Helper::formatStandardApiResponse('success', $statuslabel, trans('admin/statuslabels/message.update.success'))); @@ -146,15 +154,13 @@ class StatuslabelsController extends Controller // Check that there are no assets associated if ($statuslabel->assets()->count() == 0) { $statuslabel->delete(); - return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/statuslabels/message.delete.success'))); + + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/statuslabels/message.delete.success'))); } return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/statuslabels/message.assoc_assets'))); - } - - /** * Show a count of assets by status label for pie chart * @@ -162,44 +168,40 @@ class StatuslabelsController extends Controller * @since [v3.0] * @return \Illuminate\Http\Response */ - public function getAssetCountByStatuslabel() { $this->authorize('view', Statuslabel::class); - $statuslabels = Statuslabel::with('assets') - ->groupBy('id') - ->withCount('assets as assets_count') - ->get(); + $statuslabels = Statuslabel::withCount('assets')->get(); - $labels=[]; - $points=[]; + $labels = []; + $points = []; $default_color_count = 0; - $colors_array = array(); + $colors_array = []; foreach ($statuslabels as $statuslabel) { if ($statuslabel->assets_count > 0) { + $labels[] = $statuslabel->name.' ('.number_format($statuslabel->assets_count).')'; + $points[] = $statuslabel->assets_count; - $labels[]=$statuslabel->name. ' ('.number_format($statuslabel->assets_count).')'; - $points[]=$statuslabel->assets_count; - - if ($statuslabel->color!='') { + if ($statuslabel->color != '') { $colors_array[] = $statuslabel->color; } else { $colors_array[] = Helper::defaultChartColors($default_color_count); - $default_color_count++; } + $default_color_count++; } } - $result= [ - "labels" => $labels, - "datasets" => [ [ - "data" => $points, - "backgroundColor" => $colors_array, - "hoverBackgroundColor" => $colors_array - ]] + $result = [ + 'labels' => $labels, + 'datasets' => [[ + 'data' => $points, + 'backgroundColor' => $colors_array, + 'hoverBackgroundColor' => $colors_array, + ]], ]; + return $result; } @@ -215,7 +217,7 @@ class StatuslabelsController extends Controller { $this->authorize('view', Statuslabel::class); $this->authorize('index', Asset::class); - $assets = Asset::where('status_id','=',$id)->with('assignedTo'); + $assets = Asset::where('status_id', '=', $id)->with('assignedTo'); $allowed_columns = [ 'id', @@ -245,11 +247,12 @@ class StatuslabelsController extends Controller * * @author [A. Gianotto] [] * @since [v4.0] - * @return Bool + * @return bool */ - public function checkIfDeployable($id) { + public function checkIfDeployable($id) + { $statuslabel = Statuslabel::findOrFail($id); - if ($statuslabel->getStatuslabelType()=='deployable') { + if ($statuslabel->getStatuslabelType() == 'deployable') { return '1'; } diff --git a/app/Http/Controllers/Api/SuppliersController.php b/app/Http/Controllers/Api/SuppliersController.php index 5616913ff3..e5668b6baa 100644 --- a/app/Http/Controllers/Api/SuppliersController.php +++ b/app/Http/Controllers/Api/SuppliersController.php @@ -8,6 +8,7 @@ use App\Http\Transformers\SelectlistTransformer; use App\Http\Transformers\SuppliersTransformer; use App\Models\Supplier; use Illuminate\Http\Request; +use App\Http\Requests\ImageUploadRequest; use Illuminate\Support\Facades\Storage; class SuppliersController extends Controller @@ -22,10 +23,10 @@ class SuppliersController extends Controller public function index(Request $request) { $this->authorize('view', Supplier::class); - $allowed_columns = ['id','name','address','phone','contact','fax','email','image','assets_count','licenses_count', 'accessories_count','url']; + $allowed_columns = ['id', 'name', 'address', 'phone', 'contact', 'fax', 'email', 'image', 'assets_count', 'licenses_count', 'accessories_count', 'url']; $suppliers = Supplier::select( - array('id','name','address','address2','city','state','country','fax', 'phone','email','contact','created_at','updated_at','deleted_at','image','notes') + ['id', 'name', 'address', 'address2', 'city', 'state', 'country', 'fax', 'phone', 'email', 'contact', 'created_at', 'updated_at', 'deleted_at', 'image', 'notes'] )->withCount('assets as assets_count')->withCount('licenses as licenses_count')->withCount('accessories as accessories_count'); @@ -46,6 +47,7 @@ class SuppliersController extends Controller $total = $suppliers->count(); $suppliers = $suppliers->skip($offset)->take($limit)->get(); + return (new SuppliersTransformer)->transformSuppliers($suppliers, $total); } @@ -55,20 +57,21 @@ class SuppliersController extends Controller * * @author [A. Gianotto] [] * @since [v4.0] - * @param \Illuminate\Http\Request $request + * @param \App\Http\Requests\ImageUploadRequest $request * @return \Illuminate\Http\Response */ - public function store(Request $request) + public function store(ImageUploadRequest $request) { $this->authorize('create', Supplier::class); $supplier = new Supplier; $supplier->fill($request->all()); + $supplier = $request->handleImages($supplier); if ($supplier->save()) { return response()->json(Helper::formatStandardApiResponse('success', $supplier, trans('admin/suppliers/message.create.success'))); } - return response()->json(Helper::formatStandardApiResponse('error', null, $supplier->getErrors())); + return response()->json(Helper::formatStandardApiResponse('error', null, $supplier->getErrors())); } /** @@ -83,24 +86,25 @@ class SuppliersController extends Controller { $this->authorize('view', Supplier::class); $supplier = Supplier::findOrFail($id); + return (new SuppliersTransformer)->transformSupplier($supplier); } - /** * Update the specified resource in storage. * * @author [A. Gianotto] [] * @since [v4.0] - * @param \Illuminate\Http\Request $request + * @param \App\Http\Requests\ImageUploadRequest $request * @param int $id * @return \Illuminate\Http\Response */ - public function update(Request $request, $id) + public function update(ImageUploadRequest $request, $id) { $this->authorize('update', Supplier::class); $supplier = Supplier::findOrFail($id); $supplier->fill($request->all()); + $supplier = $request->handleImages($supplier); if ($supplier->save()) { return response()->json(Helper::formatStandardApiResponse('success', $supplier, trans('admin/suppliers/message.update.success'))); @@ -120,16 +124,15 @@ class SuppliersController extends Controller public function destroy($id) { $this->authorize('delete', Supplier::class); - $supplier = Supplier::with('asset_maintenances', 'assets', 'licenses')->withCount('asset_maintenances as asset_maintenances_count','assets as assets_count', 'licenses as licenses_count')->findOrFail($id); + $supplier = Supplier::with('asset_maintenances', 'assets', 'licenses')->withCount('asset_maintenances as asset_maintenances_count', 'assets as assets_count', 'licenses as licenses_count')->findOrFail($id); $this->authorize('delete', $supplier); - if ($supplier->assets_count > 0) { - return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/suppliers/message.delete.assoc_assets', ['asset_count' => (int) $supplier->assets_count]))); + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/suppliers/message.delete.assoc_assets', ['asset_count' => (int) $supplier->assets_count]))); } if ($supplier->asset_maintenances_count > 0) { - return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/suppliers/message.delete.assoc_maintenances', ['asset_maintenances_count' => $supplier->asset_maintenances_count]))); + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/suppliers/message.delete.assoc_maintenances', ['asset_maintenances_count' => $supplier->asset_maintenances_count]))); } if ($supplier->licenses_count > 0) { @@ -137,8 +140,8 @@ class SuppliersController extends Controller } $supplier->delete(); - return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/suppliers/message.delete.success'))); + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/suppliers/message.delete.success'))); } /** @@ -147,11 +150,9 @@ class SuppliersController extends Controller * @author [A. Gianotto] [] * @since [v4.0.16] * @see \App\Http\Transformers\SelectlistTransformer - * */ public function selectlist(Request $request) { - $suppliers = Supplier::select([ 'id', 'name', @@ -173,7 +174,5 @@ class SuppliersController extends Controller } return (new SelectlistTransformer)->transformSelectlist($suppliers); - } - } diff --git a/app/Http/Controllers/Api/UsersController.php b/app/Http/Controllers/Api/UsersController.php index b8bbf39d4d..2f9dc8cf2a 100644 --- a/app/Http/Controllers/Api/UsersController.php +++ b/app/Http/Controllers/Api/UsersController.php @@ -16,6 +16,7 @@ use App\Models\License; use App\Models\User; use Auth; use Illuminate\Http\Request; +use App\Http\Requests\ImageUploadRequest; use Illuminate\Support\Facades\Storage; class UsersController extends Controller @@ -63,17 +64,21 @@ class UsersController extends Controller 'users.zip', 'users.ldap_import', - ])->with('manager', 'groups', 'userloc', 'company', 'department','assets','licenses','accessories','consumables') - ->withCount('assets as assets_count','licenses as licenses_count','accessories as accessories_count','consumables as consumables_count'); + ])->with('manager', 'groups', 'userloc', 'company', 'department', 'assets', 'licenses', 'accessories', 'consumables') + ->withCount('assets as assets_count', 'licenses as licenses_count', 'accessories as accessories_count', 'consumables as consumables_count'); $users = Company::scopeCompanyables($users); - if (($request->filled('deleted')) && ($request->input('deleted')=='true')) { + if (($request->filled('deleted')) && ($request->input('deleted') == 'true')) { $users = $users->onlyTrashed(); - } elseif (($request->filled('all')) && ($request->input('all')=='true')) { + } elseif (($request->filled('all')) && ($request->input('all') == 'true')) { $users = $users->withTrashed(); } + if ($request->filled('activated')) { + $users = $users->where('users.activated', '=', $request->input('activated')); + } + if ($request->filled('company_id')) { $users = $users->where('users.company_id', '=', $request->input('company_id')); } @@ -90,12 +95,40 @@ class UsersController extends Controller $users = $users->where('users.username', '=', $request->input('username')); } + if ($request->filled('first_name')) { + $users = $users->where('users.first_name', '=', $request->input('first_name')); + } + + if ($request->filled('last_name')) { + $users = $users->where('users.last_name', '=', $request->input('last_name')); + } + + if ($request->filled('employee_num')) { + $users = $users->where('users.employee_num', '=', $request->input('employee_num')); + } + + if ($request->filled('state')) { + $users = $users->where('users.state', '=', $request->input('state')); + } + + if ($request->filled('country')) { + $users = $users->where('users.country', '=', $request->input('country')); + } + + if ($request->filled('zip')) { + $users = $users->where('users.zip', '=', $request->input('zip')); + } + if ($request->filled('group_id')) { $users = $users->ByGroup($request->get('group_id')); } if ($request->filled('department_id')) { - $users = $users->where('users.department_id','=',$request->input('department_id')); + $users = $users->where('users.department_id', '=', $request->input('department_id')); + } + + if ($request->filled('manager_id')) { + $users = $users->where('users.manager_id','=',$request->input('manager_id')); } if ($request->filled('search')) { @@ -129,11 +162,11 @@ class UsersController extends Controller default: $allowed_columns = [ - 'last_name','first_name','email','jobtitle','username','employee_num', - 'assets','accessories', 'consumables','licenses','groups','activated','created_at', - 'two_factor_enrolled','two_factor_optin','last_login', 'assets_count', 'licenses_count', + 'last_name', 'first_name', 'email', 'jobtitle', 'username', 'employee_num', + 'assets', 'accessories', 'consumables', 'licenses', 'groups', 'activated', 'created_at', + 'two_factor_enrolled', 'two_factor_optin', 'last_login', 'assets_count', 'licenses_count', 'consumables_count', 'accessories_count', 'phone', 'address', 'city', 'state', - 'country', 'zip', 'id', 'ldap_import' + 'country', 'zip', 'id', 'ldap_import', ]; $sort = in_array($request->get('sort'), $allowed_columns) ? $request->get('sort') : 'first_name'; @@ -141,24 +174,21 @@ class UsersController extends Controller break; } - $total = $users->count(); $users = $users->skip($offset)->take($limit)->get(); + return (new UsersTransformer)->transformUsers($users, $total); } - /** * Gets a paginated collection for the select2 menus * * @author [A. Gianotto] [] * @since [v4.0.16] * @see \App\Http\Transformers\SelectlistTransformer - * */ public function selectlist(Request $request) { - $users = User::select( [ 'users.id', @@ -185,16 +215,16 @@ class UsersController extends Controller foreach ($users as $user) { $name_str = ''; - if ($user->last_name!='') { + if ($user->last_name != '') { $name_str .= $user->last_name.', '; } $name_str .= $user->first_name; - if ($user->username!='') { + if ($user->username != '') { $name_str .= ' ('.$user->username.')'; } - if ($user->employee_num!='') { + if ($user->employee_num != '') { $name_str .= ' - #'.$user->employee_num; } @@ -203,7 +233,6 @@ class UsersController extends Controller } return (new SelectlistTransformer)->transformSelectlist($users); - } @@ -224,29 +253,30 @@ class UsersController extends Controller $user->fill($request->all()); if ($request->has('permissions')) { - $permissions_array = $request->input('permissions'); // Strip out the superuser permission if the API user isn't a superadmin - if (!Auth::user()->isSuperUser()) { + if (! Auth::user()->isSuperUser()) { unset($permissions_array['superuser']); } - $user->permissions = $permissions_array; + $user->permissions = $permissions_array; } - $tmp_pass = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 20); + $tmp_pass = substr(str_shuffle('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'), 0, 20); $user->password = bcrypt($request->get('password', $tmp_pass)); - + app('App\Http\Requests\ImageUploadRequest')->handleImages($user, 600, 'image', 'avatars', 'avatar'); + if ($user->save()) { if ($request->filled('groups')) { $user->groups()->sync($request->input('groups')); } else { - $user->groups()->sync(array()); + $user->groups()->sync([]); } - + return response()->json(Helper::formatStandardApiResponse('success', (new UsersTransformer)->transformUser($user), trans('admin/users/message.success.create'))); } + return response()->json(Helper::formatStandardApiResponse('error', null, $user->getErrors())); } @@ -260,7 +290,8 @@ class UsersController extends Controller public function show($id) { $this->authorize('view', User::class); - $user = User::withCount('assets as assets_count','licenses as licenses_count','accessories as accessories_count','consumables as consumables_count')->findOrFail($id); + $user = User::withCount('assets as assets_count', 'licenses as licenses_count', 'accessories as accessories_count', 'consumables as consumables_count')->findOrFail($id); + return (new UsersTransformer)->transformUser($user); } @@ -280,9 +311,15 @@ class UsersController extends Controller $user = User::findOrFail($id); - // This is a janky hack to prevent people from changing admin demo user data on the public demo. - // The $ids 1 and 2 are special since they are seeded as superadmins in the demo seeder. - // Thanks, jerks. You are why we can't have nice things. - snipe + /** + * This is a janky hack to prevent people from changing admin demo user data on the public demo. + * + * The $ids 1 and 2 are special since they are seeded as superadmins in the demo seeder. + * + * Thanks, jerks. You are why we can't have nice things. - snipe + * + */ + if ((($id == 1) || ($id == 2)) && (config('app.lock_passwords'))) { return response()->json(Helper::formatStandardApiResponse('error', null, 'Permission denied. You cannot update user information via API on the demo.')); @@ -290,7 +327,7 @@ class UsersController extends Controller $user->fill($request->all()); - + if ($user->id == $request->input('manager_id')) { return response()->json(Helper::formatStandardApiResponse('error', null, 'You cannot be your own manager')); } @@ -303,23 +340,24 @@ class UsersController extends Controller // here because we need to overwrite permissions // if someone needs to null them out if ($request->has('permissions')) { - $permissions_array = $request->input('permissions'); // Strip out the superuser permission if the API user isn't a superadmin - if (!Auth::user()->isSuperUser()) { + if (! Auth::user()->isSuperUser()) { unset($permissions_array['superuser']); } - $user->permissions = $permissions_array; + $user->permissions = $permissions_array; } - // Update the location of any assets checked out to this user Asset::where('assigned_type', User::class) ->where('assigned_to', $user->id)->update(['location_id' => $request->input('location_id', null)]); + + app('App\Http\Requests\ImageUploadRequest')->handleImages($user, 600, 'image', 'avatars', 'avatar'); + if ($user->save()) { // Sync group memberships: @@ -332,8 +370,8 @@ class UsersController extends Controller if ($request->filled('groups')) { $user->groups()->sync($request->input('groups')); // The groups field has been passed but it is null, so we should blank it out - } elseif ($request->has('groups')) { - $user->groups()->sync(array()); + } elseif ($request->has('groups')) { + $user->groups()->sync([]); } @@ -357,36 +395,37 @@ class UsersController extends Controller $user = User::findOrFail($id); $this->authorize('delete', $user); - if (($user->assets) && ($user->assets->count() > 0)) { - return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/users/message.error.delete_has_assets'))); + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/users/message.error.delete_has_assets'))); } if (($user->licenses) && ($user->licenses->count() > 0)) { - return response()->json(Helper::formatStandardApiResponse('error', null, 'This user still has ' . $user->licenses->count() . ' license(s) associated with them and cannot be deleted.')); + return response()->json(Helper::formatStandardApiResponse('error', null, 'This user still has '.$user->licenses->count().' license(s) associated with them and cannot be deleted.')); } if (($user->accessories) && ($user->accessories->count() > 0)) { - return response()->json(Helper::formatStandardApiResponse('error', null, 'This user still has ' . $user->accessories->count() . ' accessories associated with them.')); + return response()->json(Helper::formatStandardApiResponse('error', null, 'This user still has '.$user->accessories->count().' accessories associated with them.')); } if (($user->managedLocations()) && ($user->managedLocations()->count() > 0)) { - return response()->json(Helper::formatStandardApiResponse('error', null, 'This user still has ' . $user->managedLocations()->count() . ' locations that they manage.')); + return response()->json(Helper::formatStandardApiResponse('error', null, 'This user still has '.$user->managedLocations()->count().' locations that they manage.')); } if ($user->delete()) { // Remove the user's avatar if they have one if (Storage::disk('public')->exists('avatars/'.$user->avatar)) { - try { + try { Storage::disk('public')->delete('avatars/'.$user->avatar); } catch (\Exception $e) { \Log::debug($e); - } + } } - return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/users/message.success.delete'))); + + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/users/message.success.delete'))); } - return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/users/message.error.delete'))); + + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/users/message.error.delete'))); } /** @@ -397,12 +436,13 @@ class UsersController extends Controller * @param $userId * @return string JSON */ - public function assets($id) + public function assets(Request $request, $id) { $this->authorize('view', User::class); $this->authorize('view', Asset::class); $assets = Asset::where('assigned_to', '=', $id)->where('assigned_type', '=', User::class)->with('model')->get(); - return (new AssetsTransformer)->transformAssets($assets, $assets->count()); + + return (new AssetsTransformer)->transformAssets($assets, $assets->count(), $request); } /** @@ -419,6 +459,7 @@ class UsersController extends Controller $user = User::findOrFail($id); $this->authorize('view', Accessory::class); $accessories = $user->accessories; + return (new AccessoriesTransformer)->transformAccessories($accessories, $accessories->count()); } @@ -436,12 +477,11 @@ class UsersController extends Controller $this->authorize('view', License::class); $user = User::where('id', $id)->withTrashed()->first(); $licenses = $user->licenses()->get(); + return (new LicensesTransformer())->transformLicenses($licenses, $licenses->count()); } /** - - * Reset the user's two-factor status * * @author [A. Gianotto] [] @@ -451,7 +491,6 @@ class UsersController extends Controller */ public function postTwoFactorReset(Request $request) { - $this->authorize('update', User::class); if ($request->filled('id')) { @@ -460,6 +499,7 @@ class UsersController extends Controller $user->two_factor_secret = null; $user->two_factor_enrolled = 0; $user->save(); + return response()->json(['message' => trans('admin/settings/general.two_factor_reset_success')], 200); } catch (\Exception $e) { return response()->json(['message' => trans('admin/settings/general.two_factor_reset_error')], 500); @@ -467,6 +507,7 @@ class UsersController extends Controller } return response()->json(['message' => 'No ID provided'], 500); + } /** @@ -481,4 +522,28 @@ class UsersController extends Controller { return (new UsersTransformer)->transformUser($request->user()); } + + /** + * Restore a soft-deleted user. + * + * @author [E. Taylor] [] + * @param int $userId + * @since [v6.0.0] + * @return JsonResponse + */ + public function restore($userId = null) + { + // Get asset information + $user = User::withTrashed()->find($userId); + $this->authorize('delete', $user); + if (isset($user->id)) { + // Restore the user + User::withTrashed()->where('id', $userId)->restore(); + + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/users/message.success.restored'))); + } + + $id = $userId; + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/users/message.user_not_found', compact('id'))), 200); + } } diff --git a/app/Http/Controllers/AssetMaintenancesController.php b/app/Http/Controllers/AssetMaintenancesController.php index d05b190ba7..1ab24b768f 100644 --- a/app/Http/Controllers/AssetMaintenancesController.php +++ b/app/Http/Controllers/AssetMaintenancesController.php @@ -1,4 +1,5 @@ supplier_id = $request->input('supplier_id'); $assetMaintenance->is_warranty = $request->input('is_warranty'); - $assetMaintenance->cost = $request->input('cost'); + $assetMaintenance->cost = Helper::ParseCurrency($request->input('cost')); $assetMaintenance->notes = $request->input('notes'); $asset = Asset::find($request->input('asset_id')); - if ((!Company::isCurrentUserHasAccess($asset)) && ($asset!=null)) { + if ((! Company::isCurrentUserHasAccess($asset)) && ($asset != null)) { return static::getInsufficientPermissionsRedirect(); } // Save the asset maintenance data - $assetMaintenance->asset_id = $request->input('asset_id'); + $assetMaintenance->asset_id = $request->input('asset_id'); $assetMaintenance->asset_maintenance_type = $request->input('asset_maintenance_type'); - $assetMaintenance->title = $request->input('title'); - $assetMaintenance->start_date = $request->input('start_date'); - $assetMaintenance->completion_date = $request->input('completion_date'); - $assetMaintenance->user_id = Auth::id(); + $assetMaintenance->title = $request->input('title'); + $assetMaintenance->start_date = $request->input('start_date'); + $assetMaintenance->completion_date = $request->input('completion_date'); + $assetMaintenance->user_id = Auth::id(); - if (( $assetMaintenance->completion_date !== null ) - && ( $assetMaintenance->start_date !== "" ) - && ( $assetMaintenance->start_date !== "0000-00-00" ) + if (($assetMaintenance->completion_date !== null) + && ($assetMaintenance->start_date !== '') + && ($assetMaintenance->start_date !== '0000-00-00') ) { - $startDate = Carbon::parse($assetMaintenance->start_date); - $completionDate = Carbon::parse($assetMaintenance->completion_date); + $startDate = Carbon::parse($assetMaintenance->start_date); + $completionDate = Carbon::parse($assetMaintenance->completion_date); $assetMaintenance->asset_maintenance_time = $completionDate->diffInDays($startDate); } @@ -133,7 +131,6 @@ class AssetMaintenancesController extends Controller } return redirect()->back()->withInput()->withErrors($assetMaintenance->getErrors()); - } /** @@ -153,11 +150,10 @@ class AssetMaintenancesController extends Controller // Redirect to the improvement management page return redirect()->route('maintenances.index') ->with('error', trans('admin/asset_maintenances/message.not_found')); - } elseif (!$assetMaintenance->asset) { + } elseif (! $assetMaintenance->asset) { return redirect()->route('maintenances.index') ->with('error', 'The asset associated with this maintenance does not exist.'); - - } elseif (!Company::isCurrentUserHasAccess($assetMaintenance->asset)) { + } elseif (! Company::isCurrentUserHasAccess($assetMaintenance->asset)) { return static::getInsufficientPermissionsRedirect(); } @@ -184,7 +180,6 @@ class AssetMaintenancesController extends Controller ->with('selectedAsset', null) ->with('assetMaintenanceType', $assetMaintenanceType) ->with('item', $assetMaintenance); - } /** @@ -205,43 +200,43 @@ class AssetMaintenancesController extends Controller // Redirect to the asset maintenance management page return redirect()->route('maintenances.index') ->with('error', trans('admin/asset_maintenances/message.not_found')); - } elseif (!Company::isCurrentUserHasAccess($assetMaintenance->asset)) { + } elseif (! Company::isCurrentUserHasAccess($assetMaintenance->asset)) { return static::getInsufficientPermissionsRedirect(); } - $assetMaintenance->supplier_id = e($request->input('supplier_id')); - $assetMaintenance->is_warranty = e($request->input('is_warranty')); - $assetMaintenance->cost = Helper::ParseFloat(e($request->input('cost'))); - $assetMaintenance->notes = e($request->input('notes')); + $assetMaintenance->supplier_id = $request->input('supplier_id'); + $assetMaintenance->is_warranty = $request->input('is_warranty'); + $assetMaintenance->cost = Helper::ParseCurrency($request->input('cost')); + $assetMaintenance->notes = $request->input('notes'); $asset = Asset::find(request('asset_id')); - if (!Company::isCurrentUserHasAccess($asset)) { + if (! Company::isCurrentUserHasAccess($asset)) { return static::getInsufficientPermissionsRedirect(); } // Save the asset maintenance data - $assetMaintenance->asset_id = $request->input('asset_id'); + $assetMaintenance->asset_id = $request->input('asset_id'); $assetMaintenance->asset_maintenance_type = $request->input('asset_maintenance_type'); - $assetMaintenance->title = $request->input('title'); - $assetMaintenance->start_date = $request->input('start_date'); - $assetMaintenance->completion_date = $request->input('completion_date'); + $assetMaintenance->title = $request->input('title'); + $assetMaintenance->start_date = $request->input('start_date'); + $assetMaintenance->completion_date = $request->input('completion_date'); - if (( $assetMaintenance->completion_date == null ) + if (($assetMaintenance->completion_date == null) ) { - if (( $assetMaintenance->asset_maintenance_time !== 0 ) - || ( !is_null($assetMaintenance->asset_maintenance_time) ) + if (($assetMaintenance->asset_maintenance_time !== 0) + || (! is_null($assetMaintenance->asset_maintenance_time)) ) { $assetMaintenance->asset_maintenance_time = null; } } - if (( $assetMaintenance->completion_date !== null ) - && ( $assetMaintenance->start_date !== "" ) - && ( $assetMaintenance->start_date !== "0000-00-00" ) + if (($assetMaintenance->completion_date !== null) + && ($assetMaintenance->start_date !== '') + && ($assetMaintenance->start_date !== '0000-00-00') ) { - $startDate = Carbon::parse($assetMaintenance->start_date); - $completionDate = Carbon::parse($assetMaintenance->completion_date); + $startDate = Carbon::parse($assetMaintenance->start_date); + $completionDate = Carbon::parse($assetMaintenance->completion_date); $assetMaintenance->asset_maintenance_time = $completionDate->diffInDays($startDate); } @@ -252,6 +247,7 @@ class AssetMaintenancesController extends Controller return redirect()->route('maintenances.index') ->with('success', trans('admin/asset_maintenances/message.edit.success')); } + return redirect()->back()->withInput()->withErrors($assetMaintenance->getErrors()); } @@ -271,7 +267,7 @@ class AssetMaintenancesController extends Controller // Redirect to the asset maintenance management page return redirect()->route('maintenances.index') ->with('error', trans('admin/asset_maintenances/message.not_found')); - } elseif (!Company::isCurrentUserHasAccess($assetMaintenance->asset)) { + } elseif (! Company::isCurrentUserHasAccess($assetMaintenance->asset)) { return static::getInsufficientPermissionsRedirect(); } @@ -299,7 +295,7 @@ class AssetMaintenancesController extends Controller // Redirect to the asset maintenance management page return redirect()->route('maintenances.index') ->with('error', trans('admin/asset_maintenances/message.not_found')); - } elseif (!Company::isCurrentUserHasAccess($assetMaintenance->asset)) { + } elseif (! Company::isCurrentUserHasAccess($assetMaintenance->asset)) { return static::getInsufficientPermissionsRedirect(); } diff --git a/app/Http/Controllers/AssetModelsController.php b/app/Http/Controllers/AssetModelsController.php index 29914b40a2..1afc9d8a60 100755 --- a/app/Http/Controllers/AssetModelsController.php +++ b/app/Http/Controllers/AssetModelsController.php @@ -1,4 +1,5 @@ authorize('index', AssetModel::class); + return view('models/index'); } @@ -48,12 +49,12 @@ class AssetModelsController extends Controller public function create() { $this->authorize('create', AssetModel::class); + return view('models/edit')->with('category_type', 'asset') ->with('depreciation_list', Helper::depreciationList()) ->with('item', new AssetModel); } - /** * Validate and process the new Asset Model data. * @@ -65,7 +66,6 @@ class AssetModelsController extends Controller */ public function store(ImageUploadRequest $request) { - $this->authorize('create', AssetModel::class); // Create a new asset model $model = new AssetModel; @@ -73,29 +73,30 @@ class AssetModelsController extends Controller // Save the model data $model->eol = $request->input('eol'); $model->depreciation_id = $request->input('depreciation_id'); - $model->name = $request->input('name'); - $model->model_number = $request->input('model_number'); - $model->manufacturer_id = $request->input('manufacturer_id'); - $model->category_id = $request->input('category_id'); - $model->notes = $request->input('notes'); - $model->user_id = Auth::id(); - $model->requestable = Request::has('requestable'); + $model->name = $request->input('name'); + $model->model_number = $request->input('model_number'); + $model->manufacturer_id = $request->input('manufacturer_id'); + $model->category_id = $request->input('category_id'); + $model->notes = $request->input('notes'); + $model->user_id = Auth::id(); + $model->requestable = Request::has('requestable'); - if ($request->input('custom_fieldset')!='') { + if ($request->input('custom_fieldset') != '') { $model->fieldset_id = e($request->input('custom_fieldset')); } $model = $request->handleImages($model); - // Was it created? + // Was it created? if ($model->save()) { if ($this->shouldAddDefaultValues($request->input())) { $this->assignCustomFieldsDefaultValues($model, $request->input('default_values')); } // Redirect to the new model page - return redirect()->route("models.index")->with('success', trans('admin/models/message.create.success')); + return redirect()->route('models.index')->with('success', trans('admin/models/message.create.success')); } + return redirect()->back()->withInput()->withErrors($model->getErrors()); } @@ -113,16 +114,15 @@ class AssetModelsController extends Controller $this->authorize('update', AssetModel::class); if ($item = AssetModel::find($modelId)) { $category_type = 'asset'; - $view = View::make('models/edit', compact('item','category_type')); + $view = View::make('models/edit', compact('item', 'category_type')); $view->with('depreciation_list', Helper::depreciationList()); + return $view; } return redirect()->route('models.index')->with('error', trans('admin/models/message.does_not_exist')); - } - /** * Validates and processes form data from the edit * Asset Model form based on the model ID passed. @@ -145,20 +145,18 @@ class AssetModelsController extends Controller $model = $request->handleImages($model); - $model->depreciation_id = $request->input('depreciation_id'); - $model->eol = $request->input('eol'); - $model->name = $request->input('name'); - $model->model_number = $request->input('model_number'); - $model->manufacturer_id = $request->input('manufacturer_id'); - $model->category_id = $request->input('category_id'); - $model->notes = $request->input('notes'); - $model->requestable = $request->input('requestable', '0'); - - + $model->depreciation_id = $request->input('depreciation_id'); + $model->eol = $request->input('eol'); + $model->name = $request->input('name'); + $model->model_number = $request->input('model_number'); + $model->manufacturer_id = $request->input('manufacturer_id'); + $model->category_id = $request->input('category_id'); + $model->notes = $request->input('notes'); + $model->requestable = $request->input('requestable', '0'); $this->removeCustomFieldsDefaultValues($model); - if ($request->input('custom_fieldset')=='') { + if ($request->input('custom_fieldset') == '') { $model->fieldset_id = null; } else { $model->fieldset_id = $request->input('custom_fieldset'); @@ -168,10 +166,10 @@ class AssetModelsController extends Controller } } - if ($model->save()) { - return redirect()->route("models.index")->with('success', trans('admin/models/message.update.success')); + return redirect()->route('models.index')->with('success', trans('admin/models/message.update.success')); } + return redirect()->back()->withInput()->withErrors($model->getErrors()); } @@ -199,7 +197,7 @@ class AssetModelsController extends Controller } if ($model->image) { - try { + try { Storage::disk('public')->delete('models/'.$model->image); } catch (\Exception $e) { \Log::info($e); @@ -213,7 +211,6 @@ class AssetModelsController extends Controller return redirect()->route('models.index')->with('success', trans('admin/models/message.delete.success')); } - /** * Restore a given Asset Model (mark as un-deleted) * @@ -231,13 +228,13 @@ class AssetModelsController extends Controller if (isset($model->id)) { $model->restore(); + return redirect()->route('models.index')->with('success', trans('admin/models/message.restore.success')); } + return redirect()->back()->with('error', trans('admin/models/message.not_found')); - } - /** * Get the model information to present to the model view page * @@ -260,13 +257,13 @@ class AssetModelsController extends Controller } /** - * Get the clone page to clone a model - * - * @author [A. Gianotto] [] - * @since [v1.0] - * @param int $modelId - * @return View - */ + * Get the clone page to clone a model + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @param int $modelId + * @return View + */ public function getClone($modelId = null) { // Check if the model exists @@ -284,23 +281,19 @@ class AssetModelsController extends Controller ->with('clone_model', $model_to_clone); } - /** - * Get the custom fields form - * - * @author [B. Wetherington] [] - * @since [v2.0] - * @param int $modelId - * @return View - */ + * Get the custom fields form + * + * @author [B. Wetherington] [] + * @since [v2.0] + * @param int $modelId + * @return View + */ public function getCustomFields($modelId) { - return view("models.custom_fields_form")->with("model", AssetModel::find($modelId)); + return view('models.custom_fields_form')->with('model', AssetModel::find($modelId)); } - - - /** * Returns a view that allows the user to bulk edit model attrbutes * @@ -310,28 +303,25 @@ class AssetModelsController extends Controller */ public function postBulkEdit(Request $request) { - $models_raw_array = $request->input('ids'); // Make sure some IDs have been selected if ((is_array($models_raw_array)) && (count($models_raw_array) > 0)) { - - $models = AssetModel::whereIn('id', $models_raw_array)->withCount('assets as assets_count')->orderBy('assets_count', 'ASC')->get(); // If deleting.... - if ($request->input('bulk_actions')=='delete') { + if ($request->input('bulk_actions') == 'delete') { $valid_count = 0; foreach ($models as $model) { if ($model->assets_count == 0) { $valid_count++; } } + return view('models/bulk-delete', compact('models'))->with('valid_count', $valid_count); // Otherwise display the bulk edit screen } else { - $nochange = ['NC' => 'No Change']; $fieldset_list = $nochange + Helper::customFieldsetList(); $depreciation_list = $nochange + Helper::depreciationList(); @@ -340,16 +330,12 @@ class AssetModelsController extends Controller ->with('fieldset_list', $fieldset_list) ->with('depreciation_list', $depreciation_list); } - } return redirect()->route('models.index') ->with('error', 'You must select at least one model to edit.'); - } - - /** * Returns a view that allows the user to bulk edit model attrbutes * @@ -359,35 +345,31 @@ class AssetModelsController extends Controller */ public function postBulkEditSave(Request $request) { - $models_raw_array = $request->input('ids'); - $update_array = array(); + $update_array = []; - - if (($request->filled('manufacturer_id') && ($request->input('manufacturer_id')!='NC'))) { + if (($request->filled('manufacturer_id') && ($request->input('manufacturer_id') != 'NC'))) { $update_array['manufacturer_id'] = $request->input('manufacturer_id'); } - if (($request->filled('category_id') && ($request->input('category_id')!='NC'))) { + if (($request->filled('category_id') && ($request->input('category_id') != 'NC'))) { $update_array['category_id'] = $request->input('category_id'); } - if ($request->input('fieldset_id')!='NC') { + if ($request->input('fieldset_id') != 'NC') { $update_array['fieldset_id'] = $request->input('fieldset_id'); } - if ($request->input('depreciation_id')!='NC') { + if ($request->input('depreciation_id') != 'NC') { $update_array['depreciation_id'] = $request->input('depreciation_id'); } - - if (count($update_array) > 0) { AssetModel::whereIn('id', $models_raw_array)->update($update_array); + return redirect()->route('models.index') ->with('success', trans('admin/models/message.bulkedit.success')); } return redirect()->route('models.index') ->with('warning', trans('admin/models/message.bulkedit.error')); - } /** @@ -404,7 +386,6 @@ class AssetModelsController extends Controller $models_raw_array = $request->input('ids'); if ((is_array($models_raw_array)) && (count($models_raw_array) > 0)) { - $models = AssetModel::whereIn('id', $models_raw_array)->withCount('assets as assets_count')->get(); $del_error_count = 0; @@ -426,7 +407,7 @@ class AssetModelsController extends Controller if ($del_error_count == 0) { return redirect()->route('models.index') - ->with('success', trans('admin/models/message.bulkdelete.success',['success_count'=> $del_count] )); + ->with('success', trans('admin/models/message.bulkdelete.success', ['success_count'=> $del_count])); } return redirect()->route('models.index') @@ -435,7 +416,6 @@ class AssetModelsController extends Controller return redirect()->route('models.index') ->with('error', trans('admin/models/message.bulkdelete.error')); - } /** @@ -443,13 +423,13 @@ class AssetModelsController extends Controller * any default values were entered into the form. * * @param array $input - * @return boolean + * @return bool */ private function shouldAddDefaultValues(array $input) { - return !empty($input['add_default_values']) - && !empty($input['default_values']) - && !empty($input['custom_fieldset']); + return ! empty($input['add_default_values']) + && ! empty($input['default_values']) + && ! empty($input['custom_fieldset']); } /** diff --git a/app/Http/Controllers/Assets/AssetCheckinController.php b/app/Http/Controllers/Assets/AssetCheckinController.php index ec0ef1c365..80667c9cea 100644 --- a/app/Http/Controllers/Assets/AssetCheckinController.php +++ b/app/Http/Controllers/Assets/AssetCheckinController.php @@ -7,13 +7,14 @@ use App\Helpers\Helper; use App\Http\Controllers\Controller; use App\Http\Requests\AssetCheckinRequest; use App\Models\Asset; +use App\Models\CheckoutAcceptance; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Redirect; use Illuminate\Support\Facades\View; class AssetCheckinController extends Controller { - /** * Returns a view that presents a form to check an asset back into inventory. * @@ -33,6 +34,7 @@ class AssetCheckinController extends Controller } $this->authorize('checkin', $asset); + return view('hardware/checkin', compact('asset'))->with('statusLabel_list', Helper::statusLabelList())->with('backto', $backto); } @@ -73,7 +75,7 @@ class AssetCheckinController extends Controller $asset->name = $request->get('name'); if ($request->filled('status_id')) { - $asset->status_id = e($request->get('status_id')); + $asset->status_id = e($request->get('status_id')); } // This is just meant to correct legacy issues where some user data would have 0 @@ -81,14 +83,14 @@ class AssetCheckinController extends Controller // rules, so it's necessary to fix this for long-time users. It's kinda gross, but will help // people (and their data) in the long run - if ($asset->rtd_location_id=='0') { + if ($asset->rtd_location_id == '0') { \Log::debug('Manually override the RTD location IDs'); \Log::debug('Original RTD Location ID: '.$asset->rtd_location_id); $asset->rtd_location_id = ''; \Log::debug('New RTD Location ID: '.$asset->rtd_location_id); } - if ($asset->location_id=='0') { + if ($asset->location_id == '0') { \Log::debug('Manually override the location IDs'); \Log::debug('Original Location ID: '.$asset->location_id); $asset->location_id = ''; @@ -99,27 +101,37 @@ class AssetCheckinController extends Controller \Log::debug('After Location ID: '.$asset->location_id); \Log::debug('After RTD Location ID: '.$asset->rtd_location_id); - if ($request->filled('location_id')) { \Log::debug('NEW Location ID: '.$request->get('location_id')); - $asset->location_id = e($request->get('location_id')); + $asset->location_id = e($request->get('location_id')); } $checkin_at = date('Y-m-d'); - if($request->filled('checkin_at')){ + if ($request->filled('checkin_at')) { $checkin_at = $request->input('checkin_at'); } + // Get all pending Acceptances for this asset and delete them + $acceptances = CheckoutAcceptance::pending()->whereHasMorph('checkoutable', + [Asset::class], + function (Builder $query) use ($asset) { + $query->where('id', $asset->id); + })->get(); + $acceptances->map(function($acceptance) { + $acceptance->delete(); + }); + // Was the asset updated? if ($asset->save()) { event(new CheckoutableCheckedIn($asset, $target, Auth::user(), $request->input('note'), $checkin_at)); - if ((isset($user)) && ($backto =='user')) { - return redirect()->route("users.show", $user->id)->with('success', trans('admin/hardware/message.checkin.success')); + if ((isset($user)) && ($backto == 'user')) { + return redirect()->route('users.show', $user->id)->with('success', trans('admin/hardware/message.checkin.success')); } - return redirect()->route("hardware.index")->with('success', trans('admin/hardware/message.checkin.success')); + + return redirect()->route('hardware.index')->with('success', trans('admin/hardware/message.checkin.success')); } // Redirect to the asset management page with error - return redirect()->route("hardware.index")->with('error', trans('admin/hardware/message.checkin.error').$asset->getErrors()); + return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.checkin.error').$asset->getErrors()); } } diff --git a/app/Http/Controllers/Assets/AssetCheckoutController.php b/app/Http/Controllers/Assets/AssetCheckoutController.php index dcb5154cfc..dc4ea8fb50 100644 --- a/app/Http/Controllers/Assets/AssetCheckoutController.php +++ b/app/Http/Controllers/Assets/AssetCheckoutController.php @@ -2,7 +2,6 @@ namespace App\Http\Controllers\Assets; - use App\Exceptions\CheckoutNotAllowed; use App\Helpers\Helper; use App\Http\Controllers\CheckInOutRequest; @@ -15,15 +14,16 @@ use Illuminate\Support\Facades\Auth; class AssetCheckoutController extends Controller { use CheckInOutRequest; + /** - * Returns a view that presents a form to check an asset out to a - * user. - * - * @author [A. Gianotto] [] - * @param int $assetId - * @since [v1.0] - * @return View - */ + * Returns a view that presents a form to check an asset out to a + * user. + * + * @author [A. Gianotto] [] + * @param int $assetId + * @since [v1.0] + * @return View + */ public function create($assetId) { // Check if the asset exists @@ -37,9 +37,8 @@ class AssetCheckoutController extends Controller return view('hardware/checkout', compact('asset')) ->with('statusLabel_list', Helper::deployableStatusLabelList()); } + return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.checkout.not_available')); - - } /** @@ -55,9 +54,9 @@ class AssetCheckoutController extends Controller { try { // Check if the asset exists - if (!$asset = Asset::find($assetId)) { + if (! $asset = Asset::find($assetId)) { return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist')); - } elseif (!$asset->availableForCheckout()) { + } elseif (! $asset->availableForCheckout()) { return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.checkout.not_available')); } $this->authorize('checkout', $asset); @@ -67,8 +66,8 @@ class AssetCheckoutController extends Controller $asset = $this->updateAssetLocation($asset, $target); - $checkout_at = date("Y-m-d H:i:s"); - if (($request->filled('checkout_at')) && ($request->get('checkout_at')!= date("Y-m-d"))) { + $checkout_at = date('Y-m-d H:i:s'); + if (($request->filled('checkout_at')) && ($request->get('checkout_at') != date('Y-m-d'))) { $checkout_at = $request->get('checkout_at'); } @@ -82,7 +81,7 @@ class AssetCheckoutController extends Controller } if ($asset->checkOut($target, $admin, $checkout_at, $expected_checkin, e($request->get('note')), $request->get('name'))) { - return redirect()->route("hardware.index")->with('success', trans('admin/hardware/message.checkout.success')); + return redirect()->route('hardware.index')->with('success', trans('admin/hardware/message.checkout.success')); } // Redirect to the asset management page with error @@ -93,5 +92,4 @@ class AssetCheckoutController extends Controller return redirect()->back()->with('error', $e->getMessage()); } } - } diff --git a/app/Http/Controllers/Assets/AssetFilesController.php b/app/Http/Controllers/Assets/AssetFilesController.php index 7cdd075ab9..2c7d6ff9ec 100644 --- a/app/Http/Controllers/Assets/AssetFilesController.php +++ b/app/Http/Controllers/Assets/AssetFilesController.php @@ -2,14 +2,14 @@ namespace App\Http\Controllers\Assets; - +use App\Helpers\StorageHelper; use App\Http\Controllers\Controller; use App\Http\Requests\AssetFileRequest; use App\Models\Actionlog; use App\Models\Asset; use Illuminate\Support\Facades\Response; use Illuminate\Support\Facades\Storage; -use App\Helpers\StorageHelper; +use enshrined\svgSanitize\Sanitizer; class AssetFilesController extends Controller { @@ -25,22 +25,44 @@ class AssetFilesController extends Controller */ public function store(AssetFileRequest $request, $assetId = null) { - if (!$asset = Asset::find($assetId)) { + if (! $asset = Asset::find($assetId)) { return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist')); } $this->authorize('update', $asset); if ($request->hasFile('file')) { - - if (!Storage::exists('private_uploads/assets')) Storage::makeDirectory('private_uploads/assets', 775); + if (! Storage::exists('private_uploads/assets')) { + Storage::makeDirectory('private_uploads/assets', 775); + } foreach ($request->file('file') as $file) { + $extension = $file->getClientOriginalExtension(); $file_name = 'hardware-'.$asset->id.'-'.str_random(8).'-'.str_slug(basename($file->getClientOriginalName(), '.'.$extension)).'.'.$extension; + + // Check for SVG and sanitize it + if ($extension=='svg') { + \Log::debug('This is an SVG'); + + $sanitizer = new Sanitizer(); + $dirtySVG = file_get_contents($file->getRealPath()); + $cleanSVG = $sanitizer->sanitize($dirtySVG); + + try { + Storage::put('private_uploads/assets/'.$file_name, $cleanSVG); + } catch (\Exception $e) { + \Log::debug('Upload no workie :( '); + \Log::debug($e); + } + } else { Storage::put('private_uploads/assets/'.$file_name, file_get_contents($file)); + } + + $asset->logUpload($file_name, e($request->get('notes'))); } + return redirect()->back()->with('success', trans('admin/hardware/message.upload.success')); } @@ -64,7 +86,7 @@ class AssetFilesController extends Controller if (isset($asset->id)) { $this->authorize('view', $asset); - if (!$log = Actionlog::find($fileId)) { + if (! $log = Actionlog::find($fileId)) { return response('No matching record for that asset/file', 500) ->header('Content-Type', 'text/plain'); } @@ -72,21 +94,23 @@ class AssetFilesController extends Controller $file = 'private_uploads/assets/'.$log->filename; \Log::debug('Checking for '.$file); - if ($log->action_type =='audit') { + if ($log->action_type == 'audit') { $file = 'private_uploads/audits/'.$log->filename; } - if (!Storage::exists($file)) { + if (! Storage::exists($file)) { return response('File '.$file.' not found on server', 404) ->header('Content-Type', 'text/plain'); } if ($download != 'true') { - if ($contents = file_get_contents(Storage::url($file))) { - return Response::make(Storage::url($file)->header('Content-Type', mime_content_type($file))); - } - return JsonResponse::create(["error" => "Failed validation: "], 500); + if ($contents = file_get_contents(Storage::url($file))) { + return Response::make(Storage::url($file)->header('Content-Type', mime_content_type($file))); + } + + return JsonResponse::create(['error' => 'Failed validation: '], 500); } + return StorageHelper::downloader($file); } // Prepare the error message @@ -117,13 +141,14 @@ class AssetFilesController extends Controller $this->authorize('update', $asset); $log = Actionlog::find($fileId); if ($log) { - if (Storage::exists($rel_path.'/'.$log->filename)) { - Storage::delete($rel_path.'/'.$log->filename); + if (Storage::exists($rel_path.'/'.$log->filename)) { + Storage::delete($rel_path.'/'.$log->filename); } $log->delete(); + return redirect()->back()->with('success', trans('admin/hardware/message.deletefile.success')); } - $log->delete(); + return redirect()->back() ->with('success', trans('admin/hardware/message.deletefile.success')); } diff --git a/app/Http/Controllers/Assets/AssetsController.php b/app/Http/Controllers/Assets/AssetsController.php index 8fed678d40..934573cc7d 100755 --- a/app/Http/Controllers/Assets/AssetsController.php +++ b/app/Http/Controllers/Assets/AssetsController.php @@ -1,4 +1,5 @@ 3.5, 'width' => 3.5); - protected $barCodeDimensions = array( 'height' => 2, 'width' => 22); - + protected $qrCodeDimensions = ['height' => 3.5, 'width' => 3.5]; + protected $barCodeDimensions = ['height' => 2, 'width' => 22]; public function __construct() { @@ -65,6 +65,7 @@ class AssetsController extends Controller { $this->authorize('index', Asset::class); $company = Company::find($request->input('company_id')); + return view('hardware/index')->with('company', $company); } @@ -89,6 +90,7 @@ class AssetsController extends Controller $selected_model = AssetModel::find($request->input('model_id')); $view->with('selected_model', $selected_model); } + return $view; } @@ -114,18 +116,17 @@ class AssetsController extends Controller $serials = $request->input('serials'); for ($a = 1; $a <= count($asset_tags); $a++) { - $asset = new Asset(); $asset->model()->associate(AssetModel::find($request->input('model_id'))); - $asset->name = $request->input('name'); + $asset->name = $request->input('name'); // Check for a corresponding serial if (($serials) && (array_key_exists($a, $serials))) { - $asset->serial = $serials[$a]; + $asset->serial = $serials[$a]; } if (($asset_tags) && (array_key_exists($a, $asset_tags))) { - $asset->asset_tag = $asset_tags[$a]; + $asset->asset_tag = $asset_tags[$a]; } $asset->company_id = Company::getIdForCurrentUser($request->input('company_id')); @@ -138,18 +139,18 @@ class AssetsController extends Controller $asset->depreciate = '0'; $asset->status_id = request('status_id', 0); $asset->warranty_months = request('warranty_months', null); - $asset->purchase_cost = Helper::ParseFloat($request->get('purchase_cost')); + $asset->purchase_cost = Helper::ParseCurrency($request->get('purchase_cost')); $asset->purchase_date = request('purchase_date', null); $asset->assigned_to = request('assigned_to', null); $asset->supplier_id = request('supplier_id', 0); $asset->requestable = request('requestable', 0); $asset->rtd_location_id = request('rtd_location_id', null); - if (!empty($settings->audit_interval)) { - $asset->next_audit_date = Carbon::now()->addMonths($settings->audit_interval)->toDateString(); + if (! empty($settings->audit_interval)) { + $asset->next_audit_date = Carbon::now()->addMonths($settings->audit_interval)->toDateString(); } - if ($asset->assigned_to=='') { + if ($asset->assigned_to == '') { $asset->location_id = $request->input('rtd_location_id', null); } @@ -164,17 +165,18 @@ class AssetsController extends Controller if (($model) && ($model->fieldset)) { foreach ($model->fieldset->fields as $field) { - if ($field->field_encrypted=='1') { + if ($field->field_encrypted == '1') { if (Gate::allows('admin')) { - if(is_array($request->input($field->convertUnicodeDbSlug()))){ + if (is_array($request->input($field->convertUnicodeDbSlug()))) { $asset->{$field->convertUnicodeDbSlug()} = \Crypt::encrypt(e(implode(', ', $request->input($field->convertUnicodeDbSlug())))); - }else{ + } else { $asset->{$field->convertUnicodeDbSlug()} = \Crypt::encrypt(e($request->input($field->convertUnicodeDbSlug()))); - } } + } + } } else { - if(is_array($request->input($field->convertUnicodeDbSlug()))){ + if (is_array($request->input($field->convertUnicodeDbSlug()))) { $asset->{$field->convertUnicodeDbSlug()} = implode(', ', $request->input($field->convertUnicodeDbSlug())); - }else{ + } else { $asset->{$field->convertUnicodeDbSlug()} = $request->input($field->convertUnicodeDbSlug()); } } @@ -183,7 +185,6 @@ class AssetsController extends Controller // Validate the asset before saving if ($asset->isValid() && $asset->save()) { - if (request('assigned_user')) { $target = User::find(request('assigned_user')); $location = $target->location_id; @@ -200,10 +201,7 @@ class AssetsController extends Controller } $success = true; - - } - } if ($success) { @@ -213,7 +211,6 @@ class AssetsController extends Controller } return redirect()->back()->withInput()->withErrors($asset->getErrors()); - } /** @@ -226,7 +223,7 @@ class AssetsController extends Controller */ public function edit($assetId = null) { - if (!$item = Asset::find($assetId)) { + if (! $item = Asset::find($assetId)) { // Redirect to the asset management page with error return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist')); } @@ -238,7 +235,6 @@ class AssetsController extends Controller ->with('statuslabel_types', Helper::statusTypeList()); } - /** * Returns a view that presents information about an asset for detail view. * @@ -262,17 +258,17 @@ class AssetsController extends Controller if ($asset->location) { $use_currency = $asset->location->currency; } else { - if ($settings->default_currency!='') { + if ($settings->default_currency != '') { $use_currency = $settings->default_currency; } else { $use_currency = trans('general.currency'); } } - $qr_code = (object) array( + $qr_code = (object) [ 'display' => $settings->qr_code == '1', - 'url' => route('qr_code/hardware', $asset->id) - ); + 'url' => route('qr_code/hardware', $asset->id), + ]; return view('hardware/view', compact('asset', 'qr_code', 'settings')) ->with('use_currency', $use_currency)->with('audit_log', $audit_log); @@ -281,7 +277,6 @@ class AssetsController extends Controller return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist')); } - /** * Validate and process asset edit form. * @@ -290,11 +285,10 @@ class AssetsController extends Controller * @since [v1.0] * @return Redirect */ - public function update(ImageUploadRequest $request, $assetId = null) { // Check if the asset exists - if (!$asset = Asset::find($assetId)) { + if (! $asset = Asset::find($assetId)) { // Redirect to the asset management page with error return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist')); } @@ -302,7 +296,7 @@ class AssetsController extends Controller $asset->status_id = $request->input('status_id', null); $asset->warranty_months = $request->input('warranty_months', null); - $asset->purchase_cost = Helper::ParseFloat($request->input('purchase_cost', null)); + $asset->purchase_cost = Helper::ParseCurrency($request->input('purchase_cost', null)); $asset->purchase_date = $request->input('purchase_date', null); $asset->supplier_id = $request->input('supplier_id', null); $asset->expected_checkin = $request->input('expected_checkin', null); @@ -311,11 +305,10 @@ class AssetsController extends Controller $asset->requestable = $request->filled('requestable'); $asset->rtd_location_id = $request->input('rtd_location_id', null); - if ($asset->assigned_to=='') { + if ($asset->assigned_to == '') { $asset->location_id = $request->input('rtd_location_id', null); } - if ($request->filled('image_delete')) { try { unlink(public_path().'/uploads/assets/'.$asset->image); @@ -323,21 +316,19 @@ class AssetsController extends Controller } catch (\Exception $e) { \Log::info($e); } - } - // Update the asset data - $asset_tag = $request->input('asset_tags'); - $serial = $request->input('serials'); - $asset->name = $request->input('name'); - $asset->serial = $serial[1]; - $asset->company_id = Company::getIdForCurrentUser($request->input('company_id')); - $asset->model_id = $request->input('model_id'); + $asset_tag = $request->input('asset_tags'); + $serial = $request->input('serials'); + $asset->name = $request->input('name'); + $asset->serial = $serial[1]; + $asset->company_id = Company::getIdForCurrentUser($request->input('company_id')); + $asset->model_id = $request->input('model_id'); $asset->order_number = $request->input('order_number'); - $asset->asset_tag = $asset_tag[1]; - $asset->notes = $request->input('notes'); - $asset->physical = '1'; + $asset->asset_tag = $asset_tag[1]; + $asset->notes = $request->input('notes'); + $asset->physical = '1'; $asset = $request->handleImages($asset); @@ -348,18 +339,18 @@ class AssetsController extends Controller $model = AssetModel::find($request->get('model_id')); if (($model) && ($model->fieldset)) { foreach ($model->fieldset->fields as $field) { - if ($field->field_encrypted=='1') { + if ($field->field_encrypted == '1') { if (Gate::allows('admin')) { - if(is_array($request->input($field->convertUnicodeDbSlug()))){ + if (is_array($request->input($field->convertUnicodeDbSlug()))) { $asset->{$field->convertUnicodeDbSlug()} = \Crypt::encrypt(e(implode(', ', $request->input($field->convertUnicodeDbSlug())))); - }else{ + } else { $asset->{$field->convertUnicodeDbSlug()} = \Crypt::encrypt(e($request->input($field->convertUnicodeDbSlug()))); } } } else { - if(is_array($request->input($field->convertUnicodeDbSlug()))){ + if (is_array($request->input($field->convertUnicodeDbSlug()))) { $asset->{$field->convertUnicodeDbSlug()} = implode(', ', $request->input($field->convertUnicodeDbSlug())); - }else{ + } else { $asset->{$field->convertUnicodeDbSlug()} = $request->input($field->convertUnicodeDbSlug()); } } @@ -368,7 +359,7 @@ class AssetsController extends Controller if ($asset->save()) { - return redirect()->route("hardware.show", $assetId) + return redirect()->route('hardware.show', $assetId) ->with('success', trans('admin/hardware/message.update.success')); } @@ -395,10 +386,10 @@ class AssetsController extends Controller DB::table('assets') ->where('id', $asset->id) - ->update(array('assigned_to' => null)); + ->update(['assigned_to' => null]); if ($asset->image) { - try { + try { Storage::disk('public')->delete('assets'.'/'.$asset->image); } catch (\Exception $e) { \Log::debug($e); @@ -410,8 +401,6 @@ class AssetsController extends Controller return redirect()->route('hardware.index')->with('success', trans('admin/hardware/message.delete.success')); } - - /** * Searches the assets table by asset tag, and redirects if it finds one * @@ -421,14 +410,16 @@ class AssetsController extends Controller */ public function getAssetByTag(Request $request) { - $topsearch = ($request->get('topsearch')=="true"); + $topsearch = ($request->get('topsearch') == 'true'); - if (!$asset = Asset::where('asset_tag', '=', $request->get('assetTag'))->first()) { + if (! $asset = Asset::where('asset_tag', '=', $request->get('assetTag'))->first()) { return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist')); } $this->authorize('view', $asset); + return redirect()->route('hardware.show', $asset->id)->with('topsearch', $topsearch); } + /** * Return a QR code for the asset * @@ -450,20 +441,22 @@ class AssetsController extends Controller if (isset($asset->id, $asset->asset_tag)) { if (file_exists($qr_file)) { $header = ['Content-type' => 'image/png']; + return response()->file($qr_file, $header); } else { $barcode = new \Com\Tecnick\Barcode\Barcode(); - $barcode_obj = $barcode->getBarcodeObj($settings->barcode_type, route('hardware.show', $asset->id), $size['height'], $size['width'], 'black', array(-2, -2, -2, -2)); + $barcode_obj = $barcode->getBarcodeObj($settings->barcode_type, route('hardware.show', $asset->id), $size['height'], $size['width'], 'black', [-2, -2, -2, -2]); file_put_contents($qr_file, $barcode_obj->getPngData()); + return response($barcode_obj->getPngData())->header('Content-type', 'image/png'); } } } + return 'That asset is invalid'; } } - /** * Return a 2D barcode for the asset * @@ -481,6 +474,7 @@ class AssetsController extends Controller if (isset($asset->id, $asset->asset_tag)) { if (file_exists($barcode_file)) { $header = ['Content-type' => 'image/png']; + return response()->file($barcode_file, $header); } else { // Calculate barcode width in pixel based on label width (inch) @@ -488,20 +482,19 @@ class AssetsController extends Controller $barcode = new \Com\Tecnick\Barcode\Barcode(); try { - $barcode_obj = $barcode->getBarcodeObj($settings->alt_barcode,$asset->asset_tag,($barcode_width < 300 ? $barcode_width : 300),50); + $barcode_obj = $barcode->getBarcodeObj($settings->alt_barcode, $asset->asset_tag, ($barcode_width < 300 ? $barcode_width : 300), 50); file_put_contents($barcode_file, $barcode_obj->getPngData()); + return response($barcode_obj->getPngData())->header('Content-type', 'image/png'); - } catch(\Exception $e) { + } catch (\Exception $e) { \Log::debug('The barcode format is invalid.'); + return response(file_get_contents(public_path('uploads/barcodes/invalid_barcode.gif')))->header('Content-type', 'image/gif'); } - - } } } - /** * Return a label for an individual asset. * @@ -523,7 +516,6 @@ class AssetsController extends Controller } } - /** * Returns a view that presents a form to clone an asset. * @@ -564,6 +556,7 @@ class AssetsController extends Controller public function getImportHistory() { $this->authorize('admin'); + return view('hardware/history'); } @@ -572,49 +565,48 @@ class AssetsController extends Controller * * This needs a LOT of love. It's done very inelegantly right now, and there are * a ton of optimizations that could (and should) be done. - * + * * Updated to respect checkin dates: * No checkin column, assume all items are checked in (todays date) * Checkin date in the past, update history. * Checkin date in future or empty, check the item out to the user. - * + * * @author [A. Gianotto] [] * @since [v3.3] * @return View */ public function postImportHistory(Request $request) { - - if (!$request->hasFile('user_import_csv')) { + if (! $request->hasFile('user_import_csv')) { return back()->with('error', 'No file provided. Please select a file for import and try again. '); } - if (!ini_get("auto_detect_line_endings")) { - ini_set("auto_detect_line_endings", '1'); + if (! ini_get('auto_detect_line_endings')) { + ini_set('auto_detect_line_endings', '1'); } $csv = Reader::createFromPath($request->file('user_import_csv')); $csv->setHeaderOffset(0); $header = $csv->getHeader(); - $isCheckinHeaderExplicit = in_array("checkin date", (array_map('strtolower', $header))); + $isCheckinHeaderExplicit = in_array('checkin date', (array_map('strtolower', $header))); $results = $csv->getRecords(); - $item = array(); - $status = array(); - $status['error'] = array(); - $status['success'] = array(); + $item = []; + $status = []; + $status['error'] = []; + $status['success'] = []; foreach ($results as $row) { if (is_array($row)) { $row = array_change_key_case($row, CASE_LOWER); - $asset_tag = Helper::array_smart_fetch($row, "asset tag"); - if (!array_key_exists($asset_tag, $item)) { - $item[$asset_tag] = array(); + $asset_tag = Helper::array_smart_fetch($row, 'asset tag'); + if (! array_key_exists($asset_tag, $item)) { + $item[$asset_tag] = []; } $batch_counter = count($item[$asset_tag]); - $item[$asset_tag][$batch_counter]['checkout_date'] = Carbon::parse(Helper::array_smart_fetch($row, "checkout date"))->format('Y-m-d H:i:s'); - - if ($isCheckinHeaderExplicit){ + $item[$asset_tag][$batch_counter]['checkout_date'] = Carbon::parse(Helper::array_smart_fetch($row, 'checkout date'))->format('Y-m-d H:i:s'); + + if ($isCheckinHeaderExplicit) { //checkin date not empty, assume past transaction or future checkin date (expected) - if (!empty(Helper::array_smart_fetch($row, "checkin date"))) { - $item[$asset_tag][$batch_counter]['checkin_date'] = Carbon::parse(Helper::array_smart_fetch($row, "checkin date"))->format('Y-m-d H:i:s'); + if (! empty(Helper::array_smart_fetch($row, 'checkin date'))) { + $item[$asset_tag][$batch_counter]['checkin_date'] = Carbon::parse(Helper::array_smart_fetch($row, 'checkin date'))->format('Y-m-d H:i:s'); } else { $item[$asset_tag][$batch_counter]['checkin_date'] = ''; } @@ -623,44 +615,44 @@ class AssetsController extends Controller $item[$asset_tag][$batch_counter]['checkin_date'] = Carbon::parse(now())->format('Y-m-d H:i:s'); } - $item[$asset_tag][$batch_counter]['asset_tag'] = Helper::array_smart_fetch($row, "asset tag"); - $item[$asset_tag][$batch_counter]['name'] = Helper::array_smart_fetch($row, "name"); - $item[$asset_tag][$batch_counter]['email'] = Helper::array_smart_fetch($row, "email"); + $item[$asset_tag][$batch_counter]['asset_tag'] = Helper::array_smart_fetch($row, 'asset tag'); + $item[$asset_tag][$batch_counter]['name'] = Helper::array_smart_fetch($row, 'name'); + $item[$asset_tag][$batch_counter]['email'] = Helper::array_smart_fetch($row, 'email'); if ($asset = Asset::where('asset_tag', '=', $asset_tag)->first()) { $item[$asset_tag][$batch_counter]['asset_id'] = $asset->id; $base_username = User::generateFormattedNameFromFullName(Setting::getSettings()->username_format, $item[$asset_tag][$batch_counter]['name']); $user = User::where('username', '=', $base_username['username']); $user_query = ' on username '.$base_username['username']; - if ($request->input('match_firstnamelastname')=='1') { + if ($request->input('match_firstnamelastname') == '1') { $firstnamedotlastname = User::generateFormattedNameFromFullName('firstname.lastname', $item[$asset_tag][$batch_counter]['name']); $item[$asset_tag][$batch_counter]['username'][] = $firstnamedotlastname['username']; $user->orWhere('username', '=', $firstnamedotlastname['username']); $user_query .= ', or on username '.$firstnamedotlastname['username']; } - if ($request->input('match_flastname')=='1') { + if ($request->input('match_flastname') == '1') { $flastname = User::generateFormattedNameFromFullName('filastname', $item[$asset_tag][$batch_counter]['name']); $item[$asset_tag][$batch_counter]['username'][] = $flastname['username']; $user->orWhere('username', '=', $flastname['username']); $user_query .= ', or on username '.$flastname['username']; } - if ($request->input('match_firstname')=='1') { + if ($request->input('match_firstname') == '1') { $firstname = User::generateFormattedNameFromFullName('firstname', $item[$asset_tag][$batch_counter]['name']); $item[$asset_tag][$batch_counter]['username'][] = $firstname['username']; $user->orWhere('username', '=', $firstname['username']); $user_query .= ', or on username '.$firstname['username']; } - if ($request->input('match_email')=='1') { - if ($item[$asset_tag][$batch_counter]['name']=='') { + if ($request->input('match_email') == '1') { + if ($item[$asset_tag][$batch_counter]['name'] == '') { $item[$asset_tag][$batch_counter]['username'][] = $user_email = User::generateEmailFromFullName($item[$asset_tag][$batch_counter]['name']); $user->orWhere('username', '=', $user_email); $user_query .= ', or on username '.$user_email; } } - if ($request->input('match_username') == '1'){ + if ($request->input('match_username') == '1') { // Added #8825: add explicit username lookup - $raw_username = $item[$asset_tag][$batch_counter]['name']; - $user->orWhere('username', '=', $raw_username); - $user_query .= ', or on username ' . $raw_username; + $raw_username = $item[$asset_tag][$batch_counter]['name']; + $user->orWhere('username', '=', $raw_username); + $user_query .= ', or on username '.$raw_username; } // A matching user was found @@ -668,7 +660,7 @@ class AssetsController extends Controller //$user is now matched user from db $item[$asset_tag][$batch_counter]['user_id'] = $user->id; - Actionlog::firstOrCreate(array( + Actionlog::firstOrCreate([ 'item_id' => $asset->id, 'item_type' => Asset::class, 'user_id' => Auth::user()->id, @@ -677,7 +669,7 @@ class AssetsController extends Controller 'target_type' => User::class, 'created_at' => $item[$asset_tag][$batch_counter]['checkout_date'], 'action_type' => 'checkout', - )); + ]); $checkin_date = $item[$asset_tag][$batch_counter]['checkin_date']; @@ -685,7 +677,7 @@ class AssetsController extends Controller //if checkin date header exists, assume that empty or future date is still checked out //if checkin is before todays date, assume it's checked in and do not assign user ID, if checkin date is in the future or blank, this is the expected checkin date, items is checked out - + if ((strtotime($checkin_date) > strtotime(Carbon::now())) || (empty($checkin_date)) ) { //only do this if item is checked out @@ -694,29 +686,27 @@ class AssetsController extends Controller } } - if (!empty($checkin_date)) { + if (! empty($checkin_date)) { //only make a checkin there is a valid checkin date or we created one on import. - Actionlog::firstOrCreate(array( - 'item_id' => - $item[$asset_tag][$batch_counter]['asset_id'], + Actionlog::firstOrCreate([ + 'item_id' => $item[$asset_tag][$batch_counter]['asset_id'], 'item_type' => Asset::class, 'user_id' => Auth::user()->id, - 'note' => 'Checkin imported by ' . Auth::user()->present()->fullName() . ' from history importer', + 'note' => 'Checkin imported by '.Auth::user()->present()->fullName().' from history importer', 'target_id' => null, 'created_at' => $checkin_date, - 'action_type' => 'checkin' - )); - + 'action_type' => 'checkin', + ]); } - + if ($asset->save()) { - $status['success'][]['asset'][$asset_tag]['msg'] = 'Asset successfully matched for '.Helper::array_smart_fetch($row, "name").$user_query.' on '.$item[$asset_tag][$batch_counter]['checkout_date']; + $status['success'][]['asset'][$asset_tag]['msg'] = 'Asset successfully matched for '.Helper::array_smart_fetch($row, 'name').$user_query.' on '.$item[$asset_tag][$batch_counter]['checkout_date']; } else { $status['error'][]['asset'][$asset_tag]['msg'] = 'Asset and user was matched but could not be saved.'; } } else { $item[$asset_tag][$batch_counter]['user_id'] = null; - $status['error'][]['user'][Helper::array_smart_fetch($row, "name")]['msg'] = 'User does not exist so no checkin log was created.'; + $status['error'][]['user'][Helper::array_smart_fetch($row, 'name')]['msg'] = 'User does not exist so no checkin log was created.'; } } else { $item[$asset_tag][$batch_counter]['asset_id'] = null; @@ -724,6 +714,7 @@ class AssetsController extends Controller } } } + return view('hardware/history')->with('status', $status); } @@ -752,12 +743,13 @@ class AssetsController extends Controller $logaction = new Actionlog(); $logaction->item_type = Asset::class; $logaction->item_id = $asset->id; - $logaction->created_at = date("Y-m-d H:i:s"); + $logaction->created_at = date('Y-m-d H:i:s'); $logaction->user_id = Auth::user()->id; $logaction->logaction('restored'); return redirect()->route('hardware.index')->with('success', trans('admin/hardware/message.restore.success')); } + return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist')); } @@ -765,41 +757,42 @@ class AssetsController extends Controller { $this->authorize('audit', Asset::class); $dt = Carbon::now()->addMonths(12)->toDateString(); + return view('hardware/quickscan')->with('next_audit_date', $dt); } - - public function audit($id) { $settings = Setting::getSettings(); $this->authorize('audit', Asset::class); $dt = Carbon::now()->addMonths($settings->audit_interval)->toDateString(); $asset = Asset::findOrFail($id); + return view('hardware/audit')->with('asset', $asset)->with('next_audit_date', $dt)->with('locations_list'); } public function dueForAudit() { $this->authorize('audit', Asset::class); + return view('hardware/audit-due'); } public function overdueForAudit() { $this->authorize('audit', Asset::class); + return view('hardware/audit-overdue'); } - public function auditStore(Request $request, $id) { $this->authorize('audit', Asset::class); - $rules = array( + $rules = [ 'location_id' => 'exists:locations,id|nullable|numeric', - 'next_audit_date' => 'date|nullable' - ); + 'next_audit_date' => 'date|nullable', + ]; $validator = \Validator::make($request->all(), $rules); @@ -817,18 +810,19 @@ class AssetsController extends Controller // Check to see if they checked the box to update the physical location, // not just note it in the audit notes - if ($request->input('update_location')=='1') { + if ($request->input('update_location') == '1') { \Log::debug('update location in audit'); $asset->location_id = $request->input('location_id'); } - if ($asset->save()) { $file_name = ''; // Upload an image, if attached if ($request->hasFile('image')) { $path = 'private_uploads/audits'; - if (!Storage::exists($path)) Storage::makeDirectory($path, 775); + if (! Storage::exists($path)) { + Storage::makeDirectory($path, 775); + } $upload = $image = $request->file('image'); $ext = $image->getClientOriginalExtension(); $file_name = 'audit-'.str_random(18).'.'.$ext; @@ -837,7 +831,7 @@ class AssetsController extends Controller $asset->logAudit($request->input('note'), $request->input('location_id'), $file_name); - return redirect()->to("hardware")->with('success', trans('admin/hardware/message.audit.success')); + return redirect()->to('hardware')->with('success', trans('admin/hardware/message.audit.success')); } } @@ -853,5 +847,4 @@ class AssetsController extends Controller return view('hardware/requested', compact('requestedItems')); } - } diff --git a/app/Http/Controllers/Assets/BulkAssetsController.php b/app/Http/Controllers/Assets/BulkAssetsController.php index 1a6da89c96..164c0f96a1 100644 --- a/app/Http/Controllers/Assets/BulkAssetsController.php +++ b/app/Http/Controllers/Assets/BulkAssetsController.php @@ -28,14 +28,15 @@ class BulkAssetsController extends Controller { $this->authorize('update', Asset::class); - if (!$request->filled('ids')) { + if (! $request->filled('ids')) { return redirect()->back()->with('error', 'No assets selected'); } - $asset_ids = array_keys($request->input('ids')); + + $asset_ids = array_values(array_unique($request->input('ids'))); if ($request->filled('bulk_actions')) { - switch($request->input('bulk_actions')) { + switch ($request->input('bulk_actions')) { case 'labels': return view('hardware/labels') ->with('assets', Asset::find($asset_ids)) @@ -47,13 +48,15 @@ class BulkAssetsController extends Controller $assets->each(function ($asset) { $this->authorize('delete', $asset); }); + return view('hardware/bulk-delete')->with('assets', $assets); case 'edit': return view('hardware/bulk') - ->with('assets', request('ids')) + ->with('assets', $asset_ids) ->with('statuslabel_list', Helper::statusLabelList()); } } + return redirect()->back()->with('error', 'No action selected'); } @@ -71,8 +74,8 @@ class BulkAssetsController extends Controller \Log::debug($request->input('ids')); - if(!$request->filled('ids') || count($request->input('ids')) <= 0) { - return redirect()->route("hardware.index")->with('warning', trans('No assets selected, so nothing was updated.')); + if (! $request->filled('ids') || count($request->input('ids')) <= 0) { + return redirect()->route('hardware.index')->with('warning', trans('No assets selected, so nothing was updated.')); } $assets = array_keys($request->input('ids')); @@ -90,6 +93,7 @@ class BulkAssetsController extends Controller || ($request->filled('model_id')) ) { foreach ($assets as $assetId) { + $this->update_array = []; $this->conditionallyAddItem('purchase_date') @@ -102,12 +106,12 @@ class BulkAssetsController extends Controller ->conditionallyAddItem('warranty_months'); if ($request->filled('purchase_cost')) { - $this->update_array['purchase_cost'] = Helper::ParseFloat($request->input('purchase_cost')); + $this->update_array['purchase_cost'] = Helper::ParseCurrency($request->input('purchase_cost')); } if ($request->filled('company_id')) { - $this->update_array['company_id'] = $request->input('company_id'); - if ($request->input('company_id')=="clear") { + $this->update_array['company_id'] = $request->input('company_id'); + if ($request->input('company_id') == 'clear') { $this->update_array['company_id'] = null; } } @@ -123,29 +127,31 @@ class BulkAssetsController extends Controller ->where('id', $assetId) ->update($this->update_array); } // endforeach - return redirect()->route("hardware.index")->with('success', trans('admin/hardware/message.update.success')); - // no values given, nothing to update - } - return redirect()->route("hardware.index")->with('warning', trans('admin/hardware/message.update.nothing_updated')); + return redirect()->route('hardware.index')->with('success', trans('admin/hardware/message.update.success')); + // no values given, nothing to update + } + + return redirect()->route('hardware.index')->with('warning', trans('admin/hardware/message.update.nothing_updated')); } /** * Array to store update data per item - * @var Array + * @var array */ private $update_array; /** * Adds parameter to update array for an item if it exists in request - * @param String $field field name + * @param string $field field name * @return BulkAssetsController Model for Chaining */ protected function conditionallyAddItem($field) { - if(request()->filled($field)) { + if (request()->filled($field)) { $this->update_array[$field] = request()->input($field); } + return $this; } @@ -173,10 +179,12 @@ class BulkAssetsController extends Controller ->where('id', $asset->id) ->update($update_array); } // endforeach - return redirect()->to("hardware")->with('success', trans('admin/hardware/message.delete.success')); + + return redirect()->to('hardware')->with('success', trans('admin/hardware/message.delete.success')); // no values given, nothing to update } - return redirect()->to("hardware")->with('info', trans('admin/hardware/message.delete.nothing_updated')); + + return redirect()->to('hardware')->with('info', trans('admin/hardware/message.delete.nothing_updated')); } /** @@ -202,21 +210,21 @@ class BulkAssetsController extends Controller $target = $this->determineCheckoutTarget(); - if (!is_array($request->get('selected_assets'))) { + if (! is_array($request->get('selected_assets'))) { return redirect()->route('hardware/bulkcheckout')->withInput()->with('error', trans('admin/hardware/message.checkout.no_assets_selected')); } $asset_ids = array_filter($request->get('selected_assets')); - if(request('checkout_to_type') =='asset') { + if (request('checkout_to_type') == 'asset') { foreach ($asset_ids as $asset_id) { - if ($target->id == $asset_id) { + if ($target->id == $asset_id) { return redirect()->back()->with('error', 'You cannot check an asset out to itself.'); } } } - $checkout_at = date("Y-m-d H:i:s"); - if (($request->filled('checkout_at')) && ($request->get('checkout_at')!= date("Y-m-d"))) { + $checkout_at = date('Y-m-d H:i:s'); + if (($request->filled('checkout_at')) && ($request->get('checkout_at') != date('Y-m-d'))) { $checkout_at = e($request->get('checkout_at')); } @@ -228,13 +236,12 @@ class BulkAssetsController extends Controller $errors = []; DB::transaction(function () use ($target, $admin, $checkout_at, $expected_checkin, $errors, $asset_ids, $request) { - foreach ($asset_ids as $asset_id) { $asset = Asset::findOrFail($asset_id); $this->authorize('checkout', $asset); $error = $asset->checkOut($target, $admin, $checkout_at, $expected_checkin, e($request->get('note')), null); - if ($target->location_id!='') { + if ($target->location_id != '') { $asset->location_id = $target->location_id; $asset->unsetEventDispatcher(); $asset->save(); @@ -246,14 +253,14 @@ class BulkAssetsController extends Controller } }); - if (!$errors) { - // Redirect to the new asset page - return redirect()->to("hardware")->with('success', trans('admin/hardware/message.checkout.success')); + if (! $errors) { + // Redirect to the new asset page + return redirect()->to('hardware')->with('success', trans('admin/hardware/message.checkout.success')); } // Redirect to the asset management page with error - return redirect()->to("hardware/bulk-checkout")->with('error', trans('admin/hardware/message.checkout.error'))->withErrors($errors); + return redirect()->to('hardware/bulk-checkout')->with('error', trans('admin/hardware/message.checkout.error'))->withErrors($errors); } catch (ModelNotFoundException $e) { - return redirect()->to("hardware/bulk-checkout")->with('error', $e->getErrors()); + return redirect()->to('hardware/bulk-checkout')->with('error', $e->getErrors()); } } } diff --git a/app/Http/Controllers/Auth/ForgotPasswordController.php b/app/Http/Controllers/Auth/ForgotPasswordController.php index d54ca4ed09..8912da442f 100644 --- a/app/Http/Controllers/Auth/ForgotPasswordController.php +++ b/app/Http/Controllers/Auth/ForgotPasswordController.php @@ -29,6 +29,7 @@ class ForgotPasswordController extends Controller public function __construct() { $this->middleware('guest'); + $this->middleware('throttle:5,1', ['except' => 'showLinkRequestForm']); } /** @@ -41,8 +42,6 @@ class ForgotPasswordController extends Controller return property_exists($this, 'subject') ? $this->subject : \Lang::get('mail.reset_link'); } - - /** * Send a reset link to the given user. * @@ -57,12 +56,9 @@ class ForgotPasswordController extends Controller * buffer overflow issues with attackers sending very large * payloads through. */ - $request->validate([ 'username' => ['required', 'max:255'], ]); - - /** * If we find a matching email with an activated user, we will @@ -71,13 +67,21 @@ class ForgotPasswordController extends Controller * Once we have attempted to send the link, we will examine the response * then see the message we need to show to the user. Finally, we'll send out a proper response. */ - $response = $this->broker()->sendResetLink( - array_merge( - $request->only('username'), - ['activated' => '1'], - ['ldap_import' => '0'] - ) - ); + + $response = null; + + try { + $response = $this->broker()->sendResetLink( + array_merge( + $request->only('username'), + ['activated' => '1'], + ['ldap_import' => '0'] + ) + ); + } catch(\Exception $e) { + \Log::info('Password reset attempt: User '.$request->input('username').'failed with exception: '.$e ); + } + if ($response === \Password::RESET_LINK_SENT) { \Log::info('Password reset attempt: User '.$request->input('username').' WAS found, password reset sent'); @@ -85,7 +89,6 @@ class ForgotPasswordController extends Controller \Log::info('Password reset attempt: User matching username '.$request->input('username').' NOT FOUND or user is inactive'); } - /** * If an error was returned by the password broker, we will get this message * translated so we can notify a user of the problem. We'll redirect back @@ -101,8 +104,6 @@ class ForgotPasswordController extends Controller // Regardless of response, we do not want to disclose the status of a user account, // so we give them a generic "If this exists, we're TOTALLY gonna email you" response - return redirect()->route('login')->with('success',trans('passwords.sent')); + return redirect()->route('login')->with('success', trans('passwords.sent')); } - - } diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php index 58c07ed23c..2c94cc70b2 100644 --- a/app/Http/Controllers/Auth/LoginController.php +++ b/app/Http/Controllers/Auth/LoginController.php @@ -27,7 +27,6 @@ use Redirect; */ class LoginController extends Controller { - use ThrottlesLogins; // This tells the auth controller to use username instead of email address @@ -61,13 +60,13 @@ class LoginController extends Controller public function __construct(/*LdapAd $ldap, */ Saml $saml) { parent::__construct(); - $this->middleware('guest', ['except' => ['logout','postTwoFactorAuth','getTwoFactorAuth','getTwoFactorEnroll']]); + $this->middleware('guest', ['except' => ['logout', 'postTwoFactorAuth', 'getTwoFactorAuth', 'getTwoFactorEnroll']]); Session::put('backUrl', \URL::previous()); // $this->ldap = $ldap; $this->saml = $saml; } - function showLoginForm(Request $request) + public function showLoginForm(Request $request) { $this->loginViaRemoteUser($request); $this->loginViaSaml($request); @@ -75,11 +74,11 @@ class LoginController extends Controller return redirect()->intended('/'); } - if ($this->saml->isEnabled() && Setting::getSettings()->saml_forcelogin == "1" && !($request->has('nosaml') || $request->session()->has('error'))) { + if ($this->saml->isEnabled() && Setting::getSettings()->saml_forcelogin == '1' && ! ($request->has('nosaml') || $request->session()->has('error'))) { return redirect()->route('saml.login'); } - if (Setting::getSettings()->login_common_disabled == "1") { + if (Setting::getSettings()->login_common_disabled == '1') { return view('errors.403'); } @@ -88,27 +87,27 @@ class LoginController extends Controller /** * Log in a user by SAML - * + * * @author Johnson Yi - * + * * @since 5.0.0 * * @param Request $request - * + * * @return User - * + * * @throws \Exception */ private function loginViaSaml(Request $request) { $saml = $this->saml; $samlData = $request->session()->get('saml_login'); - if ($saml->isEnabled() && !empty($samlData)) { + if ($saml->isEnabled() && ! empty($samlData)) { try { - Log::debug("Attempting to log user in by SAML authentication."); + Log::debug('Attempting to log user in by SAML authentication.'); $user = $saml->samlLogin($samlData); - if(!is_null($user)) { - Auth::login($user, true); + if (! is_null($user)) { + Auth::login($user); } else { $username = $saml->getUsername(); \Log::warning("SAML user '$username' could not be found in database."); @@ -121,7 +120,7 @@ class LoginController extends Controller $user->save(); } } catch (\Exception $e) { - \Log::warning("There was an error authenticating the SAML user: " . $e->getMessage()); + \Log::warning('There was an error authenticating the SAML user: '.$e->getMessage()); throw new \Exception($e->getMessage()); } } @@ -129,24 +128,24 @@ class LoginController extends Controller /** * Log in a user by LDAP - * + * * @author Wes Hulette - * + * * @since 5.0.0 * * @param Request $request - * + * * @return User - * + * * @throws \Exception */ private function loginViaLdap(Request $request): User { - $ldap = \App::make( LdapAd::class); + $ldap = \App::make(LdapAd::class); try { return $ldap->ldapLogin($request->input('username'), $request->input('password')); } catch (\Exception $ex) { - LOG::debug("LDAP user login: " . $ex->getMessage()); + LOG::debug('LDAP user login: '.$ex->getMessage()); throw new \Exception($ex->getMessage()); } } @@ -155,7 +154,10 @@ class LoginController extends Controller { $header_name = Setting::getSettings()->login_remote_user_header_name ?: 'REMOTE_USER'; $remote_user = $request->server($header_name); - if (Setting::getSettings()->login_remote_user_enabled == "1" && isset($remote_user) && !empty($remote_user)) { + if (!isset($remote_user)) { + $remote_user = $request->server('REDIRECT_'.$header_name); + } + if (Setting::getSettings()->login_remote_user_enabled == '1' && isset($remote_user) && ! empty($remote_user)) { Log::debug("Authenticating via HTTP header $header_name."); $strip_prefixes = [ @@ -170,7 +172,7 @@ class LoginController extends Controller $pos = 0; foreach ($strip_prefixes as $needle) { - if (($pos = strpos($remote_user, $needle)) !== FALSE) { + if (($pos = strpos($remote_user, $needle)) !== false) { $pos += strlen($needle); break; } @@ -178,14 +180,16 @@ class LoginController extends Controller if ($pos > 0) { $remote_user = substr($remote_user, $pos); - }; - + } + try { $user = User::where('username', '=', $remote_user)->whereNull('deleted_at')->where('activated', '=', '1')->first(); - Log::debug("Remote user auth lookup complete"); - if(!is_null($user)) Auth::login($user, true); - } catch(Exception $e) { - Log::debug("There was an error authenticating the Remote user: " . $e->getMessage()); + Log::debug('Remote user auth lookup complete'); + if (! is_null($user)) { + Auth::login($user, $request->input('remember')); + } + } catch (Exception $e) { + Log::debug('There was an error authenticating the Remote user: '.$e->getMessage()); } } } @@ -197,7 +201,7 @@ class LoginController extends Controller */ public function login(Request $request) { - if (Setting::getSettings()->login_common_disabled == "1") { + if (Setting::getSettings()->login_common_disabled == '1') { return view('errors.403'); } @@ -212,6 +216,7 @@ class LoginController extends Controller if ($lockedOut = $this->hasTooManyLoginAttempts($request)) { $this->fireLockoutEvent($request); + return $this->sendLockoutResponse($request); } @@ -219,34 +224,33 @@ class LoginController extends Controller // Should we even check for LDAP users? if (Setting::getSettings()->ldap_enabled) { // avoid hitting the $this->ldap - LOG::debug("LDAP is enabled."); + LOG::debug('LDAP is enabled.'); try { - LOG::debug("Attempting to log user in by LDAP authentication."); + LOG::debug('Attempting to log user in by LDAP authentication.'); $user = $this->loginViaLdap($request); - Auth::login($user, true); + Auth::login($user, $request->input('remember')); - // If the user was unable to login via LDAP, log the error and let them fall through to + // If the user was unable to login via LDAP, log the error and let them fall through to // local authentication. } catch (\Exception $e) { - Log::debug("There was an error authenticating the LDAP user: ".$e->getMessage()); + Log::debug('There was an error authenticating the LDAP user: '.$e->getMessage()); } } // If the user wasn't authenticated via LDAP, skip to local auth - if (!$user) { - Log::debug("Authenticating user against database."); - // Try to log the user in - if (!Auth::attempt(['username' => $request->input('username'), 'password' => $request->input('password'), 'activated' => 1], $request->input('remember'))) { - - if (!$lockedOut) { + if (! $user) { + Log::debug('Authenticating user against database.'); + // Try to log the user in + if (! Auth::attempt(['username' => $request->input('username'), 'password' => $request->input('password'), 'activated' => 1], $request->input('remember'))) { + if (! $lockedOut) { $this->incrementLoginAttempts($request); } - Log::debug("Local authentication failed."); + Log::debug('Local authentication failed.'); + return redirect()->back()->withInput()->with('error', trans('auth/message.account_not_found')); } else { - - $this->clearLoginAttempts($request); + $this->clearLoginAttempts($request); } } @@ -259,7 +263,6 @@ class LoginController extends Controller return redirect()->intended()->with('success', trans('auth/message.signin.success')); } - /** * Two factor enrollment page * @@ -269,11 +272,10 @@ class LoginController extends Controller { // Make sure the user is logged in - if (!Auth::check()) { + if (! Auth::check()) { return redirect()->route('login')->with('error', trans('auth/general.login_prompt')); } - $settings = Setting::getSettings(); $user = Auth::user(); @@ -283,7 +285,7 @@ class LoginController extends Controller // While you can access this page directly, enrolling a device when 2FA isn't enforced // won't cause any harm. - if (($user->two_factor_secret!='') && ($user->two_factor_enrolled==1)) { + if (($user->two_factor_secret != '') && ($user->two_factor_enrolled == 1)) { return redirect()->route('two-factor')->with('error', trans('auth/message.two_factor.already_enrolled')); } @@ -310,7 +312,6 @@ class LoginController extends Controller return view('auth.two_factor_enroll')->with('barcode_obj', $barcode_obj); } - /** * Two factor code form page * @@ -319,7 +320,7 @@ class LoginController extends Controller public function getTwoFactorAuth() { // Check that the user is logged in - if (!Auth::check()) { + if (! Auth::check()) { return redirect()->route('login')->with('error', trans('auth/general.login_prompt')); } @@ -328,7 +329,7 @@ class LoginController extends Controller // Check whether there is a device enrolled. // This *should* be handled via the \App\Http\Middleware\CheckForTwoFactor middleware // but we're just making sure (in case someone edited the database directly, etc) - if (($user->two_factor_secret=='') || ($user->two_factor_enrolled!=1)) { + if (($user->two_factor_secret == '') || ($user->two_factor_enrolled != 1)) { return redirect()->route('two-factor-enroll'); } @@ -344,16 +345,15 @@ class LoginController extends Controller */ public function postTwoFactorAuth(Request $request) { - - if (!Auth::check()) { + if (! Auth::check()) { return redirect()->route('login')->with('error', trans('auth/general.login_prompt')); } - if (!$request->filled('two_factor_secret')) { + if (! $request->filled('two_factor_secret')) { return redirect()->route('two-factor')->with('error', trans('auth/message.two_factor.code_required')); } - if (!$request->has('two_factor_secret')) { + if (! $request->has('two_factor_secret')) { return redirect()->route('two-factor')->with('error', 'Two-factor code is required.'); } @@ -364,15 +364,13 @@ class LoginController extends Controller $user->two_factor_enrolled = 1; $user->save(); $request->session()->put('2fa_authed', 'true'); + return redirect()->route('home')->with('success', 'You are logged in!'); } return redirect()->route('two-factor')->with('error', trans('auth/message.two_factor.invalid_code')); - - } - /** * Logout page. * @@ -390,15 +388,15 @@ class LoginController extends Controller if ($saml->isEnabled()) { $auth = $saml->getAuth(); $sloRedirectUrl = $request->session()->get('saml_slo_redirect_url'); - - if (!empty($auth->getSLOurl()) && $settings->saml_slo == '1' && $saml->isAuthenticated() && empty($sloRedirectUrl)) { - $sloRequestUrl = $auth->logout(null, array(), $saml->getNameId(), $saml->getSessionIndex(), true, $saml->getNameIdFormat(), $saml->getNameIdNameQualifier(), $saml->getNameIdSPNameQualifier()); + + if (! empty($auth->getSLOurl()) && $settings->saml_slo == '1' && $saml->isAuthenticated() && empty($sloRedirectUrl)) { + $sloRequestUrl = $auth->logout(null, [], $saml->getNameId(), $saml->getSessionIndex(), true, $saml->getNameIdFormat(), $saml->getNameIdNameQualifier(), $saml->getNameIdSPNameQualifier()); } $saml->clearData(); } - if (!empty($sloRequestUrl)) { + if (! empty($sloRequestUrl)) { return redirect()->away($sloRequestUrl); } @@ -407,11 +405,11 @@ class LoginController extends Controller $request->session()->regenerate(true); Auth::logout(); - if (!empty($sloRedirectUrl)) { + if (! empty($sloRedirectUrl)) { return redirect()->away($sloRedirectUrl); } - $customLogoutUrl = $settings->login_remote_user_custom_logout_url ; + $customLogoutUrl = $settings->login_remote_user_custom_logout_url; if ($settings->login_remote_user_enabled == '1' && $customLogoutUrl != '') { return redirect()->away($customLogoutUrl); } @@ -419,7 +417,6 @@ class LoginController extends Controller return redirect()->route('login')->with(['success' => trans('auth/message.logout.success'), 'loggedout' => true]); } - /** * Get a validator for an incoming registration request. * @@ -434,7 +431,6 @@ class LoginController extends Controller ]); } - public function username() { return 'username'; @@ -461,7 +457,6 @@ class LoginController extends Controller ->withErrors([$this->username() => $message]); } - /** * Override the lockout time and duration * @@ -480,13 +475,13 @@ class LoginController extends Controller ); } - public function legacyAuthRedirect() { + public function legacyAuthRedirect() + { return redirect()->route('login'); } public function redirectTo() { - return Session::get('backUrl') ? Session::get('backUrl') : $this->redirectTo; + return Session::get('backUrl') ? Session::get('backUrl') : $this->redirectTo; } - } diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php index 901af3e2d0..1a188b51e1 100644 --- a/app/Http/Controllers/Auth/RegisterController.php +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -6,17 +6,18 @@ use App\Http\Controllers\Controller; class RegisterController extends Controller { - public function __construct() { $this->middleware('guest'); } - public function showRegistrationForm() { - abort(404,'Page not found'); + public function showRegistrationForm() + { + abort(404, 'Page not found'); } - - public function register() { - abort(404,'Page not found'); + + public function register() + { + abort(404, 'Page not found'); } } diff --git a/app/Http/Controllers/Auth/ResetPasswordController.php b/app/Http/Controllers/Auth/ResetPasswordController.php index 92b86fd737..95700e2992 100644 --- a/app/Http/Controllers/Auth/ResetPasswordController.php +++ b/app/Http/Controllers/Auth/ResetPasswordController.php @@ -54,29 +54,25 @@ class ResetPasswordController extends Controller ]; } - protected function credentials(Request $request) { return $request->only( 'username', 'password', 'password_confirmation', 'token' ); } - public function showResetForm(Request $request, $token = null) { return view('auth.passwords.reset')->with( [ 'token' => $token, - 'username' => $request->input('username') + 'username' => $request->input('username'), ] ); } - public function reset(Request $request) { - $messages = [ 'password.not_in' => trans('validation.disallow_same_pwd_as_user_fields'), ]; @@ -87,15 +83,13 @@ class ResetPasswordController extends Controller $user = User::where('username', '=', $request->input('username'))->first(); $broker = $this->broker(); - if (strpos(Setting::passwordComplexityRulesSaving('store'), 'disallow_same_pwd_as_user_fields') !== FALSE) { + if (strpos(Setting::passwordComplexityRulesSaving('store'), 'disallow_same_pwd_as_user_fields') !== false) { $request->validate( [ - 'password' => 'required|notIn:["'.$user->email.'","'.$user->username.'","'.$user->first_name.'","'.$user->last_name.'"' + 'password' => 'required|notIn:["'.$user->email.'","'.$user->username.'","'.$user->first_name.'","'.$user->last_name.'"', ], $messages); - } - $response = $broker->reset( $this->credentials($request), function ($user, $password) { $this->resetPassword($user, $password); @@ -107,14 +101,10 @@ class ResetPasswordController extends Controller : $this->sendResetFailedResponse($request, $response); } - protected function sendResetFailedResponse(Request $request, $response) { return redirect()->back() ->withInput(['username'=> $request->input('username')]) ->withErrors(['username' => trans($response), 'password' => trans($response)]); } - - - } diff --git a/app/Http/Controllers/Auth/SamlController.php b/app/Http/Controllers/Auth/SamlController.php index 5a2075daed..41eda91d9c 100644 --- a/app/Http/Controllers/Auth/SamlController.php +++ b/app/Http/Controllers/Auth/SamlController.php @@ -2,9 +2,9 @@ namespace App\Http\Controllers\Auth; -use Illuminate\Http\Request; use App\Http\Controllers\Controller; use App\Services\Saml; +use Illuminate\Http\Request; use Log; /** @@ -30,20 +30,20 @@ class SamlController extends Controller { $this->saml = $saml; - $this->middleware('guest', ['except' => ['metadata','sls']]); + $this->middleware('guest', ['except' => ['metadata', 'sls']]); } /** * Return SAML SP metadata for Snipe-IT - * + * * /saml/metadata - * + * * @author Johnson Yi - * + * * @since 5.0.0 * * @param Request $request - * + * * @return Response */ public function metadata(Request $request) @@ -53,7 +53,7 @@ class SamlController extends Controller if (empty($metadata)) { return response()->view('errors.403', [], 403); } - + return response()->streamDownload(function () use ($metadata) { echo $metadata; }, 'snipe-it-metadata.xml', ['Content-Type' => 'text/xml']); @@ -61,36 +61,37 @@ class SamlController extends Controller /** * Begin the SP-Initiated SSO by sending AuthN to the IdP. - * + * * /login/saml - * + * * @author Johnson Yi - * + * * @since 5.0.0 * * @param Request $request - * + * * @return Redirect */ public function login(Request $request) { $auth = $this->saml->getAuth(); - $ssoUrl = $auth->login(null, array(), false, false, false, false); + $ssoUrl = $auth->login(null, [], false, false, false, false); + return redirect()->away($ssoUrl); } /** * Receives, parses the assertion from IdP and flashes SAML data * back to the LoginController for authentication. - * + * * /saml/acs - * + * * @author Johnson Yi - * + * * @since 5.0.0 * * @param Request $request - * + * * @return Redirect */ public function acs(Request $request) @@ -100,9 +101,10 @@ class SamlController extends Controller $auth->processResponse(); $errors = $auth->getErrors(); - if (!empty($errors)) { - Log::error("There was an error with SAML ACS: " . implode(', ', $errors)); - Log::error("Reason: " . $auth->getLastErrorReason()); + if (! empty($errors)) { + Log::error('There was an error with SAML ACS: '.implode(', ', $errors)); + Log::error('Reason: '.$auth->getLastErrorReason()); + return redirect()->route('login')->with('error', trans('auth/message.signin.error')); } @@ -114,15 +116,15 @@ class SamlController extends Controller /** * Receives LogoutRequest/LogoutResponse from IdP and flashes * back to the LoginController for logging out. - * + * * /saml/sls - * + * * @author Johnson Yi - * + * * @since 5.0.0 * * @param Request $request - * + * * @return Redirect */ public function sls(Request $request) @@ -131,10 +133,11 @@ class SamlController extends Controller $retrieveParametersFromServer = $this->saml->getSetting('retrieveParametersFromServer', false); $sloUrl = $auth->processSLO(true, null, $retrieveParametersFromServer, null, true); $errors = $auth->getErrors(); - - if (!empty($errors)) { - Log::error("There was an error with SAML SLS: " . implode(', ', $errors)); - Log::error("Reason: " . $auth->getLastErrorReason()); + + if (! empty($errors)) { + Log::error('There was an error with SAML SLS: '.implode(', ', $errors)); + Log::error('Reason: '.$auth->getLastErrorReason()); + return view('errors.403'); } diff --git a/app/Http/Controllers/BulkAssetModelsController.php b/app/Http/Controllers/BulkAssetModelsController.php index 088e8da509..acb8e30b70 100644 --- a/app/Http/Controllers/BulkAssetModelsController.php +++ b/app/Http/Controllers/BulkAssetModelsController.php @@ -10,7 +10,7 @@ use Illuminate\Support\Facades\Redirect; class BulkAssetModelsController extends Controller { - /** + /** * Returns a view that allows the user to bulk edit model attrbutes * * @author [A. Gianotto] [] @@ -24,26 +24,27 @@ class BulkAssetModelsController extends Controller // Make sure some IDs have been selected if ((is_array($models_raw_array)) && (count($models_raw_array) > 0)) { - $models = AssetModel::whereIn('id', $models_raw_array) ->withCount('assets as assets_count') ->orderBy('assets_count', 'ASC') ->get(); // If deleting.... - if ($request->input('bulk_actions')=='delete') { + if ($request->input('bulk_actions') == 'delete') { $valid_count = 0; foreach ($models as $model) { if ($model->assets_count == 0) { $valid_count++; } } + return view('models/bulk-delete', compact('models'))->with('valid_count', $valid_count); - // Otherwise display the bulk edit screen + // Otherwise display the bulk edit screen } $nochange = ['NC' => 'No Change']; + return view('models/bulk-edit', compact('models')) ->with('fieldset_list', $nochange + Helper::customFieldsetList()) ->with('depreciation_list', $nochange + Helper::depreciationList()); @@ -63,34 +64,36 @@ class BulkAssetModelsController extends Controller */ public function update(Request $request) { - $models_raw_array = $request->input('ids'); - $update_array = array(); + $update_array = []; - if (($request->filled('manufacturer_id') && ($request->input('manufacturer_id')!='NC'))) { + if (($request->filled('manufacturer_id') && ($request->input('manufacturer_id') != 'NC'))) { $update_array['manufacturer_id'] = $request->input('manufacturer_id'); } - if (($request->filled('category_id') && ($request->input('category_id')!='NC'))) { + if (($request->filled('category_id') && ($request->input('category_id') != 'NC'))) { $update_array['category_id'] = $request->input('category_id'); } - if ($request->input('fieldset_id')!='NC') { + if ($request->input('fieldset_id') != 'NC') { $update_array['fieldset_id'] = $request->input('fieldset_id'); } - if ($request->input('depreciation_id')!='NC') { + if ($request->input('depreciation_id') != 'NC') { $update_array['depreciation_id'] = $request->input('depreciation_id'); } + if ($request->filled('requestable') != '') { + $update_array['requestable'] = $request->input('requestable'); + } + - if (count($update_array) > 0) { AssetModel::whereIn('id', $models_raw_array)->update($update_array); + return redirect()->route('models.index') ->with('success', trans('admin/models/message.bulkedit.success')); } return redirect()->route('models.index') ->with('warning', trans('admin/models/message.bulkedit.error')); - } /** @@ -106,7 +109,6 @@ class BulkAssetModelsController extends Controller $models_raw_array = $request->input('ids'); if ((is_array($models_raw_array)) && (count($models_raw_array) > 0)) { - $models = AssetModel::whereIn('id', $models_raw_array)->withCount('assets as assets_count')->get(); $del_error_count = 0; @@ -123,7 +125,7 @@ class BulkAssetModelsController extends Controller if ($del_error_count == 0) { return redirect()->route('models.index') - ->with('success', trans('admin/models/message.bulkdelete.success',['success_count'=> $del_count] )); + ->with('success', trans('admin/models/message.bulkdelete.success', ['success_count'=> $del_count])); } return redirect()->route('models.index') @@ -132,7 +134,5 @@ class BulkAssetModelsController extends Controller return redirect()->route('models.index') ->with('error', trans('admin/models/message.bulkdelete.error')); - } - } diff --git a/app/Http/Controllers/CategoriesController.php b/app/Http/Controllers/CategoriesController.php index 244a687ede..5844b54dc8 100755 --- a/app/Http/Controllers/CategoriesController.php +++ b/app/Http/Controllers/CategoriesController.php @@ -1,4 +1,5 @@ authorize('view', Category::class); + return view('categories/index'); } - /** * Returns a form view to create a new category. * @@ -49,11 +49,11 @@ class CategoriesController extends Controller { // Show the page $this->authorize('create', Category::class); + return view('categories/edit')->with('item', new Category) ->with('category_types', Helper::categoryTypeList()); } - /** * Validates and stores the new category data. * @@ -68,13 +68,13 @@ class CategoriesController extends Controller { $this->authorize('create', Category::class); $category = new Category(); - $category->name = $request->input('name'); - $category->category_type = $request->input('category_type'); - $category->eula_text = $request->input('eula_text'); - $category->use_default_eula = $request->input('use_default_eula', '0'); - $category->require_acceptance = $request->input('require_acceptance', '0'); - $category->checkin_email = $request->input('checkin_email', '0'); - $category->user_id = Auth::id(); + $category->name = $request->input('name'); + $category->category_type = $request->input('category_type'); + $category->eula_text = $request->input('eula_text'); + $category->use_default_eula = $request->input('use_default_eula', '0'); + $category->require_acceptance = $request->input('require_acceptance', '0'); + $category->checkin_email = $request->input('checkin_email', '0'); + $category->user_id = Auth::id(); $category = $request->handleImages($category); if ($category->save()) { @@ -100,11 +100,11 @@ class CategoriesController extends Controller if (is_null($item = Category::find($categoryId))) { return redirect()->route('categories.index')->with('error', trans('admin/categories/message.does_not_exist')); } + return view('categories/edit', compact('item')) ->with('category_types', Helper::categoryTypeList()); } - /** * Validates and stores the updated category data. * @@ -125,15 +125,14 @@ class CategoriesController extends Controller } // Update the category data - $category->name = $request->input('name'); + $category->name = $request->input('name'); // If the item count is > 0, we disable the category type in the edit. Disabled items // don't POST, so if the category_type is blank we just set it to the default. - $category->category_type = $request->input('category_type', $category->category_type); - $category->eula_text = $request->input('eula_text'); - $category->use_default_eula = $request->input('use_default_eula', '0'); - $category->require_acceptance = $request->input('require_acceptance', '0'); - $category->checkin_email = $request->input('checkin_email', '0'); - + $category->category_type = $request->input('category_type', $category->category_type); + $category->eula_text = $request->input('eula_text'); + $category->use_default_eula = $request->input('use_default_eula', '0'); + $category->require_acceptance = $request->input('require_acceptance', '0'); + $category->checkin_email = $request->input('checkin_email', '0'); $category = $request->handleImages($category); @@ -162,8 +161,8 @@ class CategoriesController extends Controller return redirect()->route('categories.index')->with('error', trans('admin/categories/message.not_found')); } - if (!$category->isDeletable()) { - return redirect()->route('categories.index')->with('error', trans('admin/categories/message.assoc_items', ['asset_type'=> $category->category_type ])); + if (! $category->isDeletable()) { + return redirect()->route('categories.index')->with('error', trans('admin/categories/message.assoc_items', ['asset_type'=> $category->category_type])); } Storage::disk('public')->delete('categories'.'/'.$category->image); @@ -172,7 +171,6 @@ class CategoriesController extends Controller return redirect()->route('categories.index')->with('success', trans('admin/categories/message.delete.success')); } - /** * Returns a view that invokes the ajax tables which actually contains * the content for the categories detail view, which is generated in getDataView. @@ -188,20 +186,20 @@ class CategoriesController extends Controller { $this->authorize('view', Category::class); if ($category = Category::find($id)) { - - if ($category->category_type=='asset') { + if ($category->category_type == 'asset') { $category_type = 'hardware'; $category_type_route = 'assets'; - } elseif ($category->category_type=='accessory') { + } elseif ($category->category_type == 'accessory') { $category_type = 'accessories'; $category_type_route = 'accessories'; } else { $category_type = $category->category_type; $category_type_route = $category->category_type.'s'; } + return view('categories/view', compact('category')) - ->with('category_type',$category_type) - ->with('category_type_route',$category_type_route); + ->with('category_type', $category_type) + ->with('category_type_route', $category_type_route); } return redirect()->route('categories.index')->with('error', trans('admin/categories/message.does_not_exist')); diff --git a/app/Http/Controllers/CheckInOutRequest.php b/app/Http/Controllers/CheckInOutRequest.php index f080dac4e3..6dd7e4aba3 100644 --- a/app/Http/Controllers/CheckInOutRequest.php +++ b/app/Http/Controllers/CheckInOutRequest.php @@ -1,4 +1,5 @@ location_id = $target->id; + Asset::where('assigned_type', 'App\Models\Asset')->where('assigned_to', $asset->id) + ->update(['location_id' => $asset->location_id]); break; case 'asset': $asset->location_id = $target->rtd_location_id; // Override with the asset's location_id if it has one - if ($target->location_id!='') { + if ($target->location_id != '') { $asset->location_id = $target->location_id; } break; @@ -51,6 +53,7 @@ trait CheckInOutRequest $asset->location_id = $target->location_id; break; } + return $asset; } } diff --git a/app/Http/Controllers/CompaniesController.php b/app/Http/Controllers/CompaniesController.php index fbb5754a51..396ec5ef68 100644 --- a/app/Http/Controllers/CompaniesController.php +++ b/app/Http/Controllers/CompaniesController.php @@ -1,4 +1,5 @@ route('companies.index') ->with('success', trans('admin/companies/message.create.success')); } + return redirect()->back()->withInput()->withErrors($company->getErrors()); } - /** * Return form to edit existing company. * @@ -113,14 +112,13 @@ final class CompaniesController extends Controller $company->name = $request->input('name'); - $company = $request->handleImages($company); - if ($company->save()) { return redirect()->route('companies.index') ->with('success', trans('admin/companies/message.update.success')); } + return redirect()->route('companies.edit', ['company' => $companyId]) ->with('error', trans('admin/companies/message.update.error')); } @@ -142,13 +140,13 @@ final class CompaniesController extends Controller } $this->authorize('delete', $company); - if(!$company->isDeletable()) { + if (! $company->isDeletable()) { return redirect()->route('companies.index') ->with('error', trans('admin/companies/message.assoc_users')); } if ($company->image) { - try { + try { Storage::disk('public')->delete('companies'.'/'.$company->image); } catch (\Exception $e) { \Log::debug($e); @@ -156,11 +154,13 @@ final class CompaniesController extends Controller } $company->delete(); + return redirect()->route('companies.index') ->with('success', trans('admin/companies/message.delete.success')); } - public function show($id) { + public function show($id) + { $this->authorize('view', Company::class); if (is_null($company = Company::find($id))) { @@ -168,6 +168,6 @@ final class CompaniesController extends Controller ->with('error', trans('admin/companies/message.not_found')); } - return view('companies/view')->with('company',$company); + return view('companies/view')->with('company', $company); } } diff --git a/app/Http/Controllers/Components/ComponentCheckinController.php b/app/Http/Controllers/Components/ComponentCheckinController.php index eee0f15827..09acee0277 100644 --- a/app/Http/Controllers/Components/ComponentCheckinController.php +++ b/app/Http/Controllers/Components/ComponentCheckinController.php @@ -15,7 +15,6 @@ use Illuminate\Support\Facades\Validator; class ComponentCheckinController extends Controller { - /** * Returns a view that allows the checkin of a component from an asset. * @@ -39,14 +38,13 @@ class ComponentCheckinController extends Controller trans('admin/components/message.not_found')); } $this->authorize('checkin', $component); - return view('components/checkin', compact('component_assets','component','asset')); + + return view('components/checkin', compact('component_assets', 'component', 'asset')); } return redirect()->route('components.index')->with('error', trans('admin/components/messages.not_found')); - } - /** * Validate and store checkin data. * @@ -66,12 +64,11 @@ class ComponentCheckinController extends Controller trans('admin/components/message.not_found')); } - $this->authorize('checkin', $component); $max_to_checkin = $component_assets->assigned_qty; $validator = Validator::make($request->all(), [ - "checkin_qty" => "required|numeric|between:1,$max_to_checkin" + 'checkin_qty' => "required|numeric|between:1,$max_to_checkin", ]); if ($validator->fails()) { @@ -81,7 +78,7 @@ class ComponentCheckinController extends Controller } // Validation passed, so let's figure out what we have to do here. - $qty_remaining_in_checkout = ($component_assets->assigned_qty - (int)$request->input('checkin_qty')); + $qty_remaining_in_checkout = ($component_assets->assigned_qty - (int) $request->input('checkin_qty')); // We have to modify the record to reflect the new qty that's // actually checked out. @@ -102,7 +99,7 @@ class ComponentCheckinController extends Controller return redirect()->route('components.index')->with('success', trans('admin/components/message.checkin.success')); } + return redirect()->route('components.index')->with('error', trans('admin/components/message.does_not_exist')); } - } diff --git a/app/Http/Controllers/Components/ComponentCheckoutController.php b/app/Http/Controllers/Components/ComponentCheckoutController.php index 4ae37dbd0a..ffeaf1b829 100644 --- a/app/Http/Controllers/Components/ComponentCheckoutController.php +++ b/app/Http/Controllers/Components/ComponentCheckoutController.php @@ -32,6 +32,7 @@ class ComponentCheckoutController extends Controller return redirect()->route('components.index')->with('error', trans('admin/components/message.not_found')); } $this->authorize('checkout', $component); + return view('components/checkout', compact('component')); } @@ -58,8 +59,8 @@ class ComponentCheckoutController extends Controller $max_to_checkout = $component->numRemaining(); $validator = Validator::make($request->all(), [ - "asset_id" => "required", - "assigned_qty" => "required|numeric|between:1,$max_to_checkout" + 'asset_id' => 'required', + 'assigned_qty' => "required|numeric|between:1,$max_to_checkout", ]); if ($validator->fails()) { @@ -78,14 +79,14 @@ class ComponentCheckoutController extends Controller } // Update the component data - $component->asset_id = $asset_id; + $component->asset_id = $asset_id; $component->assets()->attach($component->id, [ 'component_id' => $component->id, 'user_id' => $admin_user->id, 'created_at' => date('Y-m-d H:i:s'), 'assigned_qty' => $request->input('assigned_qty'), - 'asset_id' => $asset_id + 'asset_id' => $asset_id, ]); event(new CheckoutableCheckedOut($component, $asset, Auth::user(), $request->input('note'))); diff --git a/app/Http/Controllers/Components/ComponentsController.php b/app/Http/Controllers/Components/ComponentsController.php index 16dc081342..664dd64937 100644 --- a/app/Http/Controllers/Components/ComponentsController.php +++ b/app/Http/Controllers/Components/ComponentsController.php @@ -1,10 +1,12 @@ authorize('view', Component::class); + return view('components/index'); } @@ -47,11 +50,11 @@ class ComponentsController extends Controller public function create() { $this->authorize('create', Component::class); + return view('components/edit')->with('category_type', 'component') ->with('item', new Component); } - /** * Validate and store data for new component. * @@ -74,7 +77,7 @@ class ComponentsController extends Controller $component->min_amt = $request->input('min_amt', null); $component->serial = $request->input('serial', null); $component->purchase_date = $request->input('purchase_date', null); - $component->purchase_cost = $request->input('purchase_cost', null); + $component->purchase_cost = Helper::ParseCurrency($request->input('purchase_cost', null)); $component->qty = $request->input('qty'); $component->user_id = Auth::id(); @@ -83,6 +86,7 @@ class ComponentsController extends Controller if ($component->save()) { return redirect()->route('components.index')->with('success', trans('admin/components/message.create.success')); } + return redirect()->back()->withInput()->withErrors($component->getErrors()); } @@ -100,8 +104,10 @@ class ComponentsController extends Controller { if ($item = Component::find($componentId)) { $this->authorize('update', $item); + return view('components/edit', compact('item'))->with('category_type', 'component'); } + return redirect()->route('components.index')->with('error', trans('admin/components/message.does_not_exist')); } @@ -124,7 +130,7 @@ class ComponentsController extends Controller } $min = $component->numCHeckedOut(); $validator = Validator::make($request->all(), [ - "qty" => "required|numeric|min:$min" + 'qty' => "required|numeric|min:$min", ]); if ($validator->fails()) { @@ -144,7 +150,7 @@ class ComponentsController extends Controller $component->min_amt = $request->input('min_amt'); $component->serial = $request->input('serial'); $component->purchase_date = $request->input('purchase_date'); - $component->purchase_cost = request('purchase_cost'); + $component->purchase_cost = Helper::ParseCurrency(request('purchase_cost')); $component->qty = $request->input('qty'); $component = $request->handleImages($component); @@ -152,6 +158,7 @@ class ComponentsController extends Controller if ($component->save()) { return redirect()->route('components.index')->with('success', trans('admin/components/message.update.success')); } + return redirect()->back()->withInput()->withErrors($component->getErrors()); } @@ -174,7 +181,7 @@ class ComponentsController extends Controller // Remove the image if one exists if (Storage::disk('public')->exists('components/'.$component->image)) { - try { + try { Storage::disk('public')->delete('components/'.$component->image); } catch (\Exception $e) { \Log::debug($e); @@ -182,6 +189,7 @@ class ComponentsController extends Controller } $component->delete(); + return redirect()->route('components.index')->with('success', trans('admin/components/message.delete.success')); } @@ -201,6 +209,7 @@ class ComponentsController extends Controller if (isset($component->id)) { $this->authorize('view', $component); + return view('components/view', compact('component')); } // Redirect to the user management page diff --git a/app/Http/Controllers/Consumables/ConsumableCheckoutController.php b/app/Http/Controllers/Consumables/ConsumableCheckoutController.php index 8dc43b54c1..03ca2f2052 100644 --- a/app/Http/Controllers/Consumables/ConsumableCheckoutController.php +++ b/app/Http/Controllers/Consumables/ConsumableCheckoutController.php @@ -12,7 +12,6 @@ use Illuminate\Support\Facades\Input; class ConsumableCheckoutController extends Controller { - /** * Return a view to checkout a consumable to a user. * @@ -29,6 +28,7 @@ class ConsumableCheckoutController extends Controller return redirect()->route('consumables.index')->with('error', trans('admin/consumables/message.does_not_exist')); } $this->authorize('checkout', $consumable); + return view('consumables/checkout', compact('consumable')); } @@ -65,13 +65,12 @@ class ConsumableCheckoutController extends Controller $consumable->users()->attach($consumable->id, [ 'consumable_id' => $consumable->id, 'user_id' => $admin_user->id, - 'assigned_to' => e($request->input('assigned_to')) + 'assigned_to' => e($request->input('assigned_to')), ]); event(new CheckoutableCheckedOut($consumable, $user, Auth::user(), $request->input('note'))); // Redirect to the new consumable page return redirect()->route('consumables.index')->with('success', trans('admin/consumables/message.checkout.success')); - } } diff --git a/app/Http/Controllers/Consumables/ConsumablesController.php b/app/Http/Controllers/Consumables/ConsumablesController.php index 69987f1570..dc81f5feed 100644 --- a/app/Http/Controllers/Consumables/ConsumablesController.php +++ b/app/Http/Controllers/Consumables/ConsumablesController.php @@ -30,10 +30,10 @@ class ConsumablesController extends Controller public function index() { $this->authorize('index', Consumable::class); + return view('consumables/index'); } - /** * Return a view to display the form view to create a new consumable * @@ -46,11 +46,11 @@ class ConsumablesController extends Controller public function create() { $this->authorize('create', Consumable::class); + return view('consumables/edit')->with('category_type', 'consumable') ->with('item', new Consumable); } - /** * Validate and store new consumable data. * @@ -75,11 +75,10 @@ class ConsumablesController extends Controller $consumable->model_number = $request->input('model_number'); $consumable->item_no = $request->input('item_no'); $consumable->purchase_date = $request->input('purchase_date'); - $consumable->purchase_cost = Helper::ParseFloat($request->input('purchase_cost')); + $consumable->purchase_cost = Helper::ParseCurrency($request->input('purchase_cost')); $consumable->qty = $request->input('qty'); $consumable->user_id = Auth::id(); - $consumable = $request->handleImages($consumable); if ($consumable->save()) { @@ -87,7 +86,6 @@ class ConsumablesController extends Controller } return redirect()->back()->withInput()->withErrors($consumable->getErrors()); - } /** @@ -104,14 +102,13 @@ class ConsumablesController extends Controller { if ($item = Consumable::find($consumableId)) { $this->authorize($item); + return view('consumables/edit', compact('item'))->with('category_type', 'consumable'); } return redirect()->route('consumables.index')->with('error', trans('admin/consumables/message.does_not_exist')); - } - /** * Returns a form view to edit a consumable. * @@ -141,7 +138,7 @@ class ConsumablesController extends Controller $consumable->model_number = $request->input('model_number'); $consumable->item_no = $request->input('item_no'); $consumable->purchase_date = $request->input('purchase_date'); - $consumable->purchase_cost = Helper::ParseFloat($request->input('purchase_cost')); + $consumable->purchase_cost = Helper::ParseCurrency($request->input('purchase_cost')); $consumable->qty = Helper::ParseFloat($request->input('qty')); $consumable = $request->handleImages($consumable); @@ -149,6 +146,7 @@ class ConsumablesController extends Controller if ($consumable->save()) { return redirect()->route('consumables.index')->with('success', trans('admin/consumables/message.update.success')); } + return redirect()->back()->withInput()->withErrors($consumable->getErrors()); } @@ -189,8 +187,8 @@ class ConsumablesController extends Controller if (isset($consumable->id)) { return view('consumables/view', compact('consumable')); } + return redirect()->route('consumables.index') ->with('error', trans('admin/consumables/message.does_not_exist')); } - } diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index 14f56d0d05..96d761ef5b 100644 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -19,6 +19,7 @@ * etc have been included in this documentation (excluding vendors, Laravel core, etc) * for simplicity. */ + namespace App\Http\Controllers; use Auth; diff --git a/app/Http/Controllers/CustomFieldsController.php b/app/Http/Controllers/CustomFieldsController.php index a8be424841..8c7b7a2b64 100644 --- a/app/Http/Controllers/CustomFieldsController.php +++ b/app/Http/Controllers/CustomFieldsController.php @@ -1,4 +1,5 @@ ] */ - class CustomFieldsController extends Controller { - /** * Returns a view with a listing of custom fields. * @@ -33,13 +32,12 @@ class CustomFieldsController extends Controller { $this->authorize('view', CustomField::class); - $fieldsets = CustomFieldset::with("fields", "models")->get(); - $fields = CustomField::with("fieldset")->get(); + $fieldsets = CustomFieldset::with('fields', 'models')->get(); + $fields = CustomField::with('fieldset')->get(); - return view("custom_fields.index")->with("custom_fieldsets", $fieldsets)->with("custom_fields", $fields); + return view('custom_fields.index')->with('custom_fieldsets', $fieldsets)->with('custom_fields', $fields); } - /** * Just redirect the user back if they try to view the details of a field. * We already show those details on the listing page. @@ -50,14 +48,11 @@ class CustomFieldsController extends Controller * @return Redirect * @throws \Illuminate\Auth\Access\AuthorizationException */ - public function show() { - return redirect()->route("fields.index"); - + return redirect()->route('fields.index'); } - /** * Returns a view with a form to create a new custom field. * @@ -71,13 +66,12 @@ class CustomFieldsController extends Controller { $this->authorize('create', CustomField::class); - return view("custom_fields.fields.edit",[ + return view('custom_fields.fields.edit', [ 'predefinedFormats' => Helper::predefined_formats(), - 'customFormat' => '' + 'customFormat' => '', ])->with('field', new CustomField()); } - /** * Validates and stores a new custom field. * @@ -92,33 +86,29 @@ class CustomFieldsController extends Controller $this->authorize('create', CustomField::class); $field = new CustomField([ - "name" => $request->get("name"), - "element" => $request->get("element"), - "help_text" => $request->get("help_text"), - "field_values" => $request->get("field_values"), - "field_encrypted" => $request->get("field_encrypted", 0), - "show_in_email" => $request->get("show_in_email", 0), - "user_id" => Auth::id() + 'name' => $request->get('name'), + 'element' => $request->get('element'), + 'help_text' => $request->get('help_text'), + 'field_values' => $request->get('field_values'), + 'field_encrypted' => $request->get('field_encrypted', 0), + 'show_in_email' => $request->get('show_in_email', 0), + 'user_id' => Auth::id(), ]); - - if ($request->filled("custom_format")) { - $field->format = e($request->get("custom_format")); + if ($request->filled('custom_format')) { + $field->format = e($request->get('custom_format')); } else { - $field->format = e($request->get("format")); + $field->format = e($request->get('format')); } if ($field->save()) { - - return redirect()->route("fields.index")->with("success", trans('admin/custom_fields/message.field.create.success')); + return redirect()->route('fields.index')->with('success', trans('admin/custom_fields/message.field.create.success')); } return redirect()->back()->withInput() ->with('error', trans('admin/custom_fields/message.field.create.error')); - } - /** * Detach a custom field from a fieldset. * @@ -135,10 +125,10 @@ class CustomFieldsController extends Controller if ($field->fieldset()->detach($fieldset_id)) { return redirect()->route('fieldsets.show', ['fieldset' => $fieldset_id]) - ->with("success", trans('admin/custom_fields/message.field.delete.success')); + ->with('success', trans('admin/custom_fields/message.field.delete.success')); } - return redirect()->back()->withErrors(['message' => "Field is in-use"]); + return redirect()->back()->withErrors(['message' => 'Field is in-use']); } /** @@ -152,21 +142,20 @@ class CustomFieldsController extends Controller public function destroy($field_id) { if ($field = CustomField::find($field_id)) { - $this->authorize('delete', $field); if (($field->fieldset) && ($field->fieldset->count() > 0)) { - return redirect()->back()->withErrors(['message' => "Field is in-use"]); + return redirect()->back()->withErrors(['message' => 'Field is in-use']); } $field->delete(); - return redirect()->route("fields.index") - ->with("success", trans('admin/custom_fields/message.field.delete.success')); + + return redirect()->route('fields.index') + ->with('success', trans('admin/custom_fields/message.field.delete.success')); } - return redirect()->back()->withErrors(['message' => "Field does not exist"]); + return redirect()->back()->withErrors(['message' => 'Field does not exist']); } - /** * Return a view to edit a custom field * @@ -183,18 +172,17 @@ class CustomFieldsController extends Controller $this->authorize('update', $field); $customFormat = ''; - if((stripos($field->format, 'regex') === 0) && ($field->format !== CustomField::PREDEFINED_FORMATS['MAC'])) { + if ((stripos($field->format, 'regex') === 0) && ($field->format !== CustomField::PREDEFINED_FORMATS['MAC'])) { $customFormat = $field->format; } - return view("custom_fields.fields.edit",[ + return view('custom_fields.fields.edit', [ 'field' => $field, 'customFormat' => $customFormat, - 'predefinedFormats' => Helper::predefined_formats() + 'predefinedFormats' => Helper::predefined_formats(), ]); } - /** * Store the updated field * @@ -208,30 +196,27 @@ class CustomFieldsController extends Controller */ public function update(CustomFieldRequest $request, $id) { - $field = CustomField::find($id); - + $field = CustomField::find($id); + $this->authorize('update', $field); - $field->name = e($request->get("name")); - $field->element = e($request->get("element")); - $field->field_values = e($request->get("field_values")); - $field->user_id = Auth::id(); - $field->help_text = $request->get("help_text"); - $field->show_in_email = $request->get("show_in_email", 0); + $field->name = e($request->get('name')); + $field->element = e($request->get('element')); + $field->field_values = e($request->get('field_values')); + $field->user_id = Auth::id(); + $field->help_text = $request->get('help_text'); + $field->show_in_email = $request->get('show_in_email', 0); if ($request->get('format') == 'CUSTOM REGEX') { - $field->format = e($request->get("custom_format")); + $field->format = e($request->get('custom_format')); } else { - $field->format = e($request->get("format")); + $field->format = e($request->get('format')); } if ($field->save()) { - return redirect()->route("fields.index")->with("success", trans('admin/custom_fields/message.field.update.success')); + return redirect()->route('fields.index')->with('success', trans('admin/custom_fields/message.field.update.success')); } return redirect()->back()->withInput()->with('error', trans('admin/custom_fields/message.field.update.error')); } - - - } diff --git a/app/Http/Controllers/CustomFieldsetsController.php b/app/Http/Controllers/CustomFieldsetsController.php index f484931325..3d072dbcfd 100644 --- a/app/Http/Controllers/CustomFieldsetsController.php +++ b/app/Http/Controllers/CustomFieldsetsController.php @@ -1,4 +1,5 @@ ] */ - class CustomFieldsetsController extends Controller { - /** * Validates and stores a new custom field. * @@ -40,28 +39,25 @@ class CustomFieldsetsController extends Controller $this->authorize('view', $cfset); if ($cfset) { - $custom_fields_list = ["" => "Add New Field to Fieldset"] + CustomField::pluck("name", "id")->toArray(); - + $custom_fields_list = ['' => 'Add New Field to Fieldset'] + CustomField::pluck('name', 'id')->toArray(); $maxid = 0; foreach ($cfset->fields as $field) { if ($field->pivot->order > $maxid) { - $maxid=$field->pivot->order; + $maxid = $field->pivot->order; } if (isset($custom_fields_list[$field->id])) { unset($custom_fields_list[$field->id]); } } - return view("custom_fields.fieldsets.view")->with("custom_fieldset", $cfset)->with("maxid", $maxid+1)->with("custom_fields_list", $custom_fields_list); + return view('custom_fields.fieldsets.view')->with('custom_fieldset', $cfset)->with('maxid', $maxid + 1)->with('custom_fields_list', $custom_fields_list); } - return redirect()->route("fields.index") - ->with("error", trans('admin/custom_fields/message.fieldset.does_not_exist')); - + return redirect()->route('fields.index') + ->with('error', trans('admin/custom_fields/message.fieldset.does_not_exist')); } - /** * Returns a view with a form for creating a new custom fieldset. * @@ -74,10 +70,9 @@ class CustomFieldsetsController extends Controller { $this->authorize('create', CustomFieldset::class); - return view("custom_fields.fieldsets.edit"); + return view('custom_fields.fieldsets.edit'); } - /** * Validates and stores a new custom fieldset. * @@ -92,52 +87,49 @@ class CustomFieldsetsController extends Controller $this->authorize('create', CustomFieldset::class); $cfset = new CustomFieldset([ - "name" => e($request->get("name")), - "user_id" => Auth::user()->id + 'name' => e($request->get('name')), + 'user_id' => Auth::user()->id, ]); $validator = Validator::make($request->all(), $cfset->rules); if ($validator->passes()) { $cfset->save(); - return redirect()->route("fieldsets.show", [$cfset->id]) + + return redirect()->route('fieldsets.show', [$cfset->id]) ->with('success', trans('admin/custom_fields/message.fieldset.create.success')); } + return redirect()->back()->withInput()->withErrors($validator); } - - - /** - * What the actual fuck, Brady? - * - * @todo Uhh, build this? - * @author [Brady Wetherington] [] - * @param int $id - * @since [v1.8] - * @return Fuckall - */ + * What the actual fuck, Brady? + * + * @todo Uhh, build this? + * @author [Brady Wetherington] [] + * @param int $id + * @since [v1.8] + * @return Fuckall + */ public function edit($id) { // } - /** - * GET IN THE SEA BRADY. - * - * @todo Uhh, build this too? - * @author [Brady Wetherington] [] - * @param int $id - * @since [v1.8] - * @return Fuckall - */ + * GET IN THE SEA BRADY. + * + * @todo Uhh, build this too? + * @author [Brady Wetherington] [] + * @param int $id + * @since [v1.8] + * @return Fuckall + */ public function update($id) { // } - /** * Validates a custom fieldset and then deletes if it has no models associated. * @@ -154,30 +146,28 @@ class CustomFieldsetsController extends Controller $this->authorize('delete', $fieldset); if ($fieldset) { - $models = AssetModel::where("fieldset_id", "=", $id); + $models = AssetModel::where('fieldset_id', '=', $id); if ($models->count() == 0) { $fieldset->delete(); - return redirect()->route("fields.index")->with("success", trans('admin/custom_fields/message.fieldset.delete.success')); + + return redirect()->route('fields.index')->with('success', trans('admin/custom_fields/message.fieldset.delete.success')); } - return redirect()->route("fields.index")->with("error", trans('admin/custom_fields/message.fieldset.delete.in_use')); + + return redirect()->route('fields.index')->with('error', trans('admin/custom_fields/message.fieldset.delete.in_use')); } - return redirect()->route("fields.index")->with("error", trans('admin/custom_fields/message.fieldset.does_not_exist')); - - + return redirect()->route('fields.index')->with('error', trans('admin/custom_fields/message.fieldset.does_not_exist')); } - /** - * Associate the custom field with a custom fieldset. - * - * @author [Brady Wetherington] [] - * @since [v1.8] - * @return View - */ + * Associate the custom field with a custom fieldset. + * + * @author [Brady Wetherington] [] + * @since [v1.8] + * @return View + */ public function associate(Request $request, $id) { - $set = CustomFieldset::find($id); $this->authorize('update', $set); @@ -185,17 +175,16 @@ class CustomFieldsetsController extends Controller if ($request->filled('field_id')) { foreach ($set->fields as $field) { if ($field->id == $request->input('field_id')) { - return redirect()->route("fieldsets.show", [$id])->withInput()->withErrors(['field_id' => trans('admin/custom_fields/message.field.already_added')]); + return redirect()->route('fieldsets.show', [$id])->withInput()->withErrors(['field_id' => trans('admin/custom_fields/message.field.already_added')]); } } - $results = $set->fields()->attach($request->input('field_id'), ["required" => ($request->input('required') == "on"),"order" => $request->input('order', 1)]); + $results = $set->fields()->attach($request->input('field_id'), ['required' => ($request->input('required') == 'on'), 'order' => $request->input('order', 1)]); - return redirect()->route("fieldsets.show", [$id])->with("success", trans('admin/custom_fields/message.field.create.assoc_success')); + return redirect()->route('fieldsets.show', [$id])->with('success', trans('admin/custom_fields/message.field.create.assoc_success')); } - return redirect()->route("fieldsets.show", [$id])->with("error", 'No field selected.'); - + return redirect()->route('fieldsets.show', [$id])->with('error', 'No field selected.'); } /** @@ -206,7 +195,6 @@ class CustomFieldsetsController extends Controller */ public function makeFieldRequired($fieldset_id, $field_id) { - $this->authorize('update', CustomFieldset::class); $field = CustomField::findOrFail($field_id); $fieldset = CustomFieldset::findOrFail($fieldset_id); @@ -214,8 +202,7 @@ class CustomFieldsetsController extends Controller $fieldset->fields()->syncWithoutDetaching($fields); return redirect()->route('fieldsets.show', ['fieldset' => $fieldset_id]) - ->with("success", trans('Field successfully set to required')); - + ->with('success', trans('Field successfully set to required')); } /** @@ -233,7 +220,6 @@ class CustomFieldsetsController extends Controller $fieldset->fields()->syncWithoutDetaching($fields); return redirect()->route('fieldsets.show', ['fieldset' => $fieldset_id]) - ->with("success", trans('Field successfully set to optional')); - + ->with('success', trans('Field successfully set to optional')); } } diff --git a/app/Http/Controllers/DashboardController.php b/app/Http/Controllers/DashboardController.php index e6ad988c45..bd527f7643 100755 --- a/app/Http/Controllers/DashboardController.php +++ b/app/Http/Controllers/DashboardController.php @@ -1,47 +1,50 @@ + * @version v1.0 */ class DashboardController extends Controller { /** - * Check authorization and display admin dashboard, otherwise display - * the user's checked-out assets. - * - * @author [A. Gianotto] [] - * @since [v1.0] - * @return View - */ - public function getIndex() + * Check authorization and display admin dashboard, otherwise display + * the user's checked-out assets. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @return View + */ + public function index() { // Show the page if (Auth::user()->hasAccess('admin')) { - - $asset_stats=null; + $asset_stats = null; $counts['asset'] = \App\Models\Asset::count(); $counts['accessory'] = \App\Models\Accessory::count(); $counts['license'] = \App\Models\License::assetcount(); $counts['consumable'] = \App\Models\Consumable::count(); - $counts['grand_total'] = $counts['asset'] + $counts['accessory'] + $counts['license'] + $counts['consumable']; + $counts['component'] = \App\Models\Component::count(); + $counts['user'] = \App\Models\User::count(); + $counts['grand_total'] = $counts['asset'] + $counts['accessory'] + $counts['license'] + $counts['consumable']; - if ((!file_exists(storage_path().'/oauth-private.key')) || (!file_exists(storage_path().'/oauth-public.key'))) { - \Artisan::call('migrate', ['--force' => true]); + if ((! file_exists(storage_path().'/oauth-private.key')) || (! file_exists(storage_path().'/oauth-public.key'))) { + Artisan::call('migrate', ['--force' => true]); \Artisan::call('passport:install'); } return view('dashboard')->with('asset_stats', $asset_stats)->with('counts', $counts); } else { - // Redirect to the profile page + // Redirect to the profile page return redirect()->intended('account/view-assets'); } } diff --git a/app/Http/Controllers/DepartmentsController.php b/app/Http/Controllers/DepartmentsController.php index b0d7768b0f..920cc1f2b4 100644 --- a/app/Http/Controllers/DepartmentsController.php +++ b/app/Http/Controllers/DepartmentsController.php @@ -34,10 +34,10 @@ class DepartmentsController extends Controller if ($request->filled('company_id')) { $company = Company::find($request->input('company_id')); } + return view('departments/index')->with('company', $company); } - /** * Store a newly created resource in storage. * @@ -53,13 +53,14 @@ class DepartmentsController extends Controller $department = new Department; $department->fill($request->all()); $department->user_id = Auth::user()->id; - $department->manager_id = ($request->filled('manager_id' ) ? $request->input('manager_id') : null); + $department->manager_id = ($request->filled('manager_id') ? $request->input('manager_id') : null); $department = $request->handleImages($department); if ($department->save()) { - return redirect()->route("departments.index")->with('success', trans('admin/departments/message.create.success')); + return redirect()->route('departments.index')->with('success', trans('admin/departments/message.create.success')); } + return redirect()->back()->withInput()->withErrors($department->getErrors()); } @@ -82,10 +83,10 @@ class DepartmentsController extends Controller if (isset($department->id)) { return view('departments/view', compact('department')); } + return redirect()->route('departments.index')->with('error', trans('admin/departments/message.does_not_exist')); } - /** * Returns a form view used to create a new department. * @@ -102,7 +103,6 @@ class DepartmentsController extends Controller return view('departments/edit')->with('item', new Department); } - /** * Validates and deletes selected department. * @@ -125,7 +125,7 @@ class DepartmentsController extends Controller } if ($department->image) { - try { + try { Storage::disk('public')->delete('departments'.'/'.$department->image); } catch (\Exception $e) { \Log::debug($e); @@ -134,7 +134,6 @@ class DepartmentsController extends Controller $department->delete(); return redirect()->back()->with('success', trans('admin/departments/message.delete.success')); - } /** @@ -158,8 +157,8 @@ class DepartmentsController extends Controller return view('departments/edit', compact('item')); } - public function update(ImageUploadRequest $request, $id) { - + public function update(ImageUploadRequest $request, $id) + { if (is_null($department = Department::find($id))) { return redirect()->route('departments.index')->with('error', trans('admin/departments/message.does_not_exist')); } @@ -167,13 +166,14 @@ class DepartmentsController extends Controller $this->authorize('update', $department); $department->fill($request->all()); - $department->manager_id = ($request->filled('manager_id' ) ? $request->input('manager_id') : null); + $department->manager_id = ($request->filled('manager_id') ? $request->input('manager_id') : null); $department = $request->handleImages($department); - + if ($department->save()) { - return redirect()->route("departments.index")->with('success', trans('admin/departments/message.update.success')); + return redirect()->route('departments.index')->with('success', trans('admin/departments/message.update.success')); } + return redirect()->back()->withInput()->withErrors($department->getErrors()); } } diff --git a/app/Http/Controllers/DepreciationsController.php b/app/Http/Controllers/DepreciationsController.php index d7177829ea..70bfb78cb5 100755 --- a/app/Http/Controllers/DepreciationsController.php +++ b/app/Http/Controllers/DepreciationsController.php @@ -1,4 +1,5 @@ with('item', new Depreciation); } - /** * Validates and stores the new depreciation data. * @@ -67,15 +66,17 @@ class DepreciationsController extends Controller // create a new instance $depreciation = new Depreciation(); // Depreciation data - $depreciation->name = $request->input('name'); - $depreciation->months = $request->input('months'); - $depreciation->user_id = Auth::id(); + $depreciation->name = $request->input('name'); + $depreciation->months = $request->input('months'); + $depreciation->user_id = Auth::id(); + $depreciation->depreciation_min = $request->input('depreciation_min'); // Was the asset created? if ($depreciation->save()) { // Redirect to the new depreciation page return redirect()->route('depreciations.index')->with('success', trans('admin/depreciations/message.create.success')); } + return redirect()->back()->withInput()->withErrors($depreciation->getErrors()); } @@ -102,7 +103,6 @@ class DepreciationsController extends Controller return view('depreciations/edit', compact('item')); } - /** * Validates and stores the updated depreciation data. * @@ -125,14 +125,16 @@ class DepreciationsController extends Controller $this->authorize('update', $depreciation); // Depreciation data - $depreciation->name = $request->input('name'); - $depreciation->months = $request->input('months'); + $depreciation->name = $request->input('name'); + $depreciation->months = $request->input('months'); + $depreciation->depreciation_min = $request->input('depreciation_min'); // Was the asset created? if ($depreciation->save()) { // Redirect to the depreciation page - return redirect()->route("depreciations.index")->with('success', trans('admin/depreciations/message.update.success')); + return redirect()->route('depreciations.index')->with('success', trans('admin/depreciations/message.update.success')); } + return redirect()->back()->withInput()->withErrors($depreciation->getErrors()); } @@ -143,7 +145,7 @@ class DepreciationsController extends Controller * * @author [A. Gianotto] [permissions = json_encode($request->input('permission')); if ($group->save()) { - return redirect()->route("groups.index")->with('success', trans('admin/groups/message.success.create')); + return redirect()->route('groups.index')->with('success', trans('admin/groups/message.success.create')); } + return redirect()->back()->withInput()->withErrors($group->getErrors()); } /** - * Returns a view that presents a form to edit a User Group. - * - * @author [A. Gianotto] [decodePermissions(); $selected_array = Helper::selectedPermissionsArray($permissions, $groupPermissions); + return view('groups.edit', compact('group', 'permissions', 'selected_array', 'groupPermissions')); } @@ -94,28 +96,30 @@ class GroupsController extends Controller } /** - * Validates and stores the updated User Group data. - * - * @author [A. Gianotto] [route('groups.index')->with('error', trans('admin/groups/message.group_not_found', compact('id'))); } $group->name = $request->input('name'); $group->permissions = json_encode($request->input('permission')); - if (!config('app.lock_passwords')) { + if (! config('app.lock_passwords')) { if ($group->save()) { return redirect()->route('groups.index')->with('success', trans('admin/groups/message.success.update')); } + return redirect()->back()->withInput()->withErrors($group->getErrors()); } + return redirect()->route('groups.index')->with('error', trans('general.feature_disabled')); } @@ -131,14 +135,15 @@ class GroupsController extends Controller */ public function destroy($id = null) { - if (!config('app.lock_passwords')) { - if (!$group = Group::find($id)) { + if (! config('app.lock_passwords')) { + if (! $group = Group::find($id)) { return redirect()->route('groups.index')->with('error', trans('admin/groups/message.group_not_found', compact('id'))); } $group->delete(); // Redirect to the group management page return redirect()->route('groups.index')->with('success', trans('admin/groups/message.success.delete')); } + return redirect()->route('groups.index')->with('error', trans('general.feature_disabled')); } @@ -161,5 +166,4 @@ class GroupsController extends Controller return redirect()->route('groups.index')->with('error', trans('admin/groups/message.group_not_found', compact('id'))); } - } diff --git a/app/Http/Controllers/HealthController.php b/app/Http/Controllers/HealthController.php index 5fc2c70f4e..456f6b6f94 100644 --- a/app/Http/Controllers/HealthController.php +++ b/app/Http/Controllers/HealthController.php @@ -1,9 +1,9 @@ json([ - "status" => "ok" + 'status' => 'ok', ]); } -} \ No newline at end of file +} diff --git a/app/Http/Controllers/ImportsController.php b/app/Http/Controllers/ImportsController.php index 46954303c5..5c2ca6175b 100644 --- a/app/Http/Controllers/ImportsController.php +++ b/app/Http/Controllers/ImportsController.php @@ -16,6 +16,7 @@ class ImportsController extends Controller { $this->authorize('import'); $imports = (new ImportsTransformer)->transformImports(Import::latest()->get()); + return view('importer/import')->with('imports', $imports); } } diff --git a/app/Http/Controllers/Kits/CheckoutKitController.php b/app/Http/Controllers/Kits/CheckoutKitController.php index 0d99560751..2ff79d0d6b 100644 --- a/app/Http/Controllers/Kits/CheckoutKitController.php +++ b/app/Http/Controllers/Kits/CheckoutKitController.php @@ -1,4 +1,5 @@ ] * @return View View to checkout */ @@ -39,6 +39,7 @@ class CheckoutKitController extends Controller $this->authorize('checkout', Asset::class); $kit = PredefinedKit::findOrFail($kit_id); + return view('kits/checkout')->with('kit', $kit); } @@ -59,13 +60,13 @@ class CheckoutKitController extends Controller $kit->id = $kit_id; $checkout_result = $this->kitService->checkout($request, $kit, $user); - if (Arr::has($checkout_result, 'errors') && count($checkout_result['errors']) > 0 ) { + if (Arr::has($checkout_result, 'errors') && count($checkout_result['errors']) > 0) { return redirect()->back()->with('error', 'Checkout error')->with('error_messages', $checkout_result['errors']); // TODO: trans } + return redirect()->back()->with('success', 'Checkout was successful') ->with('assets', Arr::get($checkout_result, 'assets', null)) ->with('accessories', Arr::get($checkout_result, 'accessories', null)) ->with('consumables', Arr::get($checkout_result, 'consumables', null)); // TODO: trans - } } diff --git a/app/Http/Controllers/Kits/PredefinedKitsController.php b/app/Http/Controllers/Kits/PredefinedKitsController.php index 79c76f887d..66c4c3f4ee 100644 --- a/app/Http/Controllers/Kits/PredefinedKitsController.php +++ b/app/Http/Controllers/Kits/PredefinedKitsController.php @@ -1,4 +1,5 @@ authorize('index', PredefinedKit::class); + return view('kits/index'); } /** * Returns a form view to create a new kit. - * + * * @author [D. Minaev] [] * @throws \Illuminate\Auth\Access\AuthorizationException * @return mixed @@ -37,6 +39,7 @@ class PredefinedKitsController extends Controller public function create() { $this->authorize('create', PredefinedKit::class); + return view('kits/create')->with('item', new PredefinedKit); } @@ -53,14 +56,15 @@ class PredefinedKitsController extends Controller $kit = new PredefinedKit; $kit->name = $request->input('name'); - if (!$kit->save()) { + if (! $kit->save()) { return redirect()->back()->withInput()->withErrors($kit->getErrors()); } $success = $kit->save(); - if (!$success) { + if (! $success) { return redirect()->back()->withInput()->withErrors($kit->getErrors()); } - return redirect()->route("kits.index")->with('success', 'Kit was successfully created.'); // TODO: trans() + + return redirect()->route('kits.index')->with('success', 'Kit was successfully created.'); // TODO: trans() } /** @@ -71,7 +75,7 @@ class PredefinedKitsController extends Controller * @param int $kit_id * @return View */ - public function edit($kit_id=null) + public function edit($kit_id = null) { $this->authorize('update', PredefinedKit::class); if ($kit = PredefinedKit::find($kit_id)) { @@ -80,10 +84,10 @@ class PredefinedKitsController extends Controller ->with('models', $kit->models) ->with('licenses', $kit->licenses); } + return redirect()->route('kits.index')->with('error', 'Kit does not exist'); // TODO: trans } - /** * Validates and processes form data from the edit * Predefined Kit form based on the kit ID passed. @@ -93,7 +97,7 @@ class PredefinedKitsController extends Controller * @param int $kit_id * @return Redirect */ - public function update(ImageUploadRequest $request, $kit_id=null) + public function update(ImageUploadRequest $request, $kit_id = null) { $this->authorize('update', PredefinedKit::class); // Check if the kit exists @@ -105,8 +109,9 @@ class PredefinedKitsController extends Controller $kit->name = $request->input('name'); if ($kit->save()) { - return redirect()->route("kits.index")->with('success', 'Kit was successfully updated'); // TODO: trans + return redirect()->route('kits.index')->with('success', 'Kit was successfully updated'); // TODO: trans } + return redirect()->back()->withInput()->withErrors($kit->getErrors()); } @@ -147,12 +152,11 @@ class PredefinedKitsController extends Controller * @param int $modelId * @return View */ - public function show($kit_id=null) + public function show($kit_id = null) { return $this->edit($kit_id); } - /** * Returns a view containing the Predefined Kit edit form. * @@ -165,13 +169,13 @@ class PredefinedKitsController extends Controller $this->authorize('update', PredefinedKit::class); if (($kit = PredefinedKit::find($kit_id)) && ($model = $kit->models()->find($model_id))) { - return view('kits/model-edit', [ 'kit' => $kit, 'model' => $model, - 'item' => $model->pivot + 'item' => $model->pivot, ]); } + return redirect()->route('kits.index')->with('error', 'Kit does not exist'); // TODO: trans } @@ -184,7 +188,6 @@ class PredefinedKitsController extends Controller */ public function updateModel(Request $request, $kit_id, $model_id) { - $this->authorize('update', PredefinedKit::class); if (is_null($kit = PredefinedKit::find($kit_id))) { // Redirect to the kits management page @@ -223,7 +226,7 @@ class PredefinedKitsController extends Controller // Delete childs $kit->models()->detach($model_id); - + // Redirect to the kit management page return redirect()->route('kits.edit', $kit_id)->with('success', 'Model was successfully detached'); // TODO: trans } @@ -239,17 +242,17 @@ class PredefinedKitsController extends Controller public function editLicense($kit_id, $license_id) { $this->authorize('update', PredefinedKit::class); - if (!($kit = PredefinedKit::find($kit_id))) { + if (! ($kit = PredefinedKit::find($kit_id))) { return redirect()->route('kits.index')->with('error', 'Kit does not exist'); // TODO: trans } - if (!($license = $kit->licenses()->find($license_id))) { + if (! ($license = $kit->licenses()->find($license_id))) { return redirect()->route('kits.index')->with('error', 'License does not exist'); // TODO: trans } return view('kits/license-edit', [ 'kit' => $kit, 'license' => $license, - 'item' => $license->pivot + 'item' => $license->pivot, ]); } @@ -263,7 +266,6 @@ class PredefinedKitsController extends Controller */ public function updateLicense(Request $request, $kit_id, $license_id) { - $this->authorize('update', PredefinedKit::class); if (is_null($kit = PredefinedKit::find($kit_id))) { // Redirect to the kits management page @@ -287,7 +289,7 @@ class PredefinedKitsController extends Controller /** * Remove the license from set - * + * * @author [D. Minaev] [] * @param int $kit_id * @param int $license_id @@ -303,12 +305,11 @@ class PredefinedKitsController extends Controller // Delete childs $kit->licenses()->detach($license_id); - + // Redirect to the kit management page return redirect()->route('kits.edit', $kit_id)->with('success', 'License was successfully detached'); // TODO: trans } - /** * Returns a view containing attached accessory edit form. * @@ -320,23 +321,23 @@ class PredefinedKitsController extends Controller public function editAccessory($kit_id, $accessory_id) { $this->authorize('update', PredefinedKit::class); - if (!($kit = PredefinedKit::find($kit_id))) { + if (! ($kit = PredefinedKit::find($kit_id))) { return redirect()->route('kits.index')->with('error', 'Kit does not exist'); // TODO: trans } - if (!($accessory = $kit->accessories()->find($accessory_id))) { + if (! ($accessory = $kit->accessories()->find($accessory_id))) { return redirect()->route('kits.index')->with('error', 'Accessory does not exist'); // TODO: trans } return view('kits/accessory-edit', [ 'kit' => $kit, 'accessory' => $accessory, - 'item' => $accessory->pivot + 'item' => $accessory->pivot, ]); } /** * Update attached accessory - * + * * @author [D. Minaev] [] * @param int $kit_id * @param int $accessory_id @@ -344,7 +345,6 @@ class PredefinedKitsController extends Controller */ public function updateAccessory(Request $request, $kit_id, $accessory_id) { - $this->authorize('update', PredefinedKit::class); if (is_null($kit = PredefinedKit::find($kit_id))) { // Redirect to the kits management page @@ -383,7 +383,7 @@ class PredefinedKitsController extends Controller // Delete childs $kit->accessories()->detach($accessory_id); - + // Redirect to the kit management page return redirect()->route('kits.edit', $kit_id)->with('success', 'Accessory was successfully detached'); // TODO: trans } @@ -399,17 +399,17 @@ class PredefinedKitsController extends Controller public function editConsumable($kit_id, $consumable_id) { $this->authorize('update', PredefinedKit::class); - if (!($kit = PredefinedKit::find($kit_id))) { + if (! ($kit = PredefinedKit::find($kit_id))) { return redirect()->route('kits.index')->with('error', 'Kit does not exist'); // TODO: trans } - if (!($consumable = $kit->consumables()->find($consumable_id))) { + if (! ($consumable = $kit->consumables()->find($consumable_id))) { return redirect()->route('kits.index')->with('error', 'Consumable does not exist'); // TODO: trans } return view('kits/consumable-edit', [ 'kit' => $kit, 'consumable' => $consumable, - 'item' => $consumable->pivot + 'item' => $consumable->pivot, ]); } @@ -423,7 +423,6 @@ class PredefinedKitsController extends Controller */ public function updateConsumable(Request $request, $kit_id, $consumable_id) { - $this->authorize('update', PredefinedKit::class); if (is_null($kit = PredefinedKit::find($kit_id))) { // Redirect to the kits management page @@ -462,7 +461,7 @@ class PredefinedKitsController extends Controller // Delete childs $kit->consumables()->detach($consumable_id); - + // Redirect to the kit management page return redirect()->route('kits.edit', $kit_id)->with('success', 'Consumable was successfully detached'); // TODO: trans } diff --git a/app/Http/Controllers/Licenses/LicenseCheckinController.php b/app/Http/Controllers/Licenses/LicenseCheckinController.php index a5be968cad..d585e6714c 100644 --- a/app/Http/Controllers/Licenses/LicenseCheckinController.php +++ b/app/Http/Controllers/Licenses/LicenseCheckinController.php @@ -7,6 +7,7 @@ use App\Http\Controllers\Controller; use App\Models\License; use App\Models\LicenseSeat; use App\Models\User; +use App\Models\Asset; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Input; @@ -15,7 +16,6 @@ use Illuminate\Support\Facades\Validator; class LicenseCheckinController extends Controller { - /** * Makes the form view to check a license seat back into inventory. * @@ -35,10 +35,10 @@ class LicenseCheckinController extends Controller } $this->authorize('checkout', $license); + return view('licenses/checkin', compact('licenseSeat'))->with('backto', $backTo); } - /** * Validates and stores the license checkin action. * @@ -61,9 +61,10 @@ class LicenseCheckinController extends Controller $license = License::find($licenseSeat->license_id); $this->authorize('checkout', $license); - if (!$license->reassignable) { + if (! $license->reassignable) { // Not allowed to checkin Session::flash('error', 'License not reassignable.'); + return redirect()->back()->withInput(); } @@ -80,25 +81,29 @@ class LicenseCheckinController extends Controller // Ooops.. something went wrong return redirect()->back()->withInput()->withErrors($validator); } - $return_to = User::find($licenseSeat->assigned_to); + + if($licenseSeat->assigned_to != null){ + $return_to = User::find($licenseSeat->assigned_to); + } else { + $return_to = Asset::find($licenseSeat->asset_id); + } // Update the asset data - $licenseSeat->assigned_to = null; - $licenseSeat->asset_id = null; + $licenseSeat->assigned_to = null; + $licenseSeat->asset_id = null; // Was the asset updated? if ($licenseSeat->save()) { - event(new CheckoutableCheckedIn($licenseSeat, $return_to, Auth::user(), $request->input('note'))); - if ($backTo=='user') { - return redirect()->route("users.show", $return_to->id)->with('success', trans('admin/licenses/message.checkin.success')); + if ($backTo == 'user') { + return redirect()->route('users.show', $return_to->id)->with('success', trans('admin/licenses/message.checkin.success')); } - return redirect()->route("licenses.show", $licenseSeat->license_id)->with('success', trans('admin/licenses/message.checkin.success')); + + return redirect()->route('licenses.show', $licenseSeat->license_id)->with('success', trans('admin/licenses/message.checkin.success')); } // Redirect to the license page with error - return redirect()->route("licenses.index")->with('error', trans('admin/licenses/message.checkin.error')); + return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.checkin.error')); } - } diff --git a/app/Http/Controllers/Licenses/LicenseCheckoutController.php b/app/Http/Controllers/Licenses/LicenseCheckoutController.php index 8edbc2e664..e5a3b98947 100644 --- a/app/Http/Controllers/Licenses/LicenseCheckoutController.php +++ b/app/Http/Controllers/Licenses/LicenseCheckoutController.php @@ -37,10 +37,10 @@ class LicenseCheckoutController extends Controller } $this->authorize('checkout', $license); + return view('licenses/checkout', compact('license')); } - /** * Validates and stores the license checkout action. * @@ -51,10 +51,9 @@ class LicenseCheckoutController extends Controller * @return \Illuminate\Http\RedirectResponse * @throws \Illuminate\Auth\Access\AuthorizationException */ - public function store(LicenseCheckoutRequest $request, $licenseId, $seatId = null) { - if (!$license = License::find($licenseId)) { + if (! $license = License::find($licenseId)) { return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.not_found')); } @@ -65,24 +64,25 @@ class LicenseCheckoutController extends Controller $checkoutMethod = 'checkoutTo'.ucwords(request('checkout_to_type')); if ($this->$checkoutMethod($licenseSeat)) { - return redirect()->route("licenses.index")->with('success', trans('admin/licenses/message.checkout.success')); + return redirect()->route('licenses.index')->with('success', trans('admin/licenses/message.checkout.success')); } - return redirect()->route("licenses.index")->with('error', trans('Something went wrong handling this checkout.')); + return redirect()->route('licenses.index')->with('error', trans('Something went wrong handling this checkout.')); } protected function findLicenseSeatToCheckout($license, $seatId) { $licenseSeat = LicenseSeat::find($seatId) ?? $license->freeSeat(); - if (!$licenseSeat) { + if (! $licenseSeat) { if ($seatId) { return redirect()->route('licenses.index')->with('error', 'This Seat is not available for checkout.'); } + return redirect()->route('licenses.index')->with('error', 'There are no available seats for this license'); } - if(!$licenseSeat->license->is($license)) { + if (! $licenseSeat->license->is($license)) { return redirect()->route('licenses.index')->with('error', 'The license seat provided does not match the license.'); } @@ -98,14 +98,14 @@ class LicenseCheckoutController extends Controller // Override asset's assigned user if available if ($target->checkedOutToUser()) { - $licenseSeat->assigned_to = $target->assigned_to; + $licenseSeat->assigned_to = $target->assigned_to; } if ($licenseSeat->save()) { - event(new CheckoutableCheckedOut($licenseSeat, $target, Auth::user(), request('note'))); return true; } + return false; } @@ -118,11 +118,11 @@ class LicenseCheckoutController extends Controller $licenseSeat->assigned_to = request('assigned_to'); if ($licenseSeat->save()) { - event(new CheckoutableCheckedOut($licenseSeat, $target, Auth::user(), request('note'))); return true; } + return false; } } diff --git a/app/Http/Controllers/Licenses/LicenseFilesController.php b/app/Http/Controllers/Licenses/LicenseFilesController.php index 33f47d1238..81a2f26ede 100644 --- a/app/Http/Controllers/Licenses/LicenseFilesController.php +++ b/app/Http/Controllers/Licenses/LicenseFilesController.php @@ -2,19 +2,18 @@ namespace App\Http\Controllers\Licenses; +use App\Helpers\StorageHelper; use App\Http\Controllers\Controller; use App\Http\Requests\AssetFileRequest; use App\Models\Actionlog; use App\Models\License; -use Illuminate\Support\Facades\Input; use Illuminate\Support\Facades\Response; use Illuminate\Support\Facades\Storage; use Symfony\Component\HttpFoundation\JsonResponse; -use App\Helpers\StorageHelper; +use enshrined\svgSanitize\Sanitizer; class LicenseFilesController extends Controller { - /** * Validates and stores files associated with a license. * @@ -34,32 +33,45 @@ class LicenseFilesController extends Controller $this->authorize('update', $license); if ($request->hasFile('file')) { + if (! Storage::exists('private_uploads/licenses')) { + Storage::makeDirectory('private_uploads/licenses', 775); + } - if (!Storage::exists('private_uploads/licenses')) Storage::makeDirectory('private_uploads/licenses', 775); - - $upload_success = false; foreach ($request->file('file') as $file) { - - $file_name = 'license-'.$license->id.'-'.str_random(8).'-'.str_slug(basename($file->getClientOriginalName(), '.'.$file->getClientOriginalExtension())).'.'.$file->getClientOriginalExtension(); + $extension = $file->getClientOriginalExtension(); + $file_name = 'license-'.$license->id.'-'.str_random(8).'-'.str_slug(basename($file->getClientOriginalName(), '.'.$extension)).'.'.$extension; - $upload_success = $file->storeAs('private_uploads/licenses', $file_name); - // $upload_success = $file->storeAs('private_uploads/licenses/'.$file_name, $file); + // Check for SVG and sanitize it + if ($extension == 'svg') { + \Log::debug('This is an SVG'); + \Log::debug($file_name); + + $sanitizer = new Sanitizer(); + $dirtySVG = file_get_contents($file->getRealPath()); + $cleanSVG = $sanitizer->sanitize($dirtySVG); + + try { + Storage::put('private_uploads/licenses/'.$file_name, $cleanSVG); + } catch (\Exception $e) { + \Log::debug('Upload no workie :( '); + \Log::debug($e); + } + + } else { + Storage::put('private_uploads/licenses/'.$file_name, file_get_contents($file)); + } //Log the upload to the log $license->logUpload($file_name, e($request->input('notes'))); } - // This being called from a modal seems to confuse redirect()->back() - // It thinks we should go to the dashboard. As this is only used - // from the modal at present, hardcode the redirect. Longterm - // maybe we evaluate something else. - if ($upload_success) { + return redirect()->route('licenses.show', $license->id)->with('success', trans('admin/licenses/message.upload.success')); - } - return redirect()->route('licenses.show', $license->id)->with('error', trans('admin/licenses/message.upload.error')); + } + return redirect()->route('licenses.show', $license->id)->with('error', trans('admin/licenses/message.upload.nofiles')); } // Prepare the error message @@ -67,7 +79,6 @@ class LicenseFilesController extends Controller ->with('error', trans('admin/licenses/message.does_not_exist')); } - /** * Deletes the selected license file. * @@ -89,7 +100,7 @@ class LicenseFilesController extends Controller // Remove the file if one exists if (Storage::exists('licenses/'.$log->filename)) { - try { + try { Storage::delete('licenses/'.$log->filename); } catch (\Exception $e) { \Log::debug($e); @@ -97,6 +108,7 @@ class LicenseFilesController extends Controller } $log->delete(); + return redirect()->back() ->with('success', trans('admin/hardware/message.deletefile.success')); } @@ -105,8 +117,6 @@ class LicenseFilesController extends Controller return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.does_not_exist')); } - - /** * Allows the selected file to be viewed. * @@ -119,25 +129,24 @@ class LicenseFilesController extends Controller */ public function show($licenseId = null, $fileId = null, $download = true) { - - \Log::info('Private filesystem is: '.config('filesystems.default') ); + \Log::info('Private filesystem is: '.config('filesystems.default')); $license = License::find($licenseId); // the license is valid if (isset($license->id)) { $this->authorize('view', $license); - if (!$log = Actionlog::find($fileId)) { + if (! $log = Actionlog::find($fileId)) { return response('No matching record for that asset/file', 500) ->header('Content-Type', 'text/plain'); } $file = 'private_uploads/licenses/'.$log->filename; - if (Storage::missing($file)) { \Log::debug('NOT EXISTS for '.$file); \Log::debug('NOT EXISTS URL should be '.Storage::url($file)); + return response('File '.$file.' ('.Storage::url($file).') not found on server', 404) ->header('Content-Type', 'text/plain'); } else { @@ -152,20 +161,16 @@ class LicenseFilesController extends Controller if ($contents = file_get_contents(Storage::url($file))) { // TODO - this will fail on private S3 files or large public ones return Response::make(Storage::url($file)->header('Content-Type', mime_content_type($file))); } - return JsonResponse::create(["error" => "Failed validation: "], 500); + + return JsonResponse::create(['error' => 'Failed validation: '], 500); } return StorageHelper::downloader($file); + } - } - - } + return redirect()->route('license.index')->with('error', trans('admin/licenses/message.does_not_exist', ['id' => $fileId])); - } - - - } diff --git a/app/Http/Controllers/Licenses/LicensesController.php b/app/Http/Controllers/Licenses/LicensesController.php index 428dfa4f4f..5272164b18 100755 --- a/app/Http/Controllers/Licenses/LicensesController.php +++ b/app/Http/Controllers/Licenses/LicensesController.php @@ -1,4 +1,5 @@ authorize('view', License::class); + return view('licenses/index'); } - /** * Returns a form view that allows an admin to create a new licence. * @@ -50,17 +50,15 @@ class LicensesController extends Controller $maintained_list = [ '' => 'Maintained', '1' => 'Yes', - '0' => 'No' + '0' => 'No', ]; return view('licenses/edit') ->with('depreciation_list', Helper::depreciationList()) ->with('maintained_list', $maintained_list) ->with('item', new License); - } - /** * Validates and stores the license form data submitted from the new * license form. @@ -88,7 +86,7 @@ class LicensesController extends Controller $license->name = $request->input('name'); $license->notes = $request->input('notes'); $license->order_number = $request->input('order_number'); - $license->purchase_cost = $request->input('purchase_cost'); + $license->purchase_cost = Helper::ParseCurrency($request->input('purchase_cost')); $license->purchase_date = $request->input('purchase_date'); $license->purchase_order = $request->input('purchase_order'); $license->purchase_order = $request->input('purchase_order'); @@ -101,8 +99,9 @@ class LicensesController extends Controller $license->user_id = Auth::id(); if ($license->save()) { - return redirect()->route("licenses.index")->with('success', trans('admin/licenses/message.create.success')); + return redirect()->route('licenses.index')->with('success', trans('admin/licenses/message.create.success')); } + return redirect()->back()->withInput()->withErrors($license->getErrors()); } @@ -127,7 +126,7 @@ class LicensesController extends Controller $maintained_list = [ '' => 'Maintained', '1' => 'Yes', - '0' => 'No' + '0' => 'No', ]; return view('licenses/edit', compact('item')) @@ -135,7 +134,6 @@ class LicensesController extends Controller ->with('maintained_list', $maintained_list); } - /** * Validates and stores the license form data submitted from the edit * license form. @@ -165,7 +163,7 @@ class LicensesController extends Controller $license->name = $request->input('name'); $license->notes = $request->input('notes'); $license->order_number = $request->input('order_number'); - $license->purchase_cost = $request->input('purchase_cost'); + $license->purchase_cost = Helper::ParseCurrency($request->input('purchase_cost')); $license->purchase_date = $request->input('purchase_date'); $license->purchase_order = $request->input('purchase_order'); $license->reassignable = $request->input('reassignable', 0); @@ -207,7 +205,7 @@ class LicensesController extends Controller // Delete the license and the associated license seats DB::table('license_seats') ->where('id', $license->id) - ->update(array('assigned_to' => null,'asset_id' => null)); + ->update(['assigned_to' => null, 'asset_id' => null]); $licenseSeats = $license->licenseseats(); $licenseSeats->delete(); @@ -219,10 +217,8 @@ class LicensesController extends Controller } // There are still licenses in use. return redirect()->route('licenses.index')->with('error', trans('admin/licenses/message.assoc_users')); - } - /** * Makes the license detail page. * @@ -234,17 +230,17 @@ class LicensesController extends Controller */ public function show($licenseId = null) { - $license = License::with('assignedusers', 'licenseSeats.user', 'licenseSeats.asset')->find($licenseId); if ($license) { $this->authorize('view', $license); + return view('licenses/view', compact('license')); } + return redirect()->route('licenses.index') ->with('error', trans('admin/licenses/message.does_not_exist')); } - public function getClone($licenseId = null) { @@ -257,7 +253,7 @@ class LicensesController extends Controller $maintained_list = [ '' => 'Maintained', '1' => 'Yes', - '0' => 'No' + '0' => 'No', ]; //clone the orig $license = clone $license_to_clone; diff --git a/app/Http/Controllers/LocationsController.php b/app/Http/Controllers/LocationsController.php index 7a112656d4..668b8190b2 100755 --- a/app/Http/Controllers/LocationsController.php +++ b/app/Http/Controllers/LocationsController.php @@ -1,12 +1,12 @@ authorize('create', Location::class); + return view('locations/edit') ->with('item', new Location); } - /** * Validates and stores a new location. * @@ -69,28 +67,28 @@ class LocationsController extends Controller { $this->authorize('create', Location::class); $location = new Location(); - $location->name = $request->input('name'); - $location->parent_id = $request->input('parent_id', null); - $location->currency = $request->input('currency', '$'); - $location->address = $request->input('address'); - $location->address2 = $request->input('address2'); - $location->city = $request->input('city'); - $location->state = $request->input('state'); - $location->country = $request->input('country'); - $location->zip = $request->input('zip'); - $location->ldap_ou = $request->input('ldap_ou'); - $location->manager_id = $request->input('manager_id'); - $location->user_id = Auth::id(); + $location->name = $request->input('name'); + $location->parent_id = $request->input('parent_id', null); + $location->currency = $request->input('currency', '$'); + $location->address = $request->input('address'); + $location->address2 = $request->input('address2'); + $location->city = $request->input('city'); + $location->state = $request->input('state'); + $location->country = $request->input('country'); + $location->zip = $request->input('zip'); + $location->ldap_ou = $request->input('ldap_ou'); + $location->manager_id = $request->input('manager_id'); + $location->user_id = Auth::id(); $location = $request->handleImages($location); if ($location->save()) { - return redirect()->route("locations.index")->with('success', trans('admin/locations/message.create.success')); + return redirect()->route('locations.index')->with('success', trans('admin/locations/message.create.success')); } + return redirect()->back()->withInput()->withErrors($location->getErrors()); } - /** * Makes a form view to edit location information. * @@ -109,11 +107,9 @@ class LocationsController extends Controller return redirect()->route('locations.index')->with('error', trans('admin/locations/message.does_not_exist')); } - return view('locations/edit', compact('item')); } - /** * Validates and stores updated location data from edit form. * @@ -134,24 +130,24 @@ class LocationsController extends Controller } // Update the location data - $location->name = $request->input('name'); - $location->parent_id = $request->input('parent_id', null); - $location->currency = $request->input('currency', '$'); - $location->address = $request->input('address'); - $location->address2 = $request->input('address2'); - $location->city = $request->input('city'); - $location->state = $request->input('state'); - $location->country = $request->input('country'); - $location->zip = $request->input('zip'); - $location->ldap_ou = $request->input('ldap_ou'); - $location->manager_id = $request->input('manager_id'); + $location->name = $request->input('name'); + $location->parent_id = $request->input('parent_id', null); + $location->currency = $request->input('currency', '$'); + $location->address = $request->input('address'); + $location->address2 = $request->input('address2'); + $location->city = $request->input('city'); + $location->state = $request->input('state'); + $location->country = $request->input('country'); + $location->zip = $request->input('zip'); + $location->ldap_ou = $request->input('ldap_ou'); + $location->manager_id = $request->input('manager_id'); $location = $request->handleImages($location); - if ($location->save()) { - return redirect()->route("locations.index")->with('success', trans('admin/locations/message.update.success')); + return redirect()->route('locations.index')->with('success', trans('admin/locations/message.update.success')); } + return redirect()->back()->withInput()->withInput()->withErrors($location->getErrors()); } @@ -182,25 +178,25 @@ class LocationsController extends Controller } if ($location->image) { - try { + try { Storage::disk('public')->delete('locations/'.$location->image); } catch (\Exception $e) { \Log::error($e); } } $location->delete(); + return redirect()->to(route('locations.index'))->with('success', trans('admin/locations/message.delete.success')); } - /** - * Returns a view that invokes the ajax tables which actually contains - * the content for the locations detail page. - * - * @author [A. Gianotto] [] - * @param int $id - * @since [v1.0] - * @return \Illuminate\Contracts\View\View + * Returns a view that invokes the ajax tables which actually contains + * the content for the locations detail page. + * + * @author [A. Gianotto] [] + * @param int $id + * @since [v1.0] + * @return \Illuminate\Contracts\View\View */ public function show($id = null) { @@ -212,29 +208,26 @@ class LocationsController extends Controller return redirect()->route('locations.index')->with('error', trans('admin/locations/message.does_not_exist')); } - -public function print_assigned($id) - { - $location = Location::where('id',$id)->first(); - $parent = Location::where('id',$location->parent_id)->first(); - $manager = User::where('id',$location->manager_id)->first(); + public function print_assigned($id) + { + $location = Location::where('id', $id)->first(); + $parent = Location::where('id', $location->parent_id)->first(); + $manager = User::where('id', $location->manager_id)->first(); $users = User::where('location_id', $id)->with('company', 'department', 'location')->get(); $assets = Asset::where('assigned_to', $id)->where('assigned_type', Location::class)->with('model', 'model.category')->get(); - return view('locations/print')->with('assets', $assets)->with('users',$users)->with('location', $location)->with('parent', $parent)->with('manager', $manager); + return view('locations/print')->with('assets', $assets)->with('users', $users)->with('location', $location)->with('parent', $parent)->with('manager', $manager); } - + public function print_all_assigned($id) { - - $location = Location::where('id',$id)->first(); - $parent = Location::where('id',$location->parent_id)->first(); - $manager = User::where('id',$location->manager_id)->first(); + $location = Location::where('id', $id)->first(); + $parent = Location::where('id', $location->parent_id)->first(); + $manager = User::where('id', $location->manager_id)->first(); $users = User::where('location_id', $id)->with('company', 'department', 'location')->get(); $assets = Asset::where('location_id', $id)->with('model', 'model.category')->get(); - return view('locations/print')->with('assets', $assets)->with('users',$users)->with('location', $location)->with('parent', $parent)->with('manager', $manager); + return view('locations/print')->with('assets', $assets)->with('users', $users)->with('location', $location)->with('parent', $parent)->with('manager', $manager); } - -} \ No newline at end of file +} diff --git a/app/Http/Controllers/ManufacturersController.php b/app/Http/Controllers/ManufacturersController.php index 1943300e30..1f7d2f2c07 100755 --- a/app/Http/Controllers/ManufacturersController.php +++ b/app/Http/Controllers/ManufacturersController.php @@ -1,4 +1,5 @@ authorize('index', Manufacturer::class); + return view('manufacturers/index'); } - /** * Returns a view that displays a form to create a new manufacturer. * @@ -45,10 +46,10 @@ class ManufacturersController extends Controller public function create() { $this->authorize('create', Manufacturer::class); + return view('manufacturers/edit')->with('item', new Manufacturer); } - /** * Validates and stores the data for a new manufacturer. * @@ -61,22 +62,20 @@ class ManufacturersController extends Controller */ public function store(ImageUploadRequest $request) { - $this->authorize('create', Manufacturer::class); $manufacturer = new Manufacturer; - $manufacturer->name = $request->input('name'); - $manufacturer->user_id = Auth::id(); - $manufacturer->url = $request->input('url'); - $manufacturer->support_url = $request->input('support_url'); - $manufacturer->support_phone = $request->input('support_phone'); - $manufacturer->support_email = $request->input('support_email'); + $manufacturer->name = $request->input('name'); + $manufacturer->user_id = Auth::id(); + $manufacturer->url = $request->input('url'); + $manufacturer->support_url = $request->input('support_url'); + $manufacturer->support_phone = $request->input('support_phone'); + $manufacturer->support_email = $request->input('support_email'); $manufacturer = $request->handleImages($manufacturer); - - if ($manufacturer->save()) { return redirect()->route('manufacturers.index')->with('success', trans('admin/manufacturers/message.create.success')); } + return redirect()->back()->withInput()->withErrors($manufacturer->getErrors()); } @@ -96,7 +95,7 @@ class ManufacturersController extends Controller $this->authorize('update', Manufacturer::class); // Check if the manufacturer exists - if (!$item = Manufacturer::find($manufacturerId)) { + if (! $item = Manufacturer::find($manufacturerId)) { return redirect()->route('manufacturers.index')->with('error', trans('admin/manufacturers/message.does_not_exist')); } @@ -104,7 +103,6 @@ class ManufacturersController extends Controller return view('manufacturers/edit', compact('item')); } - /** * Validates and stores the updated manufacturer data. * @@ -126,11 +124,11 @@ class ManufacturersController extends Controller } // Save the data - $manufacturer->name = $request->input('name'); - $manufacturer->url = $request->input('url'); - $manufacturer->support_url = $request->input('support_url'); - $manufacturer->support_phone = $request->input('support_phone'); - $manufacturer->support_email = $request->input('support_email'); + $manufacturer->name = $request->input('name'); + $manufacturer->url = $request->input('url'); + $manufacturer->support_url = $request->input('support_url'); + $manufacturer->support_phone = $request->input('support_phone'); + $manufacturer->support_email = $request->input('support_email'); // Set the model's image property to null if the image is being deleted if ($request->input('image_delete') == 1) { @@ -139,10 +137,10 @@ class ManufacturersController extends Controller $manufacturer = $request->handleImages($manufacturer); - if ($manufacturer->save()) { return redirect()->route('manufacturers.index')->with('success', trans('admin/manufacturers/message.update.success')); } + return redirect()->back()->withInput()->withErrors($manufacturer->getErrors()); } @@ -162,12 +160,12 @@ class ManufacturersController extends Controller return redirect()->route('manufacturers.index')->with('error', trans('admin/manufacturers/message.not_found')); } - if (!$manufacturer->isDeletable()) { + if (! $manufacturer->isDeletable()) { return redirect()->route('manufacturers.index')->with('error', trans('admin/manufacturers/message.assoc_users')); } if ($manufacturer->image) { - try { + try { Storage::disk('public')->delete('manufacturers/'.$manufacturer->image); } catch (\Exception $e) { \Log::info($e); @@ -175,7 +173,7 @@ class ManufacturersController extends Controller } // Soft delete the manufacturer if active, permanent delete if is already deleted - if($manufacturer->deleted_at === NULL) { + if ($manufacturer->deleted_at === null) { $manufacturer->delete(); } else { $manufacturer->forceDelete(); @@ -221,7 +219,7 @@ class ManufacturersController extends Controller public function restore($manufacturers_id) { $this->authorize('create', Manufacturer::class); - $manufacturer = Manufacturer::onlyTrashed()->where('id',$manufacturers_id)->first(); + $manufacturer = Manufacturer::onlyTrashed()->where('id', $manufacturers_id)->first(); if ($manufacturer) { @@ -230,9 +228,10 @@ class ManufacturersController extends Controller if ($manufacturer->restore()) { return redirect()->route('manufacturers.index')->with('success', trans('admin/manufacturers/message.restore.success')); } + return redirect()->back()->with('error', 'Could not restore.'); } - return redirect()->back()->with('error', trans('admin/manufacturers/message.does_not_exist')); + return redirect()->back()->with('error', trans('admin/manufacturers/message.does_not_exist')); } } diff --git a/app/Http/Controllers/ModalController.php b/app/Http/Controllers/ModalController.php index 61a3cf10b6..05f2b280d5 100644 --- a/app/Http/Controllers/ModalController.php +++ b/app/Http/Controllers/ModalController.php @@ -6,15 +6,17 @@ use App\Helpers\Helper; class ModalController extends Controller { - function show($type, $itemId = null) { + public function show($type, $itemId = null) + { $view = view("modals.${type}"); - if($type == "statuslabel") { + if ($type == 'statuslabel') { $view->with('statuslabel_types', Helper::statusTypeList()); } - if(in_array($type, ['kit-model', 'kit-license', 'kit-consumable', 'kit-accessory'])) { + if (in_array($type, ['kit-model', 'kit-license', 'kit-consumable', 'kit-accessory'])) { $view->with('kitId', $itemId); } + return $view; } } diff --git a/app/Http/Controllers/ProfileController.php b/app/Http/Controllers/ProfileController.php index c43317fd79..ef6c00a54a 100755 --- a/app/Http/Controllers/ProfileController.php +++ b/app/Http/Controllers/ProfileController.php @@ -1,4 +1,5 @@ ] - * @since [v1.0] - * @return \Illuminate\Contracts\View\View + * Returns a view with the user's profile form for editing + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @return \Illuminate\Contracts\View\View */ public function getIndex() { $user = Auth::user(); + return view('account/profile', compact('user')); } /** - * Validates and stores the user's update data. - * - * @author [A. Gianotto] [] - * @since [v1.0] - * @return \Illuminate\Http\RedirectResponse + * Validates and stores the user's update data. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @return \Illuminate\Http\RedirectResponse */ public function postIndex(ImageUploadRequest $request) { - $user = Auth::user(); $user->first_name = $request->input('first_name'); - $user->last_name = $request->input('last_name'); - $user->website = $request->input('website'); - $user->gravatar = $request->input('gravatar'); - $user->skin = $request->input('skin'); - $user->phone = $request->input('phone'); + $user->last_name = $request->input('last_name'); + $user->website = $request->input('website'); + $user->gravatar = $request->input('gravatar'); + $user->skin = $request->input('skin'); + $user->phone = $request->input('phone'); - if (!config('app.lock_passwords')) { + if (! config('app.lock_passwords')) { $user->locale = $request->input('locale', 'en'); } - if ((Gate::allows('self.two_factor')) && ((Setting::getSettings()->two_factor_enabled=='1') && (!config('app.lock_passwords')))) { + if ((Gate::allows('self.two_factor')) && ((Setting::getSettings()->two_factor_enabled == '1') && (! config('app.lock_passwords')))) { $user->two_factor_optin = $request->input('two_factor_optin', '0'); } - if (Gate::allows('self.edit_location') && (!config('app.lock_passwords'))) { - $user->location_id = $request->input('location_id'); + if (Gate::allows('self.edit_location') && (! config('app.lock_passwords'))) { + $user->location_id = $request->input('location_id'); } - if ($request->input('avatar_delete') == 1) { $user->avatar = null; } - if ($request->hasFile('avatar')) { $path = 'avatars'; - if(!Storage::disk('public')->exists($path)) Storage::disk('public')->makeDirectory($path, 775); + if (! Storage::disk('public')->exists($path)) { + Storage::disk('public')->makeDirectory($path, 775); + } $upload = $image = $request->file('avatar'); $ext = $image->getClientOriginalExtension(); $file_name = 'avatar-'.str_random(18).'.'.$ext; - if ($image->getClientOriginalExtension()!='svg') { - $upload = Image::make($image->getRealPath())->resize(84, 84); + if ($image->getClientOriginalExtension() != 'svg') { + $upload = Image::make($image->getRealPath())->resize(84, 84); } // This requires a string instead of an object, so we use ($string) - Storage::disk('public')->put($path.'/'.$file_name, (string)$upload->encode()); + Storage::disk('public')->put($path.'/'.$file_name, (string) $upload->encode()); // Remove Current image if exists if (($user->avatar) && (Storage::disk('public')->exists($path.'/'.$user->avatar))) { @@ -93,15 +94,13 @@ class ProfileController extends Controller $user->avatar = $file_name; } - - if ($user->save()) { return redirect()->route('profile')->with('success', 'Account successfully updated'); } + return redirect()->back()->withInput()->withErrors($user->getErrors()); } - /** * Returns a page with the API token generation interface. * @@ -112,7 +111,8 @@ class ProfileController extends Controller * @since [v4.0] * @return View */ - public function api() { + public function api() + { return view('account/api'); } @@ -124,6 +124,7 @@ class ProfileController extends Controller public function password() { $user = Auth::user(); + return view('account/change-password', compact('user')); } @@ -134,25 +135,23 @@ class ProfileController extends Controller */ public function passwordSave(Request $request) { - if (config('app.lock_passwords')) { return redirect()->route('account.password.index')->with('error', trans('admin/users/table.lock_passwords')); } $user = Auth::user(); - if ($user->ldap_import=='1') { + if ($user->ldap_import == '1') { return redirect()->route('account.password.index')->with('error', trans('admin/users/message.error.password_ldap')); } - $rules = array( + $rules = [ 'current_password' => 'required', 'password' => Setting::passwordComplexityRulesSaving('store').'|confirmed', - ); + ]; $validator = \Validator::make($request->all(), $rules); - $validator->after(function($validator) use ($request, $user) { - - if (!Hash::check($request->input('current_password'), $user->password)) { + $validator->after(function ($validator) use ($request, $user) { + if (! Hash::check($request->input('current_password'), $user->password)) { $validator->errors()->add('current_password', trans('validation.hashed_pass')); } @@ -165,30 +164,24 @@ class ProfileController extends Controller // There may be a more elegant way to do this in the future. // First let's see if that option is enabled in the settings - if (strpos(Setting::passwordComplexityRulesSaving('store'), 'disallow_same_pwd_as_user_fields') !== FALSE) { + if (strpos(Setting::passwordComplexityRulesSaving('store'), 'disallow_same_pwd_as_user_fields') !== false) { if (($request->input('password') == $user->username) || ($request->input('password') == $user->email) || ($request->input('password') == $user->first_name) || - ($request->input('password') == $user->last_name)) - { + ($request->input('password') == $user->last_name)) { $validator->errors()->add('password', trans('validation.disallow_same_pwd_as_user_fields')); } } - - - - }); - if (!$validator->fails()) { + if (! $validator->fails()) { $user->password = Hash::make($request->input('password')); $user->save(); + return redirect()->route('account.password.index')->with('success', 'Password updated!'); - } + return redirect()->back()->withInput()->withErrors($validator); - - } /** @@ -202,14 +195,12 @@ class ProfileController extends Controller * @since [v4.0] * @return View */ - - public function getMenuState(Request $request) { - if ($request->input('state')=='open') { + public function getMenuState(Request $request) + { + if ($request->input('state') == 'open') { $request->session()->put('menu_state', 'open'); } else { $request->session()->put('menu_state', 'closed'); } } - - } diff --git a/app/Http/Controllers/ReportsController.php b/app/Http/Controllers/ReportsController.php index f0e4c515e0..1665ef3d15 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -1,4 +1,5 @@ authorize('reports.view'); $accessories = Accessory::orderBy('created_at', 'DESC')->with('company')->get(); + return view('reports/accessories', compact('accessories')); } @@ -63,28 +68,28 @@ class ReportsController extends Controller $this->authorize('reports.view'); $accessories = Accessory::orderBy('created_at', 'DESC')->get(); - $rows = array(); - $header = array( + $rows = []; + $header = [ trans('admin/accessories/table.title'), trans('admin/accessories/general.accessory_category'), trans('admin/accessories/general.total'), - trans('admin/accessories/general.remaining') - ); + trans('admin/accessories/general.remaining'), + ]; $header = array_map('trim', $header); - $rows[] = implode($header, ', '); + $rows[] = implode(', ', $header); // Row per accessory foreach ($accessories as $accessory) { - $row = array(); + $row = []; $row[] = e($accessory->accessory_name); $row[] = e($accessory->accessory_category); $row[] = e($accessory->total); $row[] = e($accessory->remaining); - $rows[] = implode($row, ','); + $rows[] = implode(',', $row); } - $csv = implode($rows, "\n"); + $csv = implode("\n", $rows); $response = Response::make($csv, 200); $response->header('Content-Type', 'text/csv'); $response->header('Content-disposition', 'attachment;filename=report.csv'); @@ -103,11 +108,7 @@ class ReportsController extends Controller { $this->authorize('reports.view'); $depreciations = Depreciation::get(); - // Grab all the assets - $assets = Asset::with( 'assignedTo', 'assetstatus', 'defaultLoc', 'location', 'company', 'model.category', 'model.depreciation') - ->orderBy('created_at', 'DESC')->get(); - - return view('reports/depreciation', compact('assets'))->with('depreciations',$depreciations); + return view('reports/depreciation')->with('depreciations',$depreciations); } /** @@ -128,7 +129,7 @@ class ReportsController extends Controller $csv = \League\Csv\Writer::createFromFileObject(new \SplTempFileObject()); $csv->setOutputBOM(Reader::BOM_UTF16_BE); - $rows = [ ]; + $rows = []; // Create the header row $header = [ @@ -140,7 +141,7 @@ class ReportsController extends Controller trans('admin/hardware/table.purchase_date'), trans('admin/hardware/table.purchase_cost'), trans('admin/hardware/table.book_value'), - trans('admin/hardware/table.diff') + trans('admin/hardware/table.diff'), ]; //we insert the CSV header @@ -148,7 +149,7 @@ class ReportsController extends Controller // Create a row per asset foreach ($assets as $asset) { - $row = [ ]; + $row = []; $row[] = e($asset->asset_tag); $row[] = e($asset->name); $row[] = e($asset->serial); @@ -159,9 +160,9 @@ class ReportsController extends Controller $row[] = ''; // Empty string if unassigned } - if (( $asset->assigned_to > 0 ) && ( $location = $asset->location )) { + if (($asset->assigned_to > 0) && ($location = $asset->location)) { if ($location->city) { - $row[] = e($location->city) . ', ' . e($location->state); + $row[] = e($location->city).', '.e($location->state); } elseif ($location->name) { $row[] = e($location->name); } else { @@ -178,15 +179,14 @@ class ReportsController extends Controller } $row[] = $asset->purchase_date; - $row[] = $currency . Helper::formatCurrencyOutput($asset->purchase_cost); - $row[] = $currency . Helper::formatCurrencyOutput($asset->getDepreciatedValue()); - $row[] = $currency . Helper::formatCurrencyOutput(( $asset->purchase_cost - $asset->getDepreciatedValue() )); + $row[] = $currency.Helper::formatCurrencyOutput($asset->purchase_cost); + $row[] = $currency.Helper::formatCurrencyOutput($asset->getDepreciatedValue()); + $row[] = $currency.Helper::formatCurrencyOutput(($asset->purchase_cost - $asset->getDepreciatedValue())); $csv->insertOne($row); } - $csv->output('depreciation-report-' . date('Y-m-d') . '.csv'); + $csv->output('depreciation-report-'.date('Y-m-d').'.csv'); die; - } @@ -200,6 +200,7 @@ class ReportsController extends Controller public function audit() { $this->authorize('reports.view'); + return view('reports/audit'); } @@ -214,10 +215,10 @@ class ReportsController extends Controller public function getActivityReport() { $this->authorize('reports.view'); + return view('reports/activity'); } - /** * Exports the activity report to CSV * @@ -232,7 +233,6 @@ class ReportsController extends Controller \Debugbar::disable(); $response = new StreamedResponse(function () { - \Log::debug('Starting streamed response'); // Open output stream @@ -250,28 +250,26 @@ class ReportsController extends Controller 'Changed', ]; - $executionTime = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"]; + $executionTime = microtime(true) - $_SERVER['REQUEST_TIME_FLOAT']; \Log::debug('Starting headers: '.$executionTime); fputcsv($handle, $header); - $executionTime = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"]; + $executionTime = microtime(true) - $_SERVER['REQUEST_TIME_FLOAT']; \Log::debug('Added headers: '.$executionTime); - $actionlogs = Actionlog::with('item', 'user', 'target','location') + $actionlogs = Actionlog::with('item', 'user', 'target', 'location') ->orderBy('created_at', 'DESC') - ->chunk(20, function($actionlogs) use($handle) { - - $executionTime = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"]; + ->chunk(20, function ($actionlogs) use ($handle) { + $executionTime = microtime(true) - $_SERVER['REQUEST_TIME_FLOAT']; \Log::debug('Walking results: '.$executionTime); $count = 0; foreach ($actionlogs as $actionlog) { - $count++; $target_name = ''; if ($actionlog->target) { - if ($actionlog->targetType()=='user') { - $target_name = $actionlog->target->getFullNameAttribute(); + if ($actionlog->targetType() == 'user') { + $target_name = $actionlog->target->getFullNameAttribute(); } else { $target_name = $actionlog->target->getDisplayNameAttribute(); } @@ -283,31 +281,26 @@ class ReportsController extends Controller ($actionlog->user) ? e($actionlog->user->getFullNameAttribute()) : '', $actionlog->present()->actionType(), e($actionlog->itemType()), - ($actionlog->itemType()=='user') ? $actionlog->filename : e($actionlog->item->getDisplayNameAttribute()), + ($actionlog->itemType() == 'user') ? $actionlog->filename : e($actionlog->item->getDisplayNameAttribute()), $target_name, - ($actionlog->note) ? e($actionlog->note): '', + ($actionlog->note) ? e($actionlog->note) : '', $actionlog->log_meta, ]; fputcsv($handle, $row); - } }); // Close the output stream fclose($handle); - $executionTime = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"]; - \Log::debug('-- SCRIPT COMPLETED IN '. $executionTime); - + $executionTime = microtime(true) - $_SERVER['REQUEST_TIME_FLOAT']; + \Log::debug('-- SCRIPT COMPLETED IN '.$executionTime); }, 200, [ 'Content-Type' => 'text/csv', - 'Content-Disposition' - => 'attachment; filename="activity-report-'.date('Y-m-d-his').'.csv"', + 'Content-Disposition' => 'attachment; filename="activity-report-'.date('Y-m-d-his').'.csv"', ]); return $response; - - } @@ -341,8 +334,8 @@ class ReportsController extends Controller $this->authorize('reports.view'); $licenses = License::orderBy('created_at', 'DESC')->get(); - $rows = [ ]; - $header = [ + $rows = []; + $header = [ trans('admin/licenses/table.title'), trans('admin/licenses/table.serial'), trans('admin/licenses/form.seats'), @@ -350,28 +343,29 @@ class ReportsController extends Controller trans('admin/licenses/form.expiration'), trans('general.purchase_date'), trans('general.depreciation'), - trans('general.purchase_cost') + trans('general.purchase_cost'), ]; $header = array_map('trim', $header); - $rows[] = implode($header, ', '); + $rows[] = implode(', ', $header); // Row per license foreach ($licenses as $license) { - $row = [ ]; + $row = []; $row[] = e($license->name); $row[] = e($license->serial); $row[] = e($license->seats); $row[] = $license->remaincount(); $row[] = $license->expiration_date; $row[] = $license->purchase_date; - $row[] = ($license->depreciation!='') ? '' : e($license->depreciation->name); - $row[] = '"' . Helper::formatCurrencyOutput($license->purchase_cost) . '"'; + $row[] = ($license->depreciation != '') ? '' : e($license->depreciation->name); + $row[] = '"'.Helper::formatCurrencyOutput($license->purchase_cost).'"'; - $rows[] = implode($row, ','); + $rows[] = implode(',', $row); } - $csv = implode($rows, "\n"); + + $csv = implode("\n", $rows); $response = Response::make($csv, 200); $response->header('Content-Type', 'text/csv'); $response->header('Content-disposition', 'attachment;filename=report.csv'); @@ -391,6 +385,7 @@ class ReportsController extends Controller { $this->authorize('reports.view'); $customfields = CustomField::get(); + return view('reports/custom')->with('customfields', $customfields); } @@ -407,11 +402,9 @@ class ReportsController extends Controller ini_set('max_execution_time', env('REPORT_TIME_LIMIT', 12000)); //12000 seconds = 200 minutes $this->authorize('reports.view'); - \Debugbar::disable(); $customfields = CustomField::get(); $response = new StreamedResponse(function () use ($customfields, $request) { - \Log::debug('Starting streamed response'); // Open output stream @@ -419,7 +412,7 @@ class ReportsController extends Controller stream_set_timeout($handle, 2000); if ($request->filled('use_bom')) { - fprintf($handle, chr(0xEF) . chr(0xBB) . chr(0xBF)); + fprintf($handle, chr(0xEF).chr(0xBB).chr(0xBF)); } $header = []; @@ -457,7 +450,7 @@ class ReportsController extends Controller $header[] = trans('admin/hardware/table.purchase_date'); } - if (($request->filled('purchase_cost')) || ($request->filled('depreciation'))) { + if (($request->filled('purchase_cost')) || ($request->filled('depreciation'))) { $header[] = trans('admin/hardware/table.purchase_cost'); } @@ -564,21 +557,20 @@ class ReportsController extends Controller foreach ($customfields as $customfield) { - if (e($request->input($customfield->db_column_name())) == '1') { + if ($request->input($customfield->db_column_name()) == '1') { $header[] = $customfield->name; } } - $executionTime = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"]; + $executionTime = microtime(true) - $_SERVER['REQUEST_TIME_FLOAT']; \Log::debug('Starting headers: '.$executionTime); fputcsv($handle, $header); - $executionTime = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"]; + $executionTime = microtime(true) - $_SERVER['REQUEST_TIME_FLOAT']; \Log::debug('Added headers: '.$executionTime); - $assets = \App\Models\Company::scopeCompanyables(Asset::select('assets.*'))->with( - 'location', 'assetstatus', 'assetlog', 'company', 'defaultLoc','assignedTo', - 'model.category', 'model.manufacturer','supplier'); + 'location', 'assetstatus', 'assetlog', 'company', 'defaultLoc', 'assignedTo', + 'model.category', 'model.manufacturer', 'supplier'); if ($request->filled('by_location_id')) { $assets->where('assets.location_id', $request->input('by_location_id')); @@ -641,10 +633,9 @@ class ReportsController extends Controller if (($request->filled('next_audit_start')) && ($request->filled('next_audit_end'))) { $assets->whereBetween('assets.next_audit_date', [$request->input('next_audit_start'), $request->input('next_audit_end')]); } + $assets->orderBy('assets.id', 'ASC')->chunk(20, function ($assets) use ($handle, $customfields, $request) { - $assets->orderBy('assets.id', 'ASC')->chunk(20, function($assets) use($handle, $customfields, $request) { - - $executionTime = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"]; + $executionTime = microtime(true) - $_SERVER['REQUEST_TIME_FLOAT']; \Log::debug('Walking results: '.$executionTime); $count = 0; foreach ($assets as $asset) { @@ -689,7 +680,7 @@ class ReportsController extends Controller } if ($request->filled('eol')) { - $row[] = ($asset->purchase_date!='') ? $asset->present()->eol_date() : ''; + $row[] = ($asset->purchase_date != '') ? $asset->present()->eol_date() : ''; } if ($request->filled('order')) { @@ -700,7 +691,6 @@ class ReportsController extends Controller $row[] = ($asset->supplier) ? $asset->supplier->name : ''; } - if ($request->filled('location')) { $row[] = ($asset->location) ? $asset->location->present()->name() : ''; } @@ -727,7 +717,6 @@ class ReportsController extends Controller $row[] = ($asset->defaultLoc) ? $asset->defaultLoc->zip : ''; } - if ($request->filled('assigned_to')) { $row[] = ($asset->checkedOutToUser() && $asset->assigned) ? $asset->assigned->getFullNameAttribute() : ($asset->assigned ? $asset->assigned->display_name : ''); $row[] = ($asset->checkedOutToUser() && $asset->assigned) ? 'user' : $asset->assignedType(); @@ -759,7 +748,6 @@ class ReportsController extends Controller } } - if ($request->filled('department')) { if ($asset->checkedOutToUser()) { $row[] = (($asset->assignedto) && ($asset->assignedto->department)) ? $asset->assignedto->department->name : ''; @@ -772,19 +760,17 @@ class ReportsController extends Controller $row[] = ($asset->assetstatus) ? $asset->assetstatus->name.' ('.$asset->present()->statusMeta.')' : ''; } - if ($request->filled('warranty')) { $row[] = ($asset->warranty_months) ? $asset->warranty_months : ''; $row[] = $asset->present()->warrantee_expires(); } - if ($request->filled('depreciation')) { $depreciation = $asset->getDepreciatedValue(); $diff = ($asset->purchase_cost - $depreciation); - $row[] = Helper::formatCurrencyOutput($depreciation); - $row[] = Helper::formatCurrencyOutput($diff); - $row[] = ($asset->depreciation) ? $asset->depreciated_date()->format('Y-m-d') : ''; + $row[] = Helper::formatCurrencyOutput($depreciation); + $row[] = Helper::formatCurrencyOutput($diff); + $row[] = ($asset->depreciation) ? $asset->depreciated_date()->format('Y-m-d') : ''; } if ($request->filled('checkout_date')) { @@ -822,30 +808,23 @@ class ReportsController extends Controller } } fputcsv($handle, $row); - $executionTime = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"]; - \Log::debug('-- Record '.$count.' Asset ID:' .$asset->id. ' in '. $executionTime); - + $executionTime = microtime(true) - $_SERVER['REQUEST_TIME_FLOAT']; + \Log::debug('-- Record '.$count.' Asset ID:'.$asset->id.' in '.$executionTime); } }); // Close the output stream fclose($handle); - $executionTime = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"]; - \Log::debug('-- SCRIPT COMPLETED IN '. $executionTime); - + $executionTime = microtime(true) - $_SERVER['REQUEST_TIME_FLOAT']; + \Log::debug('-- SCRIPT COMPLETED IN '.$executionTime); }, 200, [ 'Content-Type' => 'text/csv', - 'Content-Disposition' - => 'attachment; filename="custom-assets-report-'.date('Y-m-d-his').'.csv"', + 'Content-Disposition' => 'attachment; filename="custom-assets-report-'.date('Y-m-d-his').'.csv"', ]); - return $response; - - } - /** * getImprovementsReport * @@ -862,7 +841,6 @@ class ReportsController extends Controller ->get(); return view('reports/asset_maintenances', compact('assetMaintenances')); - } /** @@ -880,7 +858,7 @@ class ReportsController extends Controller ->orderBy('created_at', 'DESC') ->get(); - $rows = [ ]; + $rows = []; $header = [ trans('admin/hardware/table.asset_tag'), @@ -891,14 +869,14 @@ class ReportsController extends Controller trans('admin/asset_maintenances/form.start_date'), trans('admin/asset_maintenances/form.completion_date'), trans('admin/asset_maintenances/form.asset_maintenance_time'), - trans('admin/asset_maintenances/form.cost') + trans('admin/asset_maintenances/form.cost'), ]; $header = array_map('trim', $header); - $rows[] = implode($header, ','); + $rows[] = implode(',', $header); foreach ($assetMaintenances as $assetMaintenance) { - $row = [ ]; + $row = []; $row[] = str_replace(',', '', e($assetMaintenance->asset->asset_tag)); $row[] = str_replace(',', '', e($assetMaintenance->asset->name)); $row[] = str_replace(',', '', e($assetMaintenance->supplier->name)); @@ -914,11 +892,11 @@ class ReportsController extends Controller } $row[] = $improvementTime; $row[] = trans('general.currency') . Helper::formatCurrencyOutput($assetMaintenance->cost); - $rows[] = implode($row, ','); + $rows[] = implode(',', $row); } // spit out a csv - $csv = implode($rows, "\n"); + $csv = implode("\n", $rows); $response = Response::make($csv, 200); $response->header('Content-Type', 'text/csv'); $response->header('Content-disposition', 'attachment;filename=report.csv'); @@ -930,13 +908,15 @@ class ReportsController extends Controller * getAssetAcceptanceReport * * @return mixed - * @throws AuthorizationException + * @throws \Illuminate\Auth\Access\AuthorizationException + * @author Vincent Sposato * @version v1.0 */ - public function getAssetAcceptanceReport() + public function getAssetAcceptanceReport($deleted = false) { $this->authorize('reports.view'); + $showDeleted = $deleted == 'deleted'; /** * Get all assets with pending checkout acceptances @@ -949,27 +929,101 @@ class ReportsController extends Controller return $acceptance->checkoutable_type == 'App\Models\Asset' && !is_null($acceptance->assignedTo); }) ->map(function($acceptance) { - return $acceptance->checkoutable; + return ['assetItem' => $acceptance->checkoutable, 'acceptance' => $acceptance]; }); - return view('reports/unaccepted_assets', compact('assetsForReport')); + return view('reports/unaccepted_assets', compact('assetsForReport','showDeleted' )); } /** - * exportAssetAcceptanceReport + * sentAssetAcceptanceReminder + * + * @param integer|null $acceptanceId + * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException + * @version v1.0 + */ + public function sentAssetAcceptanceReminder($acceptanceId = null) + { + $this->authorize('reports.view'); + + if (!$acceptance = CheckoutAcceptance::pending()->find($acceptanceId)) { + // Redirect to the unaccepted assets report page with error + return redirect()->route('reports/unaccepted_assets')->with('error', trans('general.bad_data')); + } + $assetItem = $acceptance->checkoutable; + + $logItem = $assetItem->checkouts()->where('created_at', '=', $acceptance->created_at)->get()[0]; + + if(!$assetItem->assignedTo->locale){ + Notification::locale(Setting::getSettings()->locale)->send( + $assetItem->assignedTo, + new CheckoutAssetNotification($assetItem, $assetItem->assignedTo, $logItem->user, $acceptance, $logItem->note) + ); + } else { + Notification::send( + $assetItem->assignedTo, + new CheckoutAssetNotification($assetItem, $assetItem->assignedTo, $logItem->user, $acceptance, $logItem->note) + ); + } + + return redirect()->route('reports/unaccepted_assets')->with('success', trans('admin/reports/general.reminder_sent')); + } + + /** + * sentAssetAcceptanceReminder + * + * @param integer|null $acceptanceId + * @return \Illuminate\Http\RedirectResponse + * @throws \Illuminate\Auth\Access\AuthorizationException + * @version v1.0 + */ + public function deleteAssetAcceptance($acceptanceId = null) + { + $this->authorize('reports.view'); + + if (!$acceptance = CheckoutAcceptance::pending()->find($acceptanceId)) { + // Redirect to the unaccepted assets report page with error + return redirect()->route('reports/unaccepted_assets')->with('error', trans('general.bad_data')); + } + + if($acceptance->delete()) { + return redirect()->route('reports/unaccepted_assets')->with('success', trans('admin/reports/general.acceptance_deleted')); + } else { + return redirect()->route('reports/unaccepted_assets')->with('error', trans('general.deletion_failed')); + } + } + + /** + * Exports the AssetAcceptance report to CSV * * @return \Illuminate\Http\Response * @author Vincent Sposato * @version v1.0 */ - public function exportAssetAcceptanceReport() + public function postAssetAcceptanceReport($deleted = false) { $this->authorize('reports.view'); - // Grab all the improvements - $assetsForReport = Actionlog::whereIn('id', $this->getAssetsNotAcceptedYet()) - ->get(); + $showDeleted = $deleted == 'deleted'; - $rows = [ ]; + /** + * Get all assets with pending checkout acceptances + */ + if($showDeleted) { + $acceptances = CheckoutAcceptance::pending()->withTrashed()->with(['assignedTo', 'checkoutable.assignedTo', 'checkoutable.model'])->get(); + } else { + $acceptances = CheckoutAcceptance::pending()->with(['assignedTo', 'checkoutable.assignedTo', 'checkoutable.model'])->get(); + } + + $assetsForReport = $acceptances + ->filter(function($acceptance) { + return $acceptance->checkoutable_type == 'App\Models\Asset'; + }) + ->map(function($acceptance) { + return ['assetItem' => $acceptance->checkoutable, 'acceptance' => $acceptance]; + }); + + $rows = []; $header = [ trans('general.category'), @@ -980,26 +1034,25 @@ class ReportsController extends Controller ]; $header = array_map('trim', $header); - $rows[] = implode($header, ','); + $rows[] = implode(',', $header); - foreach ($assetsForReport as $assetItem) { + foreach ($assetsForReport as $item) { $row = [ ]; - $row[] = str_replace(',', '', e($assetItem->assetlog->model->category->name)); - $row[] = str_replace(',', '', e($assetItem->assetlog->model->name)); - $row[] = str_replace(',', '', e($assetItem->assetlog->present()->name())); - $row[] = str_replace(',', '', e($assetItem->assetlog->asset_tag)); - $row[] = str_replace(',', '', e($assetItem->assetlog->assignedTo->present()->name())); - $rows[] = implode($row, ','); + $row[] = str_replace(',', '', e($item['assetItem']->model->category->name)); + $row[] = str_replace(',', '', e($item['assetItem']->model->name)); + $row[] = str_replace(',', '', e($item['assetItem']->name)); + $row[] = str_replace(',', '', e($item['assetItem']->asset_tag)); + $row[] = str_replace(',', '', e(($item['acceptance']->assignedTo) ? $item['acceptance']->assignedTo->present()->name() : trans('admin/reports/general.deleted_user'))); + $rows[] = implode(',', $row); } // spit out a csv - $csv = implode($rows, "\n"); + $csv = implode("\n", $rows); $response = Response::make($csv, 200); $response->header('Content-Type', 'text/csv'); $response->header('Content-disposition', 'attachment;filename=report.csv'); return $response; - } /** @@ -1034,6 +1087,7 @@ class ReportsController extends Controller protected function getModelsInCategoriesThatRequireAcceptance($assetCategoriesRequiringAcceptance) { $this->authorize('reports.view'); + return array_pluck(Model::inCategory($assetCategoriesRequiringAcceptance) ->select('id') ->get() @@ -1050,6 +1104,7 @@ class ReportsController extends Controller protected function getCategoriesThatRequireAcceptance() { $this->authorize('reports.view'); + return array_pluck(Category::requiresAcceptance() ->select('id') ->get() @@ -1066,6 +1121,7 @@ class ReportsController extends Controller protected function getAssetsCheckedOutRequiringAcceptance() { $this->authorize('reports.view'); + return $this->getCheckedOutAssetsRequiringAcceptance( $this->getModelsInCategoriesThatRequireAcceptance($this->getCategoriesThatRequireAcceptance()) ); @@ -1081,6 +1137,7 @@ class ReportsController extends Controller protected function getAssetsNotAcceptedYet() { $this->authorize('reports.view'); + return Asset::unaccepted(); } } diff --git a/app/Http/Controllers/SettingsController.php b/app/Http/Controllers/SettingsController.php index 02a0f2c47c..a52598592f 100755 --- a/app/Http/Controllers/SettingsController.php +++ b/app/Http/Controllers/SettingsController.php @@ -2,8 +2,8 @@ namespace App\Http\Controllers; -use enshrined\svgSanitize\Sanitizer; use App\Helpers\Helper; +use App\Helpers\StorageHelper; use App\Http\Requests\ImageUploadRequest; use App\Http\Requests\SettingsSamlRequest; use App\Http\Requests\SetupUserRequest; @@ -15,13 +15,13 @@ use Artisan; use Auth; use Crypt; use DB; +use enshrined\svgSanitize\Sanitizer; use Illuminate\Http\Request; use Illuminate\Support\Facades\Storage; use Image; use Input; use Redirect; use Response; -use App\Helpers\StorageHelper; /** * This controller handles all actions related to Settings for @@ -46,17 +46,17 @@ class SettingsController extends Controller $start_settings['php_version_min'] = false; if (version_compare(PHP_VERSION, config('app.min_php'), '<')) { - return response('

This software requires PHP version ' . config('app.min_php') . ' or greater. This server is running ' . PHP_VERSION . '.

Please upgrade PHP on this server and try again.

', 500); + return response('

This software requires PHP version '.config('app.min_php').' or greater. This server is running '.PHP_VERSION.'.

Please upgrade PHP on this server and try again.

', 500); } try { - $conn = DB::select('select 2 + 2'); - $start_settings['db_conn'] = true; - $start_settings['db_name'] = DB::connection()->getDatabaseName(); + $conn = DB::select('select 2 + 2'); + $start_settings['db_conn'] = true; + $start_settings['db_name'] = DB::connection()->getDatabaseName(); $start_settings['db_error'] = null; } catch (\PDOException $e) { - $start_settings['db_conn'] = false; - $start_settings['db_name'] = config('database.connections.mysql.database'); + $start_settings['db_conn'] = false; + $start_settings['db_name'] = config('database.connections.mysql.database'); $start_settings['db_error'] = $e->getMessage(); } @@ -65,23 +65,23 @@ class SettingsController extends Controller $host = array_key_exists('SERVER_NAME', $_SERVER) ? $_SERVER['SERVER_NAME'] : null; $port = array_key_exists('SERVER_PORT', $_SERVER) ? $_SERVER['SERVER_PORT'] : null; if (('http://' === $protocol && '80' != $port) || ('https://' === $protocol && '443' != $port)) { - $host .= ':' . $port; + $host .= ':'.$port; } - $pageURL = $protocol . $host . $_SERVER['REQUEST_URI']; + $pageURL = $protocol.$host.$_SERVER['REQUEST_URI']; - $start_settings['url_valid'] = (url('/') . '/setup' === $pageURL); + $start_settings['url_valid'] = (url('/').'/setup' === $pageURL); - $start_settings['url_config'] = url('/'); - $start_settings['real_url'] = $pageURL; + $start_settings['url_config'] = url('/'); + $start_settings['real_url'] = $pageURL; $start_settings['php_version_min'] = true; // Curl the .env file to make sure it's not accessible via a browser - $ch = curl_init($protocol . $host . '/.env'); + $ch = curl_init($protocol.$host.'/.env'); curl_setopt($ch, CURLOPT_HEADER, true); // we want headers curl_setopt($ch, CURLOPT_NOBODY, true); // we don't need body curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, 10); - $output = curl_exec($ch); + $output = curl_exec($ch); $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); @@ -99,15 +99,15 @@ class SettingsController extends Controller $environment = app()->environment(); if ('production' != $environment) { - $start_settings['env'] = $environment; + $start_settings['env'] = $environment; $start_settings['prod'] = false; } else { - $start_settings['env'] = $environment; + $start_settings['env'] = $environment; $start_settings['prod'] = true; } if (function_exists('posix_getpwuid')) { // Probably Linux - $owner = posix_getpwuid(fileowner($_SERVER['SCRIPT_FILENAME'])); + $owner = posix_getpwuid(fileowner($_SERVER['SCRIPT_FILENAME'])); $start_settings['owner'] = $owner['name']; } else { // Windows // TODO: Is there a way of knowing if a windows user has elevated permissions @@ -123,11 +123,11 @@ class SettingsController extends Controller } if ((is_writable(storage_path())) - && (is_writable(storage_path() . '/framework')) - && (is_writable(storage_path() . '/framework/cache')) - && (is_writable(storage_path() . '/framework/sessions')) - && (is_writable(storage_path() . '/framework/views')) - && (is_writable(storage_path() . '/logs')) + && (is_writable(storage_path().'/framework')) + && (is_writable(storage_path().'/framework/cache')) + && (is_writable(storage_path().'/framework/sessions')) + && (is_writable(storage_path().'/framework/views')) + && (is_writable(storage_path().'/logs')) ) { $start_settings['writable'] = true; } else { @@ -153,32 +153,32 @@ class SettingsController extends Controller */ public function postSaveFirstAdmin(SetupUserRequest $request) { - $user = new User(); - $user->first_name = $data['first_name'] = $request->input('first_name'); - $user->last_name = $request->input('last_name'); - $user->email = $data['email'] = $request->input('email'); - $user->activated = 1; - $permissions = ['superuser' => 1]; + $user = new User(); + $user->first_name = $data['first_name'] = $request->input('first_name'); + $user->last_name = $request->input('last_name'); + $user->email = $data['email'] = $request->input('email'); + $user->activated = 1; + $permissions = ['superuser' => 1]; $user->permissions = json_encode($permissions); - $user->username = $data['username'] = $request->input('username'); - $user->password = bcrypt($request->input('password')); - $data['password'] = $request->input('password'); + $user->username = $data['username'] = $request->input('username'); + $user->password = bcrypt($request->input('password')); + $data['password'] = $request->input('password'); - $settings = new Setting(); + $settings = new Setting(); $settings->full_multiple_companies_support = $request->input('full_multiple_companies_support', 0); - $settings->site_name = $request->input('site_name'); - $settings->alert_email = $request->input('email'); - $settings->alerts_enabled = 1; - $settings->pwd_secure_min = 10; - $settings->brand = 1; - $settings->locale = $request->input('locale', 'en'); - $settings->default_currency = $request->input('default_currency', 'USD'); - $settings->user_id = 1; - $settings->email_domain = $request->input('email_domain'); - $settings->email_format = $request->input('email_format'); - $settings->next_auto_tag_base = 1; - $settings->auto_increment_assets = $request->input('auto_increment_assets', 0); - $settings->auto_increment_prefix = $request->input('auto_increment_prefix'); + $settings->site_name = $request->input('site_name'); + $settings->alert_email = $request->input('email'); + $settings->alerts_enabled = 1; + $settings->pwd_secure_min = 10; + $settings->brand = 1; + $settings->locale = $request->input('locale', 'en'); + $settings->default_currency = $request->input('default_currency', 'USD'); + $settings->user_id = 1; + $settings->email_domain = $request->input('email_domain'); + $settings->email_format = $request->input('email_format'); + $settings->next_auto_tag_base = 1; + $settings->auto_increment_assets = $request->input('auto_increment_assets', 0); + $settings->auto_increment_prefix = $request->input('auto_increment_prefix'); if ((! $user->isValid()) || (! $settings->isValid())) { return redirect()->back()->withInput()->withErrors($user->getErrors())->withErrors($settings->getErrors()); @@ -188,12 +188,12 @@ class SettingsController extends Controller $settings->save(); if ($request->input('email_creds') == '1') { - $data = []; - $data['email'] = $user->email; - $data['username'] = $user->username; + $data = []; + $data['email'] = $user->email; + $data['username'] = $user->username; $data['first_name'] = $user->first_name; - $data['last_name'] = $user->last_name; - $data['password'] = $request->input('password'); + $data['last_name'] = $user->last_name; + $data['password'] = $request->input('password'); $user->notify(new FirstAdminNotification($data)); } @@ -246,8 +246,7 @@ class SettingsController extends Controller public function getSetupMigrate() { Artisan::call('migrate', ['--force' => true]); - if ((! file_exists(storage_path() . '/oauth-private.key')) || (! file_exists(storage_path() . '/oauth-public.key'))) { - + if ((! file_exists(storage_path().'/oauth-private.key')) || (! file_exists(storage_path().'/oauth-public.key'))) { Artisan::call('migrate', ['--path' => 'vendor/laravel/passport/database/migrations', '--force' => true]); Artisan::call('passport:install'); } @@ -323,27 +322,26 @@ class SettingsController extends Controller $setting->modellist_displays = ''; - if (($request->filled('show_in_model_list')) && (count($request->input('show_in_model_list')) > 0)) - { + if (($request->filled('show_in_model_list')) && (count($request->input('show_in_model_list')) > 0)) { $setting->modellist_displays = implode(',', $request->input('show_in_model_list')); } $setting->full_multiple_companies_support = $request->input('full_multiple_companies_support', '0'); - $setting->unique_serial = $request->input('unique_serial', '0'); - $setting->show_images_in_email = $request->input('show_images_in_email', '0'); - $setting->show_archived_in_list = $request->input('show_archived_in_list', '0'); - $setting->dashboard_message = $request->input('dashboard_message'); - $setting->email_domain = $request->input('email_domain'); - $setting->email_format = $request->input('email_format'); - $setting->username_format = $request->input('username_format'); - $setting->require_accept_signature = $request->input('require_accept_signature'); - $setting->show_assigned_assets = $request->input('show_assigned_assets', '0'); + $setting->unique_serial = $request->input('unique_serial', '0'); + $setting->show_images_in_email = $request->input('show_images_in_email', '0'); + $setting->show_archived_in_list = $request->input('show_archived_in_list', '0'); + $setting->dashboard_message = $request->input('dashboard_message'); + $setting->email_domain = $request->input('email_domain'); + $setting->email_format = $request->input('email_format'); + $setting->username_format = $request->input('username_format'); + $setting->require_accept_signature = $request->input('require_accept_signature'); + $setting->show_assigned_assets = $request->input('show_assigned_assets', '0'); if (! config('app.lock_passwords')) { $setting->login_note = $request->input('login_note'); } - $setting->default_eula_text = $request->input('default_eula_text'); - $setting->thumbnail_max_h = $request->input('thumbnail_max_h'); + $setting->default_eula_text = $request->input('default_eula_text'); + $setting->thumbnail_max_h = $request->input('thumbnail_max_h'); $setting->privacy_policy_link = $request->input('privacy_policy_link'); $setting->depreciation_method = $request->input('depreciation_method'); @@ -394,60 +392,55 @@ class SettingsController extends Controller return redirect()->to('admin')->with('error', trans('admin/settings/message.update.error')); } - $setting->brand = $request->input('brand', '1'); - $setting->header_color = $request->input('header_color'); - $setting->support_footer = $request->input('support_footer'); - $setting->version_footer = $request->input('version_footer'); - $setting->footer_text = $request->input('footer_text'); - $setting->skin = $request->input('skin'); - $setting->allow_user_skin = $request->input('allow_user_skin'); + $setting->brand = $request->input('brand', '1'); + $setting->header_color = $request->input('header_color'); + $setting->support_footer = $request->input('support_footer'); + $setting->version_footer = $request->input('version_footer'); + $setting->footer_text = $request->input('footer_text'); + $setting->skin = $request->input('skin'); + $setting->allow_user_skin = $request->input('allow_user_skin'); $setting->show_url_in_emails = $request->input('show_url_in_emails', '0'); - $setting->logo_print_assets = $request->input('logo_print_assets', '0'); + $setting->logo_print_assets = $request->input('logo_print_assets', '0'); // Only allow the site name and CSS to be changed if lock_passwords is false // Because public demos make people act like dicks if (! config('app.lock_passwords')) { - $setting->site_name = $request->input('site_name'); + $setting->site_name = $request->input('site_name'); $setting->custom_css = $request->input('custom_css'); } - $setting = $request->handleImages($setting,600,'logo','', 'logo'); - + $setting = $request->handleImages($setting, 600, 'logo', '', 'logo'); if ('1' == $request->input('clear_logo')) { Storage::disk('public')->delete($setting->logo); - $setting->logo = null; + $setting->logo = null; $setting->brand = 1; } - - $setting = $request->handleImages($setting,600,'email_logo','', 'email_logo'); + $setting = $request->handleImages($setting, 600, 'email_logo', '', 'email_logo'); if ('1' == $request->input('clear_email_logo')) { Storage::disk('public')->delete($setting->email_logo); - $setting->email_logo = null; + $setting->email_logo = null; // If they are uploading an image, validate it and upload it } - - $setting = $request->handleImages($setting,600,'label_logo','', 'label_logo'); - + $setting = $request->handleImages($setting, 600, 'label_logo', '', 'label_logo'); if ('1' == $request->input('clear_label_logo')) { Storage::disk('public')->delete($setting->label_logo); - $setting->label_logo = null; - + $setting->label_logo = null; } // If the user wants to clear the favicon... if ($request->hasFile('favicon')) { - $favicon_image = $favicon_upload = $request->file('favicon'); - $favicon_ext = $favicon_image->getClientOriginalExtension(); - $setting->favicon = $favicon_file_name = 'favicon-uploaded.' . $favicon_ext; + $favicon_image = $favicon_upload = $request->file('favicon'); + $favicon_ext = $favicon_image->getClientOriginalExtension(); + $setting->favicon = $favicon_file_name = 'favicon-uploaded.'.$favicon_ext; - if (($favicon_image->getClientOriginalExtension()!='ico') && ($favicon_image->getClientOriginalExtension()!='svg')) { + if (($favicon_image->getClientOriginalExtension() != 'ico') && ($favicon_image->getClientOriginalExtension() != 'svg')) { $favicon_upload = Image::make($favicon_image->getRealPath())->resize(null, 36, function ($constraint) { $constraint->aspectRatio(); $constraint->upsize(); @@ -466,7 +459,7 @@ class SettingsController extends Controller } } elseif ('1' == $request->input('clear_favicon')) { Storage::disk('public')->delete($setting->clear_favicon); - $setting->favicon = null; + $setting->favicon = null; // If they are uploading an image, validate it and upload it } @@ -479,7 +472,6 @@ class SettingsController extends Controller return redirect()->back()->withInput()->withErrors($setting->getErrors()); } - /** * Return a form to allow a super admin to update settings. * @@ -511,7 +503,6 @@ class SettingsController extends Controller return redirect()->to('admin')->with('error', trans('admin/settings/message.update.error')); } if (! config('app.lock_passwords')) { - if ('' == $request->input('two_factor_enabled')) { $setting->two_factor_enabled = null; } else { @@ -519,19 +510,19 @@ class SettingsController extends Controller } // remote user login - $setting->login_remote_user_enabled = (int) $request->input('login_remote_user_enabled'); - $setting->login_common_disabled = (int) $request->input('login_common_disabled'); + $setting->login_remote_user_enabled = (int) $request->input('login_remote_user_enabled'); + $setting->login_common_disabled = (int) $request->input('login_common_disabled'); $setting->login_remote_user_custom_logout_url = $request->input('login_remote_user_custom_logout_url'); $setting->login_remote_user_header_name = $request->input('login_remote_user_header_name'); } - $setting->pwd_secure_uncommon = (int) $request->input('pwd_secure_uncommon'); - $setting->pwd_secure_min = (int) $request->input('pwd_secure_min'); + $setting->pwd_secure_uncommon = (int) $request->input('pwd_secure_uncommon'); + $setting->pwd_secure_min = (int) $request->input('pwd_secure_min'); $setting->pwd_secure_complexity = ''; if ($request->filled('pwd_secure_complexity')) { - $setting->pwd_secure_complexity = implode('|', $request->input('pwd_secure_complexity')); + $setting->pwd_secure_complexity = implode('|', $request->input('pwd_secure_complexity')); } if ($setting->save()) { @@ -576,7 +567,7 @@ class SettingsController extends Controller if (! config('app.lock_passwords')) { $setting->locale = $request->input('locale', 'en'); } - $setting->default_currency = $request->input('default_currency', '$'); + $setting->default_currency = $request->input('default_currency', '$'); $setting->date_display_format = $request->input('date_display_format'); $setting->time_display_format = $request->input('time_display_format'); $setting->digit_separator = $request->input('digit_separator'); @@ -620,18 +611,18 @@ class SettingsController extends Controller return redirect()->to('admin')->with('error', trans('admin/settings/message.update.error')); } - $alert_email = rtrim($request->input('alert_email'), ','); - $alert_email = trim($alert_email); + $alert_email = rtrim($request->input('alert_email'), ','); + $alert_email = trim($alert_email); $admin_cc_email = rtrim($request->input('admin_cc_email'), ','); $admin_cc_email = trim($admin_cc_email); - $setting->alert_email = $alert_email; - $setting->admin_cc_email = $admin_cc_email; - $setting->alerts_enabled = $request->input('alerts_enabled', '0'); - $setting->alert_interval = $request->input('alert_interval'); - $setting->alert_threshold = $request->input('alert_threshold'); - $setting->audit_interval = $request->input('audit_interval'); - $setting->audit_warning_days = $request->input('audit_warning_days'); + $setting->alert_email = $alert_email; + $setting->admin_cc_email = $admin_cc_email; + $setting->alerts_enabled = $request->input('alerts_enabled', '0'); + $setting->alert_interval = $request->input('alert_interval'); + $setting->alert_threshold = $request->input('alert_threshold'); + $setting->audit_interval = $request->input('audit_interval'); + $setting->audit_warning_days = $request->input('audit_warning_days'); $setting->show_alerts_in_menu = $request->input('show_alerts_in_menu', '0'); if ($setting->save()) { @@ -677,13 +668,10 @@ class SettingsController extends Controller 'slack_channel' => 'regex:/(?slack_endpoint = $request->input('slack_endpoint'); $setting->slack_channel = $request->input('slack_channel'); $setting->slack_botname = $request->input('slack_botname'); - } if ($setting->save()) { @@ -727,8 +715,8 @@ class SettingsController extends Controller $setting->auto_increment_prefix = $request->input('auto_increment_prefix'); $setting->auto_increment_assets = $request->input('auto_increment_assets', '0'); - $setting->zerofill_count = $request->input('zerofill_count'); - $setting->next_auto_tag_base = $request->input('next_auto_tag_base'); + $setting->zerofill_count = $request->input('zerofill_count'); + $setting->next_auto_tag_base = $request->input('next_auto_tag_base'); if ($setting->save()) { return redirect()->route('settings.index') @@ -749,7 +737,7 @@ class SettingsController extends Controller */ public function getBarcodes() { - $setting = Setting::getSettings(); + $setting = Setting::getSettings(); $is_gd_installed = extension_loaded('gd'); return view('settings.barcodes', compact('setting'))->with('is_gd_installed', $is_gd_installed); @@ -770,11 +758,11 @@ class SettingsController extends Controller return redirect()->to('admin')->with('error', trans('admin/settings/message.update.error')); } - $setting->qr_code = $request->input('qr_code', '0'); - $setting->alt_barcode = $request->input('alt_barcode'); + $setting->qr_code = $request->input('qr_code', '0'); + $setting->alt_barcode = $request->input('alt_barcode'); $setting->alt_barcode_enabled = $request->input('alt_barcode_enabled', '0'); - $setting->barcode_type = $request->input('barcode_type'); - $setting->qr_text = $request->input('qr_text'); + $setting->barcode_type = $request->input('barcode_type'); + $setting->qr_text = $request->input('qr_text'); if ($setting->save()) { return redirect()->route('settings.index') @@ -833,23 +821,21 @@ class SettingsController extends Controller if (is_null($setting = Setting::getSettings())) { return redirect()->to('admin')->with('error', trans('admin/settings/message.update.error')); } - $setting->labels_per_page = $request->input('labels_per_page'); - $setting->labels_width = $request->input('labels_width'); - $setting->labels_height = $request->input('labels_height'); - $setting->labels_pmargin_left = $request->input('labels_pmargin_left'); - $setting->labels_pmargin_right = $request->input('labels_pmargin_right'); - $setting->labels_pmargin_top = $request->input('labels_pmargin_top'); - $setting->labels_pmargin_bottom = $request->input('labels_pmargin_bottom'); - $setting->labels_display_bgutter = $request->input('labels_display_bgutter'); - $setting->labels_display_sgutter = $request->input('labels_display_sgutter'); - $setting->labels_fontsize = $request->input('labels_fontsize'); - $setting->labels_pagewidth = $request->input('labels_pagewidth'); - $setting->labels_pageheight = $request->input('labels_pageheight'); + $setting->labels_per_page = $request->input('labels_per_page'); + $setting->labels_width = $request->input('labels_width'); + $setting->labels_height = $request->input('labels_height'); + $setting->labels_pmargin_left = $request->input('labels_pmargin_left'); + $setting->labels_pmargin_right = $request->input('labels_pmargin_right'); + $setting->labels_pmargin_top = $request->input('labels_pmargin_top'); + $setting->labels_pmargin_bottom = $request->input('labels_pmargin_bottom'); + $setting->labels_display_bgutter = $request->input('labels_display_bgutter'); + $setting->labels_display_sgutter = $request->input('labels_display_sgutter'); + $setting->labels_fontsize = $request->input('labels_fontsize'); + $setting->labels_pagewidth = $request->input('labels_pagewidth'); + $setting->labels_pageheight = $request->input('labels_pageheight'); $setting->labels_display_company_name = $request->input('labels_display_company_name', '0'); $setting->labels_display_company_name = $request->input('labels_display_company_name', '0'); - - if ($request->filled('labels_display_name')) { $setting->labels_display_name = 1; } else { @@ -919,38 +905,42 @@ class SettingsController extends Controller return redirect()->to('admin')->with('error', trans('admin/settings/message.update.error')); } - if (!config('app.lock_passwords')===true) { - $setting->ldap_enabled = $request->input('ldap_enabled', '0'); - $setting->ldap_server = $request->input('ldap_server'); + if (! config('app.lock_passwords') === true) { + $setting->ldap_enabled = $request->input('ldap_enabled', '0'); + $setting->ldap_server = $request->input('ldap_server'); $setting->ldap_server_cert_ignore = $request->input('ldap_server_cert_ignore', false); - $setting->ldap_uname = $request->input('ldap_uname'); + $setting->ldap_uname = $request->input('ldap_uname'); if ($request->filled('ldap_pword')) { $setting->ldap_pword = Crypt::encrypt($request->input('ldap_pword')); } - $setting->ldap_basedn = $request->input('ldap_basedn'); - $setting->ldap_filter = $request->input('ldap_filter'); - $setting->ldap_username_field = $request->input('ldap_username_field'); - $setting->ldap_lname_field = $request->input('ldap_lname_field'); - $setting->ldap_fname_field = $request->input('ldap_fname_field'); + $setting->ldap_basedn = $request->input('ldap_basedn'); + $setting->ldap_filter = $request->input('ldap_filter'); + $setting->ldap_username_field = $request->input('ldap_username_field'); + $setting->ldap_lname_field = $request->input('ldap_lname_field'); + $setting->ldap_fname_field = $request->input('ldap_fname_field'); $setting->ldap_auth_filter_query = $request->input('ldap_auth_filter_query'); - $setting->ldap_version = $request->input('ldap_version'); - $setting->ldap_active_flag = $request->input('ldap_active_flag'); - $setting->ldap_emp_num = $request->input('ldap_emp_num'); - $setting->ldap_email = $request->input('ldap_email'); - $setting->ad_domain = $request->input('ad_domain'); - $setting->is_ad = $request->input('is_ad', '0'); - $setting->ad_append_domain = $request->input('ad_append_domain', '0'); - $setting->ldap_tls = $request->input('ldap_tls', '0'); - $setting->ldap_pw_sync = $request->input('ldap_pw_sync', '0'); + $setting->ldap_version = $request->input('ldap_version'); + $setting->ldap_active_flag = $request->input('ldap_active_flag'); + $setting->ldap_emp_num = $request->input('ldap_emp_num'); + $setting->ldap_email = $request->input('ldap_email'); + $setting->ad_domain = $request->input('ad_domain'); + $setting->is_ad = $request->input('is_ad', '0'); + $setting->ad_append_domain = $request->input('ad_append_domain', '0'); + $setting->ldap_tls = $request->input('ldap_tls', '0'); + $setting->ldap_pw_sync = $request->input('ldap_pw_sync', '0'); $setting->custom_forgot_pass_url = $request->input('custom_forgot_pass_url'); - $setting->ldap_phone_field = $request->input('ldap_phone'); - $setting->ldap_jobtitle = $request->input('ldap_jobtitle'); - $setting->ldap_country = $request->input('ldap_country'); - $setting->ldap_dept = $request->input('ldap_dept'); + $setting->ldap_phone_field = $request->input('ldap_phone'); + $setting->ldap_jobtitle = $request->input('ldap_jobtitle'); + $setting->ldap_country = $request->input('ldap_country'); + $setting->ldap_dept = $request->input('ldap_dept'); + $setting->ldap_client_tls_cert = $request->input('ldap_client_tls_cert'); + $setting->ldap_client_tls_key = $request->input('ldap_client_tls_key'); + } if ($setting->save()) { + $setting->update_client_side_cert_files(); return redirect()->route('settings.ldap.index') ->with('success', trans('admin/settings/message.update.success')); } @@ -989,21 +979,21 @@ class SettingsController extends Controller return redirect()->to('admin')->with('error', trans('admin/settings/message.update.error')); } - $setting->saml_enabled = $request->input('saml_enabled', '0'); - $setting->saml_idp_metadata = $request->input('saml_idp_metadata'); - $setting->saml_attr_mapping_username = $request->input('saml_attr_mapping_username'); - $setting->saml_forcelogin = $request->input('saml_forcelogin', '0'); - $setting->saml_slo = $request->input('saml_slo', '0'); - if (!empty($request->input('saml_sp_privatekey'))) { - $setting->saml_sp_x509cert = $request->input('saml_sp_x509cert'); - $setting->saml_sp_privatekey = $request->input('saml_sp_privatekey'); + $setting->saml_enabled = $request->input('saml_enabled', '0'); + $setting->saml_idp_metadata = $request->input('saml_idp_metadata'); + $setting->saml_attr_mapping_username = $request->input('saml_attr_mapping_username'); + $setting->saml_forcelogin = $request->input('saml_forcelogin', '0'); + $setting->saml_slo = $request->input('saml_slo', '0'); + if (! empty($request->input('saml_sp_privatekey'))) { + $setting->saml_sp_x509cert = $request->input('saml_sp_x509cert'); + $setting->saml_sp_privatekey = $request->input('saml_sp_privatekey'); } - if (!empty($request->input('saml_sp_x509certNew'))) { - $setting->saml_sp_x509certNew = $request->input('saml_sp_x509certNew'); + if (! empty($request->input('saml_sp_x509certNew'))) { + $setting->saml_sp_x509certNew = $request->input('saml_sp_x509certNew'); } else { - $setting->saml_sp_x509certNew = ""; + $setting->saml_sp_x509certNew = ''; } - $setting->saml_custom_settings = $request->input('saml_custom_settings'); + $setting->saml_custom_settings = $request->input('saml_custom_settings'); if ($setting->save()) { return redirect()->route('settings.saml.index') @@ -1024,26 +1014,21 @@ class SettingsController extends Controller */ public function getBackups() { - - $path = 'app/backups'; + $path = 'app/backups'; $backup_files = Storage::files($path); - $files_raw = []; + $files_raw = []; if (count($backup_files) > 0) { - for ($f = 0; $f < count($backup_files); ++$f) { + for ($f = 0; $f < count($backup_files); $f++) { // Skip dotfiles like .gitignore and .DS_STORE if ((substr(basename($backup_files[$f]), 0, 1) != '.')) { - $files_raw[] = [ 'filename' => basename($backup_files[$f]), 'filesize' => Setting::fileSizeConvert(Storage::size($backup_files[$f])), 'modified' => Storage::lastModified($backup_files[$f]), ]; - } - - } } @@ -1075,7 +1060,7 @@ class SettingsController extends Controller } $formatted_output = str_replace('Backup completed!', '', $output); - $output_split = explode('...', $formatted_output); + $output_split = explode('...', $formatted_output); if (array_key_exists(2, $output_split)) { return redirect()->route('settings.backups.index')->with('error', $output_split[2]); @@ -1101,8 +1086,8 @@ class SettingsController extends Controller $path = 'app/backups'; if (! config('app.lock_passwords')) { - if (Storage::exists($path . '/' . $filename)) { - return StorageHelper::downloader($path . '/' . $filename); + if (Storage::exists($path.'/'.$filename)) { + return StorageHelper::downloader($path.'/'.$filename); } else { // Redirect to the backup page return redirect()->route('settings.backups.index')->with('error', trans('admin/settings/message.backup.file_not_found')); @@ -1127,9 +1112,10 @@ class SettingsController extends Controller if (! config('app.lock_passwords')) { $path = 'app/backups'; - if (Storage::exists($path . '/' . $filename)) { + if (Storage::exists($path.'/'.$filename)) { try { - Storage::delete($path . '/' . $filename); + Storage::delete($path.'/'.$filename); + return redirect()->route('settings.backups.index')->with('success', trans('admin/settings/message.backup.file_deleted')); } catch (\Exception $e) { \Log::debug($e); @@ -1154,6 +1140,7 @@ class SettingsController extends Controller public function getPurge() { \Log::warning('User ID '.Auth::user()->id.' is attempting a PURGE'); + return view('settings.purge-form'); } @@ -1170,7 +1157,6 @@ class SettingsController extends Controller { if (! config('app.lock_passwords')) { if ('DELETE' == $request->input('confirm_purge')) { - \Log::warning('User ID '.Auth::user()->id.' initiated a PURGE!'); // Run a backup immediately before processing Artisan::call('backup:run'); diff --git a/app/Http/Controllers/StatuslabelsController.php b/app/Http/Controllers/StatuslabelsController.php index e1b7ffe0ef..0c559560e0 100755 --- a/app/Http/Controllers/StatuslabelsController.php +++ b/app/Http/Controllers/StatuslabelsController.php @@ -1,10 +1,11 @@ authorize('view', Statuslabel::class); + return view('statuslabels.index'); } @@ -37,7 +38,6 @@ class StatuslabelsController extends Controller return redirect()->route('statuslabels.index')->with('error', trans('admin/statuslabels/message.does_not_exist')); } - /** * Statuslabel create. * @@ -54,7 +54,6 @@ class StatuslabelsController extends Controller ->with('statuslabel_types', Helper::statusTypeList()); } - /** * Statuslabel create form processing. * @@ -64,7 +63,6 @@ class StatuslabelsController extends Controller */ public function store(Request $request) { - $this->authorize('create', Statuslabel::class); // create a new model instance $statusLabel = new Statuslabel(); @@ -76,21 +74,21 @@ class StatuslabelsController extends Controller $statusType = Statuslabel::getStatuslabelTypesForDB($request->input('statuslabel_types')); // Save the Statuslabel data - $statusLabel->name = $request->input('name'); - $statusLabel->user_id = Auth::id(); - $statusLabel->notes = $request->input('notes'); - $statusLabel->deployable = $statusType['deployable']; - $statusLabel->pending = $statusType['pending']; - $statusLabel->archived = $statusType['archived']; - $statusLabel->color = $request->input('color'); - $statusLabel->show_in_nav = $request->input('show_in_nav', 0); - $statusLabel->default_label = $request->input('default_label', 0); - + $statusLabel->name = $request->input('name'); + $statusLabel->user_id = Auth::id(); + $statusLabel->notes = $request->input('notes'); + $statusLabel->deployable = $statusType['deployable']; + $statusLabel->pending = $statusType['pending']; + $statusLabel->archived = $statusType['archived']; + $statusLabel->color = $request->input('color'); + $statusLabel->show_in_nav = $request->input('show_in_nav', 0); + $statusLabel->default_label = $request->input('default_label', 0); if ($statusLabel->save()) { // Redirect to the new Statuslabel page return redirect()->route('statuslabels.index')->with('success', trans('admin/statuslabels/message.create.success')); } + return redirect()->back()->withInput()->withErrors($statusLabel->getErrors()); } @@ -112,12 +110,11 @@ class StatuslabelsController extends Controller $use_statuslabel_type = $item->getStatuslabelType(); - $statuslabel_types = array('' => trans('admin/hardware/form.select_statustype')) + array('undeployable' => trans('admin/hardware/general.undeployable')) + array('pending' => trans('admin/hardware/general.pending')) + array('archived' => trans('admin/hardware/general.archived')) + array('deployable' => trans('admin/hardware/general.deployable')); + $statuslabel_types = ['' => trans('admin/hardware/form.select_statustype')] + ['undeployable' => trans('admin/hardware/general.undeployable')] + ['pending' => trans('admin/hardware/general.pending')] + ['archived' => trans('admin/hardware/general.archived')] + ['deployable' => trans('admin/hardware/general.deployable')]; return view('statuslabels/edit', compact('item', 'statuslabel_types'))->with('use_statuslabel_type', $use_statuslabel_type); } - /** * Statuslabel update form processing page. * @@ -134,28 +131,27 @@ class StatuslabelsController extends Controller return redirect()->route('statuslabels.index')->with('error', trans('admin/statuslabels/message.does_not_exist')); } - if (!$request->filled('statuslabel_types')) { + if (! $request->filled('statuslabel_types')) { return redirect()->back()->withInput()->withErrors(['statuslabel_types' => trans('validation.statuslabel_type')]); } - // Update the Statuslabel data - $statustype = Statuslabel::getStatuslabelTypesForDB($request->input('statuslabel_types')); - $statuslabel->name = $request->input('name'); - $statuslabel->notes = $request->input('notes'); - $statuslabel->deployable = $statustype['deployable']; - $statuslabel->pending = $statustype['pending']; - $statuslabel->archived = $statustype['archived']; - $statuslabel->color = $request->input('color'); - $statuslabel->show_in_nav = $request->input('show_in_nav', 0); - $statuslabel->default_label = $request->input('default_label', 0); - + $statustype = Statuslabel::getStatuslabelTypesForDB($request->input('statuslabel_types')); + $statuslabel->name = $request->input('name'); + $statuslabel->notes = $request->input('notes'); + $statuslabel->deployable = $statustype['deployable']; + $statuslabel->pending = $statustype['pending']; + $statuslabel->archived = $statustype['archived']; + $statuslabel->color = $request->input('color'); + $statuslabel->show_in_nav = $request->input('show_in_nav', 0); + $statuslabel->default_label = $request->input('default_label', 0); // Was the asset created? if ($statuslabel->save()) { // Redirect to the saved Statuslabel page - return redirect()->route("statuslabels.index")->with('success', trans('admin/statuslabels/message.update.success')); + return redirect()->route('statuslabels.index')->with('success', trans('admin/statuslabels/message.update.success')); } + return redirect()->back()->withInput()->withErrors($statuslabel->getErrors()); } @@ -177,10 +173,10 @@ class StatuslabelsController extends Controller // Check that there are no assets associated if ($statuslabel->assets()->count() == 0) { $statuslabel->delete(); + return redirect()->route('statuslabels.index')->with('success', trans('admin/statuslabels/message.delete.success')); } return redirect()->route('statuslabels.index')->with('error', trans('admin/statuslabels/message.assoc_assets')); } - } diff --git a/app/Http/Controllers/SuppliersController.php b/app/Http/Controllers/SuppliersController.php index 41ff456791..c36bc34505 100755 --- a/app/Http/Controllers/SuppliersController.php +++ b/app/Http/Controllers/SuppliersController.php @@ -1,4 +1,5 @@ authorize('create', Supplier::class); + return view('suppliers/edit')->with('item', new Supplier); } - /** * Supplier create form processing. * @@ -55,26 +55,26 @@ class SuppliersController extends Controller // Create a new supplier $supplier = new Supplier; // Save the location data - $supplier->name = request('name'); - $supplier->address = request('address'); - $supplier->address2 = request('address2'); - $supplier->city = request('city'); - $supplier->state = request('state'); - $supplier->country = request('country'); - $supplier->zip = request('zip'); - $supplier->contact = request('contact'); - $supplier->phone = request('phone'); - $supplier->fax = request('fax'); - $supplier->email = request('email'); - $supplier->notes = request('notes'); - $supplier->url = $supplier->addhttp(request('url')); - $supplier->user_id = Auth::id(); + $supplier->name = request('name'); + $supplier->address = request('address'); + $supplier->address2 = request('address2'); + $supplier->city = request('city'); + $supplier->state = request('state'); + $supplier->country = request('country'); + $supplier->zip = request('zip'); + $supplier->contact = request('contact'); + $supplier->phone = request('phone'); + $supplier->fax = request('fax'); + $supplier->email = request('email'); + $supplier->notes = request('notes'); + $supplier->url = $supplier->addhttp(request('url')); + $supplier->user_id = Auth::id(); $supplier = $request->handleImages($supplier); - if ($supplier->save()) { return redirect()->route('suppliers.index')->with('success', trans('admin/suppliers/message.create.success')); } + return redirect()->back()->withInput()->withErrors($supplier->getErrors()); } @@ -98,7 +98,6 @@ class SuppliersController extends Controller return view('suppliers/edit', compact('item')); } - /** * Supplier update form processing page. * @@ -116,19 +115,19 @@ class SuppliersController extends Controller } // Save the data - $supplier->name = request('name'); - $supplier->address = request('address'); - $supplier->address2 = request('address2'); - $supplier->city = request('city'); - $supplier->state = request('state'); - $supplier->country = request('country'); - $supplier->zip = request('zip'); - $supplier->contact = request('contact'); - $supplier->phone = request('phone'); - $supplier->fax = request('fax'); - $supplier->email = request('email'); - $supplier->url = $supplier->addhttp(request('url')); - $supplier->notes = request('notes'); + $supplier->name = request('name'); + $supplier->address = request('address'); + $supplier->address2 = request('address2'); + $supplier->city = request('city'); + $supplier->state = request('state'); + $supplier->country = request('country'); + $supplier->zip = request('zip'); + $supplier->contact = request('contact'); + $supplier->phone = request('phone'); + $supplier->fax = request('fax'); + $supplier->email = request('email'); + $supplier->url = $supplier->addhttp(request('url')); + $supplier->notes = request('notes'); $supplier = $request->handleImages($supplier); if ($supplier->save()) { @@ -136,7 +135,6 @@ class SuppliersController extends Controller } return redirect()->back()->withInput()->withErrors($supplier->getErrors()); - } /** @@ -149,11 +147,10 @@ class SuppliersController extends Controller public function destroy($supplierId) { $this->authorize('delete', Supplier::class); - if (is_null($supplier = Supplier::with('asset_maintenances', 'assets', 'licenses')->withCount('asset_maintenances as asset_maintenances_count','assets as assets_count','licenses as licenses_count')->find($supplierId))) { + if (is_null($supplier = Supplier::with('asset_maintenances', 'assets', 'licenses')->withCount('asset_maintenances as asset_maintenances_count', 'assets as assets_count', 'licenses as licenses_count')->find($supplierId))) { return redirect()->route('suppliers.index')->with('error', trans('admin/suppliers/message.not_found')); } - if ($supplier->assets_count > 0) { return redirect()->route('suppliers.index')->with('error', trans('admin/suppliers/message.delete.assoc_assets', ['asset_count' => (int) $supplier->assets_count])); } @@ -167,14 +164,12 @@ class SuppliersController extends Controller } $supplier->delete(); + return redirect()->route('suppliers.index')->with('success', trans('admin/suppliers/message.delete.success') ); - - } - /** * Get the asset information to present to the supplier view page * @@ -187,10 +182,9 @@ class SuppliersController extends Controller $supplier = Supplier::find($supplierId); if (isset($supplier->id)) { - return view('suppliers/view', compact('supplier')); + return view('suppliers/view', compact('supplier')); } return redirect()->route('suppliers.index')->with('error', trans('admin/suppliers/message.does_not_exist')); } - } diff --git a/app/Http/Controllers/Users/BulkUsersController.php b/app/Http/Controllers/Users/BulkUsersController.php index 7bda003802..4d4adee61b 100644 --- a/app/Http/Controllers/Users/BulkUsersController.php +++ b/app/Http/Controllers/Users/BulkUsersController.php @@ -17,7 +17,6 @@ use Illuminate\Support\Facades\Password; class BulkUsersController extends Controller { - /** * Returns a view that confirms the user's a bulk delete will be applied to. * @@ -34,36 +33,32 @@ class BulkUsersController extends Controller // Make sure there were users selected if (($request->filled('ids')) && (count($request->input('ids')) > 0)) { // Get the list of affected users - $users = User::whereIn('id', array_keys(request('ids'))) + $user_raw_array = request('ids'); + $users = User::whereIn('id', $user_raw_array) ->with('groups', 'assets', 'licenses', 'accessories')->get(); if ($request->input('bulk_actions') == 'edit') { return view('users/bulk-edit', compact('users')) ->with('groups', Group::pluck('name', 'id')); - } elseif ($request->input('bulk_actions') == 'delete') { - return view('users/confirm-bulk-delete')->with('users', $users)->with('statuslabel_list', Helper::statusLabelList()); - - + return view('users/confirm-bulk-delete')->with('users', $users)->with('statuslabel_list', Helper::statusLabelList()); } elseif ($request->input('bulk_actions') == 'bulkpasswordreset') { foreach ($users as $user) { - if (($user->activated=='1') && ($user->email!='')) { + if (($user->activated == '1') && ($user->email != '')) { $credentials = ['email' => $user->email]; Password::sendResetLink($credentials, function (Message $message) { $message->subject($this->getEmailSubject()); }); } } + return redirect()->back()->with('success', trans('admin/users/message.password_resets_sent')); - } - } return redirect()->back()->with('error', 'No users selected'); } - /** * Save bulk-edited users * @@ -77,7 +72,7 @@ class BulkUsersController extends Controller { $this->authorize('update', User::class); - if((!$request->filled('ids')) || $request->input('ids') <= 0) { + if ((! $request->filled('ids')) || $request->input('ids') <= 0) { return redirect()->back()->with('error', 'No users selected'); } $user_raw_array = $request->input('ids'); @@ -88,28 +83,25 @@ class BulkUsersController extends Controller $users = User::whereIn('id', $user_raw_array)->where('id', '!=', Auth::user()->id)->get(); $return_array = [ - 'success' => trans('admin/users/message.success.update_bulk') + 'success' => trans('admin/users/message.success.update_bulk'), ]; - $this->conditionallyAddItem('location_id') ->conditionallyAddItem('department_id') ->conditionallyAddItem('company_id') ->conditionallyAddItem('locale') - ->conditionallyAddItem('activated') -; + ->conditionallyAddItem('activated'); // If the manager_id is one of the users being updated, generate a warning. if (array_search($request->input('manager_id'), $user_raw_array)) { $manager_conflict = true; $return_array = [ - 'warning' => trans('admin/users/message.bulk_manager_warn') + 'warning' => trans('admin/users/message.bulk_manager_warn'), ]; } - if (!$manager_conflict) { + if (! $manager_conflict) { $this->conditionallyAddItem('manager_id'); } - // Save the updated info User::whereIn('id', $user_raw_array) ->where('id', '!=', Auth::id())->update($this->update_array); @@ -127,20 +119,21 @@ class BulkUsersController extends Controller /** * Array to store update data per item - * @var Array + * @var array */ private $update_array = []; /** * Adds parameter to update array for an item if it exists in request - * @param String $field field name + * @param string $field field name * @return BulkUsersController Model for Chaining */ protected function conditionallyAddItem($field) { - if(request()->filled($field)) { + if (request()->filled($field)) { $this->update_array[$field] = request()->input($field); } + return $this; } @@ -157,10 +150,10 @@ class BulkUsersController extends Controller { $this->authorize('update', User::class); - if ((!$request->filled('ids')) || (count($request->input('ids')) == 0)) { + if ((! $request->filled('ids')) || (count($request->input('ids')) == 0)) { return redirect()->back()->with('error', 'No users selected'); } - if ((!$request->filled('status_id')) || ($request->input('status_id')=='')) { + if ((! $request->filled('status_id')) || ($request->input('status_id') == '')) { return redirect()->route('users.index')->with('error', 'No status selected'); } @@ -174,11 +167,10 @@ class BulkUsersController extends Controller } $users = User::whereIn('id', $user_raw_array)->get(); - $assets = Asset::whereIn('assigned_to', $user_raw_array)->where('assigned_type', 'App\Models\User')->get(); + $assets = Asset::whereIn('assigned_to', $user_raw_array)->where('assigned_type', \App\Models\User::class)->get(); $accessories = DB::table('accessories_users')->whereIn('assigned_to', $user_raw_array)->get(); $licenses = DB::table('license_seats')->whereIn('assigned_to', $user_raw_array)->get(); - $this->logItemCheckinAndDelete($assets, Asset::class); $this->logItemCheckinAndDelete($accessories, Accessory::class); $this->logItemCheckinAndDelete($licenses, LicenseSeat::class); @@ -189,7 +181,6 @@ class BulkUsersController extends Controller 'assigned_type' => null, ]); - LicenseSeat::whereIn('id', $licenses->pluck('id'))->update(['assigned_to' => null]); foreach ($users as $user) { @@ -205,9 +196,9 @@ class BulkUsersController extends Controller * @param $items * @param $itemType string name of items being passed. */ - protected function logItemCheckinAndDelete($items, $itemType) { - - foreach($items as $item) { + protected function logItemCheckinAndDelete($items, $itemType) + { + foreach ($items as $item) { $logAction = new Actionlog(); $logAction->item_id = $item->id; // We can't rely on get_class here because the licenses/accessories fetched above are not eloquent models, but simply arrays. @@ -219,7 +210,4 @@ class BulkUsersController extends Controller $logAction->logaction('checkin from'); } } - - - } diff --git a/app/Http/Controllers/Users/LDAPImportController.php b/app/Http/Controllers/Users/LDAPImportController.php index 337a43bc36..a204581eb6 100644 --- a/app/Http/Controllers/Users/LDAPImportController.php +++ b/app/Http/Controllers/Users/LDAPImportController.php @@ -3,10 +3,10 @@ namespace App\Http\Controllers\Users; use App\Http\Controllers\Controller; +use App\Models\User; use App\Services\LdapAd; use Illuminate\Http\Request; -use Illuminate\Support\Facades\Artisan; -use App\Models\User; // Note that this is awful close to 'Users' the namespace above; be careful +use Illuminate\Support\Facades\Artisan; // Note that this is awful close to 'Users' the namespace above; be careful class LDAPImportController extends Controller { diff --git a/app/Http/Controllers/Users/UserFilesController.php b/app/Http/Controllers/Users/UserFilesController.php index f5a3ea1180..cb49396324 100644 --- a/app/Http/Controllers/Users/UserFilesController.php +++ b/app/Http/Controllers/Users/UserFilesController.php @@ -10,6 +10,8 @@ use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Input; use Illuminate\Support\Facades\Response; use Symfony\Component\HttpFoundation\JsonResponse; +use enshrined\svgSanitize\Sanitizer; +use Illuminate\Support\Facades\Storage; class UserFilesController extends Controller { @@ -26,20 +28,44 @@ class UserFilesController extends Controller public function store(AssetFileRequest $request, $userId = null) { $user = User::find($userId); - $destinationPath = config('app.private_uploads') . '/users'; + $destinationPath = config('app.private_uploads').'/users'; if (isset($user->id)) { $this->authorize('update', $user); $logActions = []; $files = $request->file('file'); - foreach($files as $file) { + + if (is_null($files)) { + return redirect()->back()->with('error', trans('admin/users/message.upload.nofiles')); + } + foreach ($files as $file) { + $extension = $file->getClientOriginalExtension(); - $filename = 'user-' . $user->id . '-' . str_random(8); - $filename .= '-' . str_slug($file->getClientOriginalName()) . '.' . $extension; - if (!$file->move($destinationPath, $filename)) { - return redirect()->back()->with('error', trans('admin/users/message.upload.invalidfiles')); + $file_name = 'user-'.$user->id.'-'.str_random(8).'-'.str_slug(basename($file->getClientOriginalName(), '.'.$extension)).'.'.$extension; + + + // Check for SVG and sanitize it + if ($extension == 'svg') { + \Log::debug('This is an SVG'); + \Log::debug($file_name); + + $sanitizer = new Sanitizer(); + + $dirtySVG = file_get_contents($file->getRealPath()); + $cleanSVG = $sanitizer->sanitize($dirtySVG); + + try { + Storage::put('private_uploads/users/'.$file_name, $cleanSVG); + } catch (\Exception $e) { + \Log::debug('Upload no workie :( '); + \Log::debug($e); + } + + } else { + Storage::put('private_uploads/users/'.$file_name, file_get_contents($file)); } + //Log the uploaded file to the log $logAction = new Actionlog(); $logAction->item_id = $user->id; @@ -48,12 +74,11 @@ class UserFilesController extends Controller $logAction->note = $request->input('notes'); $logAction->target_id = null; $logAction->created_at = date("Y-m-d H:i:s"); - $logAction->filename = $filename; + $logAction->filename = $file_name; $logAction->action_type = 'uploaded'; - if (!$logAction->save()) { - return JsonResponse::create(["error" => "Failed validation: " . print_r($logAction->getErrors(), true)], 500); - + if (! $logAction->save()) { + return JsonResponse::create(['error' => 'Failed validation: '.print_r($logAction->getErrors(), true)], 500); } $logActions[] = $logAction; } @@ -62,8 +87,8 @@ class UserFilesController extends Controller } return redirect()->back()->with('error', trans('admin/users/message.upload.nofiles')); - } + } /** * Delete file @@ -83,11 +108,12 @@ class UserFilesController extends Controller if (isset($user->id)) { $this->authorize('update', $user); $log = Actionlog::find($fileId); - $full_filename = $destinationPath . '/' . $log->filename; + $full_filename = $destinationPath.'/'.$log->filename; if (file_exists($full_filename)) { - unlink($destinationPath . '/' . $log->filename); + unlink($destinationPath.'/'.$log->filename); } $log->delete(); + return redirect()->back()->with('success', trans('admin/users/message.deletefile.success')); } // Prepare the error message @@ -117,6 +143,7 @@ class UserFilesController extends Controller $log = Actionlog::find($fileId); $file = $log->get_src('users'); + return Response::download($file); //FIXME this doesn't use the new StorageHelper yet, but it's complicated... } // Prepare the error message diff --git a/app/Http/Controllers/Users/UsersController.php b/app/Http/Controllers/Users/UsersController.php index bfba9b26f7..018624d22f 100755 --- a/app/Http/Controllers/Users/UsersController.php +++ b/app/Http/Controllers/Users/UsersController.php @@ -1,11 +1,12 @@ authorize('index', User::class); + return view('users/index'); } @@ -71,7 +69,7 @@ class UsersController extends Controller } $permissions = config('permissions'); - $userPermissions = Helper::selectedPermissionsArray($permissions, $request->old('permissions', array())); + $userPermissions = Helper::selectedPermissionsArray($permissions, $request->old('permissions', [])); $permissions = $this->filterDisplayable($permissions); $user = new User; @@ -95,7 +93,7 @@ class UsersController extends Controller $this->authorize('create', User::class); $user = new User; //Username, email, and password need to be handled specially because the need to respect config values on an edit. - $user->email = e($request->input('email')); + $user->email = e($request->input('email')); $user->username = e($request->input('username')); if ($request->filled('password')) { $user->password = bcrypt($request->input('password')); @@ -121,25 +119,24 @@ class UsersController extends Controller // Strip out the superuser permission if the user isn't a superadmin $permissions_array = $request->input('permission'); - if (!Auth::user()->isSuperUser()) { + if (! Auth::user()->isSuperUser()) { unset($permissions_array['superuser']); } - $user->permissions = json_encode($permissions_array); - + $user->permissions = json_encode($permissions_array); // we have to invoke the - app('App\Http\Requests\ImageUploadRequest')->handleImages($user, 600, 'image', 'avatars', 'avatar'); + app(\App\Http\Requests\ImageUploadRequest::class)->handleImages($user, 600, 'image', 'avatars', 'avatar'); if ($user->save()) { if ($request->filled('groups')) { $user->groups()->sync($request->input('groups')); } else { - $user->groups()->sync(array()); + $user->groups()->sync([]); } if (($request->input('email_user') == 1) && ($request->filled('email'))) { // Send the credentials through email - $data = array(); + $data = []; $data['email'] = e($request->input('email')); $data['username'] = e($request->input('username')); $data['first_name'] = e($request->input('first_name')); @@ -148,13 +145,13 @@ class UsersController extends Controller $user->notify(new WelcomeNotification($data)); } + return redirect::route('users.index')->with('success', trans('admin/users/message.success.create')); } + return redirect()->back()->withInput()->withErrors($user->getErrors()); } - - private function filterDisplayable($permissions) { $output = null; @@ -163,6 +160,7 @@ class UsersController extends Controller return $p['display'] === true; }); } + return $output; } @@ -178,7 +176,7 @@ class UsersController extends Controller */ public function edit($id) { - if ($user = User::find($id)) { + if ($user = User::find($id)) { $this->authorize('update', $user); $permissions = config('permissions'); @@ -193,6 +191,7 @@ class UsersController extends Controller } $error = trans('admin/users/message.user_not_found', compact('id')); + return redirect()->route('users.index')->with('error', $error); } @@ -211,7 +210,7 @@ class UsersController extends Controller // We need to reverse the UI specific logic for our // permissions here before we update the user. - $permissions = $request->input('permissions', array()); + $permissions = $request->input('permissions', []); app('request')->request->set('permissions', $permissions); // This is a janky hack to prevent people from changing admin demo user data on the public demo. @@ -244,7 +243,6 @@ class UsersController extends Controller $user->groups()->sync($request->input('groups')); } - // Update the user if ($request->filled('username')) { $user->username = $request->input('username'); @@ -270,7 +268,6 @@ class UsersController extends Controller $user->activated = $request->input('activated', 0); $user->zip = $request->input('zip', null); - // Update the location of any assets checked out to this user Asset::where('assigned_type', User::class) ->where('assigned_to', $user->id) @@ -284,16 +281,15 @@ class UsersController extends Controller $permissions_array = $request->input('permission'); // Strip out the superuser permission if the user isn't a superadmin - if (!Auth::user()->isSuperUser()) { + if (! Auth::user()->isSuperUser()) { unset($permissions_array['superuser']); $permissions_array['superuser'] = $orig_superuser; } - $user->permissions = json_encode($permissions_array); + $user->permissions = json_encode($permissions_array); // Handle uploaded avatar - app('App\Http\Requests\ImageUploadRequest')->handleImages($user, 600, 'avatar', 'avatars', 'avatar'); - + app(\App\Http\Requests\ImageUploadRequest::class)->handleImages($user, 600, 'avatar', 'avatars', 'avatar'); //\Log::debug(print_r($user, true)); @@ -303,6 +299,7 @@ class UsersController extends Controller return redirect()->route('users.index') ->with('success', trans('admin/users/message.success.update')); } + return redirect()->back()->withInput()->withErrors($user->getErrors()); } @@ -333,25 +330,25 @@ class UsersController extends Controller if (($user->assets()) && (($assetsCount = $user->assets()->count()) > 0)) { // Redirect to the user management page return redirect()->route('users.index') - ->with('error', 'This user still has ' . $assetsCount . ' assets associated with them.'); + ->with('error', 'This user still has '.$assetsCount.' assets associated with them.'); } if (($user->licenses()) && (($licensesCount = $user->licenses()->count())) > 0) { // Redirect to the user management page return redirect()->route('users.index') - ->with('error', 'This user still has ' . $licensesCount . ' licenses associated with them.'); + ->with('error', 'This user still has '.$licensesCount.' licenses associated with them.'); } if (($user->accessories()) && (($accessoriesCount = $user->accessories()->count()) > 0)) { // Redirect to the user management page return redirect()->route('users.index') - ->with('error', 'This user still has ' . $accessoriesCount . ' accessories associated with them.'); + ->with('error', 'This user still has '.$accessoriesCount.' accessories associated with them.'); } if (($user->managedLocations()) && (($managedLocationsCount = $user->managedLocations()->count())) > 0) { // Redirect to the user management page return redirect()->route('users.index') - ->with('error', 'This user still has ' . $managedLocationsCount . ' locations that they manage.'); + ->with('error', 'This user still has '.$managedLocationsCount.' locations that they manage.'); } // Delete the user @@ -381,7 +378,7 @@ class UsersController extends Controller { $this->authorize('update', User::class); // Get user information - if (!User::onlyTrashed()->find($id)) { + if (! User::onlyTrashed()->find($id)) { return redirect()->route('users.index')->with('error', trans('admin/users/messages.user_not_found')); } @@ -389,10 +386,10 @@ class UsersController extends Controller if (User::withTrashed()->where('id', $id)->restore()) { return redirect()->route('users.index')->with('success', trans('admin/users/message.success.restored')); } + return redirect()->route('users.index')->with('error', 'User could not be restored.'); } - /** * Return a view with user detail * @@ -404,7 +401,7 @@ class UsersController extends Controller */ public function show($userId = null) { - if (!$user = User::with('assets', 'assets.model', 'consumables', 'accessories', 'licenses', 'userloc')->withTrashed()->find($userId)) { + if (! $user = User::with('assets', 'assets.model', 'consumables', 'accessories', 'licenses', 'userloc')->withTrashed()->find($userId)) { // Redirect to the user management page return redirect()->route('users.index') ->with('error', trans('admin/users/message.user_not_found', ['id' => $userId])); @@ -413,6 +410,7 @@ class UsersController extends Controller $userlog = $user->userlog->load('item'); $this->authorize('view', $user); + return view('users/view', compact('user', 'userlog')) ->with('settings', Setting::getSettings()); } @@ -442,7 +440,7 @@ class UsersController extends Controller } // Do we have permission to unsuspend this user? - if ($user->isSuperUser() && !Auth::user()->isSuperUser()) { + if ($user->isSuperUser() && ! Auth::user()->isSuperUser()) { // Redirect to the user management page return redirect()->route('users.index')->with('error', 'Insufficient permissions!'); } @@ -456,7 +454,6 @@ class UsersController extends Controller } } - /** * Return a view containing a pre-populated new user form, * populated with some fields from an existing user. @@ -472,10 +469,9 @@ class UsersController extends Controller $this->authorize('create', User::class); // We need to reverse the UI specific logic for our // permissions here before we update the user. - $permissions = $request->input('permissions', array()); + $permissions = $request->input('permissions', []); app('request')->request->set('permissions', $permissions); - try { // Get the user information $user_to_clone = User::withTrashed()->find($id); @@ -508,7 +504,6 @@ class UsersController extends Controller } } - /** * Exports users to CSV * @@ -529,7 +524,7 @@ class UsersController extends Controller User::with('assets', 'accessories', 'consumables', 'department', 'licenses', 'manager', 'groups', 'userloc', 'company') ->orderBy('created_at', 'DESC') ->chunk(500, function ($users) use ($handle) { - $headers=[ + $headers = [ // strtolower to prevent Excel from trying to open it as a SYLK file strtolower(trans('general.id')), trans('admin/companies/table.title'), @@ -548,7 +543,7 @@ class UsersController extends Controller trans('admin/users/table.groups'), trans('general.notes'), trans('admin/users/table.activated'), - trans('general.created_at') + trans('general.created_at'), ]; fputcsv($handle, $headers); @@ -578,7 +573,7 @@ class UsersController extends Controller $user->consumables->count(), $user_groups, $user->notes, - ($user->activated=='1') ? trans('general.yes') : trans('general.no'), + ($user->activated == '1') ? trans('general.yes') : trans('general.no'), $user->created_at, ]; @@ -610,6 +605,7 @@ class UsersController extends Controller $assets = Asset::where('assigned_to', $id)->where('assigned_type', User::class)->with('model', 'model.category')->get(); $accessories = $show_user->accessories()->get(); $consumables = $show_user->consumables()->get(); + return view('users/print')->with('assets', $assets) ->with('licenses', $show_user->licenses()->get()) ->with('accessories', $accessories) @@ -617,4 +613,30 @@ class UsersController extends Controller ->with('show_user', $show_user) ->with('settings', Setting::getSettings()); } + + /** + * Send individual password reset email + * + * @author A. Gianotto + * @since [v5.0.15] + * @return \Illuminate\Http\RedirectResponse + */ + public function sendPasswordReset($id) + { + if (($user = User::find($id)) && ($user->activated == '1') && ($user->email != '') && ($user->ldap_import == '0')) { + $credentials = ['email' => $user->email]; + + try { + \Password::sendResetLink($credentials, function (Message $message) use ($user) { + $message->subject($this->getEmailSubject()); + }); + + return redirect()->back()->with('success', trans('admin/users/message.password_reset_sent', ['email' => $user->email])); + } catch (\Exception $e) { + return redirect()->back()->with('error', ' Error sending email. :( '); + } + } + + return redirect()->back()->with('error', 'User is not activated, is LDAP synced, or does not have an email address '); + } } diff --git a/app/Http/Controllers/ViewAssetsController.php b/app/Http/Controllers/ViewAssetsController.php index 1525e73dbb..e5e66c7027 100755 --- a/app/Http/Controllers/ViewAssetsController.php +++ b/app/Http/Controllers/ViewAssetsController.php @@ -1,4 +1,5 @@ withTrashed()->find(Auth::user()->id); - $userlog = $user->userlog->load('item', 'user', 'target'); if (isset($user->id)) { @@ -50,42 +49,36 @@ class ViewAssetsController extends Controller // Redirect to the user management page return redirect()->route('users.index') ->with('error', trans('admin/users/message.user_not_found', $user->id)); - } - /** * Returns view of requestable items for a user. * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ public function getRequestableIndex() { - $assets = Asset::with('model', 'defaultLoc', 'location', 'assignedTo', 'requests')->Hardware()->RequestableAssets()->get(); $models = AssetModel::with('category', 'requests', 'assets')->RequestableModels()->get(); return view('account/requestable-assets', compact('assets', 'models')); } - - public function getRequestItem(Request $request, $itemType, $itemId = null) { $item = null; - $fullItemType = 'App\\Models\\' . studly_case($itemType); + $fullItemType = 'App\\Models\\'.studly_case($itemType); - if ($itemType == "asset_model") { - $itemType = "model"; + if ($itemType == 'asset_model') { + $itemType = 'model'; } - $item = call_user_func(array($fullItemType, 'find'), $itemId); + $item = call_user_func([$fullItemType, 'find'], $itemId); $user = Auth::user(); - $logaction = new Actionlog(); $logaction->item_id = $data['asset_id'] = $item->id; $logaction->item_type = $fullItemType; - $logaction->created_at = $data['requested_date'] = date("Y-m-d H:i:s"); + $logaction->created_at = $data['requested_date'] = date('Y-m-d H:i:s'); if ($user->location_id) { $logaction->location_id = $user->location_id; @@ -99,41 +92,35 @@ class ViewAssetsController extends Controller $data['item_type'] = $itemType; $data['target'] = Auth::user(); - if ($fullItemType == Asset::class) { $data['item_url'] = route('hardware.show', $item->id); } else { $data['item_url'] = route("view/${itemType}", $item->id); - } $settings = Setting::getSettings(); if ($item_request = $item->isRequestedBy($user)) { - $item->cancelRequest(); - $data['item_quantity'] = $item_request->qty; - $logaction->logaction('request_canceled'); + $item->cancelRequest(); + $data['item_quantity'] = $item_request->qty; + $logaction->logaction('request_canceled'); - if (($settings->alert_email!='') && ($settings->alerts_enabled=='1') && (!config('app.lock_passwords'))) { + if (($settings->alert_email != '') && ($settings->alerts_enabled == '1') && (! config('app.lock_passwords'))) { $settings->notify(new RequestAssetCancelation($data)); } return redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.canceled')); - } else { $item->request(); - if (($settings->alert_email!='') && ($settings->alerts_enabled=='1') && (!config('app.lock_passwords'))) { + if (($settings->alert_email != '') && ($settings->alerts_enabled == '1') && (! config('app.lock_passwords'))) { $logaction->logaction('requested'); $settings->notify(new RequestAssetNotification($data)); } - - return redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.success')); } } - /** * Process a specific requested asset * @param null $assetId @@ -141,7 +128,6 @@ class ViewAssetsController extends Controller */ public function getRequestAsset($assetId = null) { - $user = Auth::user(); // Check if the asset exists and is requestable @@ -149,20 +135,20 @@ class ViewAssetsController extends Controller return redirect()->route('requestable-assets') ->with('error', trans('admin/hardware/message.does_not_exist_or_not_requestable')); } - if (!Company::isCurrentUserHasAccess($asset)) { + if (! Company::isCurrentUserHasAccess($asset)) { return redirect()->route('requestable-assets') ->with('error', trans('general.insufficient_permissions')); } $data['item'] = $asset; - $data['target'] = Auth::user(); + $data['target'] = Auth::user(); $data['item_quantity'] = 1; $settings = Setting::getSettings(); $logaction = new Actionlog(); $logaction->item_id = $data['asset_id'] = $asset->id; $logaction->item_type = $data['item_type'] = Asset::class; - $logaction->created_at = $data['requested_date'] = date("Y-m-d H:i:s"); + $logaction->created_at = $data['requested_date'] = date('Y-m-d H:i:s'); if ($user->location_id) { $logaction->location_id = $user->location_id; @@ -170,14 +156,14 @@ class ViewAssetsController extends Controller $logaction->target_id = $data['user_id'] = Auth::user()->id; $logaction->target_type = User::class; - // If it's already requested, cancel the request. if ($asset->isRequestedBy(Auth::user())) { $asset->cancelRequest(); $asset->decrement('requests_counter', 1); - + $logaction->logaction('request canceled'); $settings->notify(new RequestAssetCancelation($data)); + return redirect()->route('requestable-assets') ->with('success')->with('success', trans('admin/hardware/message.requests.cancel-success')); } @@ -187,10 +173,7 @@ class ViewAssetsController extends Controller $asset->increment('requests_counter', 1); $settings->notify(new RequestAssetNotification($data)); - return redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.success')); - - } public function getRequestedAssets() @@ -198,37 +181,33 @@ class ViewAssetsController extends Controller return view('account/requested'); } - // Get the acceptance screen public function getAcceptAsset($logID = null) { - $findlog = Actionlog::where('id', $logID)->first(); - if (!$findlog) { + if (! $findlog) { return redirect()->to('account/view-assets')->with('error', 'No matching record.'); } - if ($findlog->accepted_id!='') { + if ($findlog->accepted_id != '') { return redirect()->to('account/view-assets')->with('error', trans('admin/users/message.error.asset_already_accepted')); } $user = Auth::user(); - // TODO - Fix this for non-assets - if (($findlog->item_type==Asset::class) && ($user->id != $findlog->item->assigned_to)) { + if (($findlog->item_type == Asset::class) && ($user->id != $findlog->item->assigned_to)) { return redirect()->to('account/view-assets')->with('error', trans('admin/users/message.error.incorrect_user_accepted')); } - $item = $findlog->item; // Check if the asset exists if (is_null($item)) { // Redirect to the asset management page return redirect()->to('account')->with('error', trans('admin/hardware/message.does_not_exist')); - } elseif (!Company::isCurrentUserHasAccess($item)) { + } elseif (! Company::isCurrentUserHasAccess($item)) { return redirect()->route('requestable-assets')->with('error', trans('general.insufficient_permissions')); } else { return view('account/accept-asset', compact('item'))->with('findlog', $findlog)->with('item', $item); @@ -245,8 +224,7 @@ class ViewAssetsController extends Controller return redirect()->to('account/view-assets')->with('error', trans('admin/hardware/message.does_not_exist')); } - - if ($findlog->accepted_id!='') { + if ($findlog->accepted_id != '') { // Redirect to the asset management page return redirect()->to('account/view-assets')->with('error', trans('admin/users/message.error.asset_already_accepted')); } @@ -257,48 +235,46 @@ class ViewAssetsController extends Controller $user = Auth::user(); - if (($findlog->item_type==Asset::class) && ($user->id != $findlog->item->assigned_to)) { + if (($findlog->item_type == Asset::class) && ($user->id != $findlog->item->assigned_to)) { return redirect()->to('account/view-assets')->with('error', trans('admin/users/message.error.incorrect_user_accepted')); } if ($request->filled('signature_output')) { $path = config('app.private_uploads').'/signatures'; - $sig_filename = "siglog-".$findlog->id.'-'.date('Y-m-d-his').".png"; + $sig_filename = 'siglog-'.$findlog->id.'-'.date('Y-m-d-his').'.png'; $data_uri = e($request->get('signature_output')); - $encoded_image = explode(",", $data_uri); + $encoded_image = explode(',', $data_uri); $decoded_image = base64_decode($encoded_image[1]); - file_put_contents($path."/".$sig_filename, $decoded_image); + file_put_contents($path.'/'.$sig_filename, $decoded_image); } - $logaction = new Actionlog(); - if ($request->input('asset_acceptance')=='accepted') { - $logaction_msg = 'accepted'; - $accepted="accepted"; + if ($request->input('asset_acceptance') == 'accepted') { + $logaction_msg = 'accepted'; + $accepted = 'accepted'; $return_msg = trans('admin/users/message.accepted'); } else { $logaction_msg = 'declined'; - $accepted="rejected"; + $accepted = 'rejected'; $return_msg = trans('admin/users/message.declined'); } - $logaction->item_id = $findlog->item_id; - $logaction->item_type = $findlog->item_type; + $logaction->item_id = $findlog->item_id; + $logaction->item_type = $findlog->item_type; // Asset - if (($findlog->item_id!='') && ($findlog->item_type==Asset::class)) { - if ($request->input('asset_acceptance')!='accepted') { + if (($findlog->item_id != '') && ($findlog->item_type == Asset::class)) { + if ($request->input('asset_acceptance') != 'accepted') { DB::table('assets') ->where('id', $findlog->item_id) - ->update(array('assigned_to' => null)); + ->update(['assigned_to' => null]); } } $logaction->target_id = $findlog->target_id; $logaction->target_type = User::class; $logaction->note = e($request->input('note')); - $logaction->updated_at = date("Y-m-d H:i:s"); - + $logaction->updated_at = date('Y-m-d H:i:s'); if (isset($sig_filename)) { $logaction->accept_signature = $sig_filename; @@ -307,9 +283,9 @@ class ViewAssetsController extends Controller $update_checkout = DB::table('action_logs') ->where('id', $findlog->id) - ->update(array('accepted_id' => $logaction->id)); + ->update(['accepted_id' => $logaction->id]); - if (($findlog->item_id!='') && ($findlog->item_type==Asset::class)) { + if (($findlog->item_id != '') && ($findlog->item_type == Asset::class)) { $affected_asset = $logaction->item; $affected_asset->accepted = $accepted; $affected_asset->save(); @@ -317,7 +293,6 @@ class ViewAssetsController extends Controller if ($update_checkout) { return redirect()->to('account/view-assets')->with('success', $return_msg); - } else { return redirect()->to('account/view-assets')->with('error', 'Something went wrong '); } diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index bedb8bcca5..acd42e5576 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -15,7 +15,7 @@ class Kernel extends HttpKernel */ protected $middleware = [ \App\Http\Middleware\NoSessionStore::class, - \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, + \Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance::class, \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \Fideloper\Proxy\TrustProxies::class, @@ -23,6 +23,7 @@ class Kernel extends HttpKernel \App\Http\Middleware\CheckForDebug::class, \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, \App\Http\Middleware\SecurityHeaders::class, + \App\Http\Middleware\PreventBackHistory::class, ]; @@ -43,7 +44,7 @@ class Kernel extends HttpKernel ], 'api' => [ - \Barryvdh\Cors\HandleCors::class, + \Fruitcake\Cors\HandleCors::class, 'throttle:120,1', 'auth:api', ], diff --git a/app/Http/Livewire/CustomFieldSetDefaultValuesForModel.php b/app/Http/Livewire/CustomFieldSetDefaultValuesForModel.php new file mode 100644 index 0000000000..c9478c054a --- /dev/null +++ b/app/Http/Livewire/CustomFieldSetDefaultValuesForModel.php @@ -0,0 +1,35 @@ +model = AssetModel::find($this->model_id); // It's possible to do some clever route-model binding here, but let's keep it simple, shall we? + $this->fieldset_id = $this->model->fieldset_id; + $this->fields = CustomFieldset::find($this->fieldset_id)->fields; + $this->add_default_values = ( $this->model->defaultValues->count() > 0); + } + + public function updatedFieldsetId() + { + $this->fields = CustomFieldset::find($this->fieldset_id)->fields; + } + + public function render() + { + return view('livewire.custom-field-set-default-values-for-model'); + } +} diff --git a/app/Http/Livewire/LoginForm.php b/app/Http/Livewire/LoginForm.php new file mode 100644 index 0000000000..7d10cb78ae --- /dev/null +++ b/app/Http/Livewire/LoginForm.php @@ -0,0 +1,72 @@ + + * @version v6.0 + * @return Array + */ + public function rules() + { + return [ + 'username' => 'required|string|max:255', + 'password' => 'required', + ]; + } + + /** + * Perform the validation + * + * @author A. Gianotto + * @version v6.0 + */ + public function updated($fields) + { + + if (is_null($fields) || empty($fields)) { + $this->can_submit = false; + } + + $this->validateOnly($fields); + + $this->can_submit = true; + + + } + + /** + * Actually do the login thing + * + * @todo fix missing LDAP stuff maybe? Not sure if it + * makes sense to even do this via LiveWire, since + * our login system is pretty complicated. + * + * @author A. Gianotto + * @version v6.0 + */ + public function submitForm() + { + + $this->can_submit = true; + + if (auth()->attempt($this->validate())) { + return redirect()->intended('/'); + } else { + return session()->flash('error', trans('auth/message.account_not_found')); + } + + } + + +} diff --git a/app/Http/Middleware/AssetCountForSidebar.php b/app/Http/Middleware/AssetCountForSidebar.php index ac14f8f8d2..414c10e8a1 100644 --- a/app/Http/Middleware/AssetCountForSidebar.php +++ b/app/Http/Middleware/AssetCountForSidebar.php @@ -2,8 +2,8 @@ namespace App\Http\Middleware; -use Auth; use App\Models\Asset; +use Auth; use Closure; class AssetCountForSidebar @@ -17,8 +17,7 @@ class AssetCountForSidebar */ public function handle($request, Closure $next) { - try - { + try { $total_rtd_sidebar = Asset::RTD()->count(); view()->share('total_rtd_sidebar', $total_rtd_sidebar); } catch (\Exception $e) { diff --git a/app/Http/Middleware/CheckForDebug.php b/app/Http/Middleware/CheckForDebug.php index 923b76b1c6..6b6bd6ba8b 100644 --- a/app/Http/Middleware/CheckForDebug.php +++ b/app/Http/Middleware/CheckForDebug.php @@ -18,7 +18,7 @@ class CheckForDebug { view()->share('debug_in_production', false); - if (((Auth::check() && (Auth::user()->isSuperUser()))) && (app()->environment()=='production') && (config('app.warn_debug')===true) && (config('app.debug')===true)) { + if (((Auth::check() && (Auth::user()->isSuperUser()))) && (app()->environment() == 'production') && (config('app.warn_debug') === true) && (config('app.debug') === true)) { view()->share('debug_in_production', true); } diff --git a/app/Http/Middleware/CheckForSetup.php b/app/Http/Middleware/CheckForSetup.php index aa21f649fa..b4beb70588 100644 --- a/app/Http/Middleware/CheckForSetup.php +++ b/app/Http/Middleware/CheckForSetup.php @@ -19,22 +19,17 @@ class CheckForSetup } if (Setting::setupCompleted()) { - if ($request->is('setup*')) { return redirect(url('/')); } else { return $next($request); } - } else { - if (!($request->is('setup*')) && !($request->is('.env')) && !($request->is('health'))) { + if (! ($request->is('setup*')) && ! ($request->is('.env')) && ! ($request->is('health'))) { return redirect(url('/').'/setup'); } return $next($request); - } - - } } diff --git a/app/Http/Middleware/CheckPermissions.php b/app/Http/Middleware/CheckPermissions.php index a0b5be6ad6..48df11ba51 100644 --- a/app/Http/Middleware/CheckPermissions.php +++ b/app/Http/Middleware/CheckPermissions.php @@ -7,31 +7,25 @@ use Gate; class CheckPermissions { - /** - * Handle the ACLs for permissions. - * - * The $section variable is passed via the route middleware, - * 'middleware' => [authorize:superadmin'] - * - * @param \Illuminate\Http\Request $request - * @param \Closure $next - * @param string|null $section - * @return mixed - */ + /** + * Handle the ACLs for permissions. + * + * The $section variable is passed via the route middleware, + * 'middleware' => [authorize:superadmin'] + * + * @param \Illuminate\Http\Request $request + * @param \Closure $next + * @param string|null $section + * @return mixed + */ public function handle($request, Closure $next, $section = null) { - - if (Gate::allows($section)) { return $next($request); } return response()->view('layouts/basic', [ - 'content' => view('errors/403') + 'content' => view('errors/403'), ]); - - - - } } diff --git a/app/Http/Middleware/EncryptCookies.php b/app/Http/Middleware/EncryptCookies.php index 7817127da3..5f4c62723a 100644 --- a/app/Http/Middleware/EncryptCookies.php +++ b/app/Http/Middleware/EncryptCookies.php @@ -6,7 +6,6 @@ use Illuminate\Cookie\Middleware\EncryptCookies as BaseEncrypter; class EncryptCookies extends BaseEncrypter { - /** * The names of the cookies that should not be encrypted. * @@ -22,6 +21,4 @@ class EncryptCookies extends BaseEncrypter * @var bool */ protected static $serialize = true; - - } diff --git a/app/Http/Middleware/NoSessionStore.php b/app/Http/Middleware/NoSessionStore.php index 86706a0974..c445d4e7f8 100644 --- a/app/Http/Middleware/NoSessionStore.php +++ b/app/Http/Middleware/NoSessionStore.php @@ -7,7 +7,7 @@ use Closure; class NoSessionStore { protected $except = [ - 'health' + 'health', ]; /** @@ -24,6 +24,7 @@ class NoSessionStore config()->set('session.driver', 'array'); } } + return $next($request); } -} \ No newline at end of file +} diff --git a/app/Http/Middleware/PreventBackHistory.php b/app/Http/Middleware/PreventBackHistory.php new file mode 100644 index 0000000000..8533965b4f --- /dev/null +++ b/app/Http/Middleware/PreventBackHistory.php @@ -0,0 +1,30 @@ + 'no-cache, no-store, max-age=0, must-revalidate', + 'Pragma' => 'no-cache', + 'Expires' => 'Sun, 02 Jan 1990 00:00:00 GMT' + ]; + $response = $next($request); + foreach($headers as $key => $value) { + $response->headers->set($key, $value); + } + + return $response; + } +} \ No newline at end of file diff --git a/app/Http/Middleware/PreventRequestsDuringMaintenance.php b/app/Http/Middleware/PreventRequestsDuringMaintenance.php new file mode 100644 index 0000000000..e4956d0bb9 --- /dev/null +++ b/app/Http/Middleware/PreventRequestsDuringMaintenance.php @@ -0,0 +1,17 @@ +headers->set('Feature-Policy', $feature_policy); - - // Defaults to same-origin if REFERRER_POLICY is not set in the .env $response->headers->set('Referrer-Policy', config('app.referrer_policy')); @@ -86,7 +84,6 @@ class SecurityHeaders $response->headers->set('X-Frame-Options', 'DENY'); } - // This defaults to false to maintain backwards compatibility for // people who are not running Snipe-IT over TLS (shame, shame, shame!) // Seriously though, please run Snipe-IT over TLS. Let's Encrypt is free. @@ -99,15 +96,20 @@ class SecurityHeaders // We have to exclude debug mode here because debugbar pulls from a CDN or two // and it will break things. - if ((config('app.debug')!='true') && (config('app.enable_csp')=='true')) { + if ((config('app.debug') != 'true') && (config('app.enable_csp') == 'true')) { $csp_policy[] = "default-src 'self'"; $csp_policy[] = "style-src 'self' 'unsafe-inline'"; $csp_policy[] = "script-src 'self' 'unsafe-inline' 'unsafe-eval'"; $csp_policy[] = "connect-src 'self'"; $csp_policy[] = "object-src 'none'"; $csp_policy[] = "font-src 'self' data:"; - $csp_policy[] = "img-src 'self' data: ".config('app.url')." ".env('PUBLIC_AWS_URL')." https://secure.gravatar.com http://gravatar.com maps.google.com maps.gstatic.com *.googleapis.com"; + $csp_policy[] = "img-src 'self' data: ".config('app.url').' '.env('PUBLIC_AWS_URL').' https://secure.gravatar.com http://gravatar.com maps.google.com maps.gstatic.com *.googleapis.com'; + + if (config('filesystems.disks.public.driver') == 's3') { + $csp_policy[] = "img-src 'self' data: ".config('filesystems.disks.public.url'); + } $csp_policy = join(';', $csp_policy); + $response->headers->set('Content-Security-Policy', $csp_policy); } @@ -116,7 +118,8 @@ class SecurityHeaders private function removeUnwantedHeaders($headerList) { - foreach ($headerList as $header) + foreach ($headerList as $header) { header_remove($header); + } } } diff --git a/app/Http/Middleware/TrimStrings.php b/app/Http/Middleware/TrimStrings.php new file mode 100644 index 0000000000..a8a252df4c --- /dev/null +++ b/app/Http/Middleware/TrimStrings.php @@ -0,0 +1,19 @@ +allSubdomainsOfApplicationUrl(), + ]; + } +} diff --git a/app/Http/Middleware/TrustProxies.php b/app/Http/Middleware/TrustProxies.php new file mode 100644 index 0000000000..a3b6aef90b --- /dev/null +++ b/app/Http/Middleware/TrustProxies.php @@ -0,0 +1,23 @@ + 'required_without_all:assigned_asset,assigned_location', - "assigned_asset" => 'required_without_all:assigned_user,assigned_location', - "assigned_location" => 'required_without_all:assigned_user,assigned_asset', - "checkout_to_type" => 'required|in:asset,location,user' + 'assigned_user' => 'required_without_all:assigned_asset,assigned_location', + 'assigned_asset' => 'required_without_all:assigned_user,assigned_location', + 'assigned_location' => 'required_without_all:assigned_user,assigned_asset', + 'checkout_to_type' => 'required|in:asset,location,user', ]; - return $rules; } } diff --git a/app/Http/Requests/AssetFileRequest.php b/app/Http/Requests/AssetFileRequest.php index c74753fcc9..1aa1fadb89 100644 --- a/app/Http/Requests/AssetFileRequest.php +++ b/app/Http/Requests/AssetFileRequest.php @@ -2,7 +2,6 @@ namespace App\Http\Requests; - class AssetFileRequest extends Request { /** @@ -22,9 +21,10 @@ class AssetFileRequest extends Request */ public function rules() { - $max_file_size = \App\Helpers\Helper::file_upload_max_size(); + $max_file_size = Helper::file_upload_max_size(); + return [ - 'file.*' => 'required|mimes:png,gif,jpg,svg,jpeg,doc,docx,pdf,txt,zip,rar,xls,xlsx,lic,xml,rtf|max:'.$max_file_size, + 'file.*' => 'required|mimes:png,gif,jpg,svg,jpeg,doc,docx,pdf,txt,zip,rar,xls,xlsx,lic,xml,rtf,webp|max:'.$max_file_size, ]; } } diff --git a/app/Http/Requests/CustomFieldRequest.php b/app/Http/Requests/CustomFieldRequest.php index cc7749f27f..7c6ba1e97e 100644 --- a/app/Http/Requests/CustomFieldRequest.php +++ b/app/Http/Requests/CustomFieldRequest.php @@ -24,28 +24,26 @@ class CustomFieldRequest extends FormRequest */ public function rules(Request $request) { - $rules = []; - switch($this->method()) - { + switch ($this->method()) { // Brand new case 'POST': { - $rules['name'] = "required|unique:custom_fields"; + $rules['name'] = 'required|unique:custom_fields'; break; } // Save all fields case 'PUT': - $rules['name'] = "required"; + $rules['name'] = 'required'; break; // Save only what's passed case 'PATCH': { - $rules['name'] = "required"; + $rules['name'] = 'required'; break; } diff --git a/app/Http/Requests/ImageUploadRequest.php b/app/Http/Requests/ImageUploadRequest.php index f7b1a05256..c492011110 100644 --- a/app/Http/Requests/ImageUploadRequest.php +++ b/app/Http/Requests/ImageUploadRequest.php @@ -3,12 +3,16 @@ namespace App\Http\Requests; use App\Models\SnipeModel; -use Intervention\Image\Facades\Image; use enshrined\svgSanitize\Sanitizer; +use Intervention\Image\Facades\Image; +use App\Http\Traits\ConvertsBase64ToFiles; +use Illuminate\Http\UploadedFile; use Storage; class ImageUploadRequest extends Request { + use ConvertsBase64ToFiles; + /** * Determine if the user is authorized to make this request. * @@ -26,37 +30,52 @@ class ImageUploadRequest extends Request */ public function rules() { - return [ - 'image' => 'mimes:png,gif,jpg,jpeg,svg,bmp,svg+xml,webp', - 'avatar' => 'mimes:png,gif,jpg,jpeg,svg,bmp,svg+xml', - ]; + + return [ + 'image' => 'mimes:png,gif,jpg,jpeg,svg,bmp,svg+xml,webp', + 'avatar' => 'mimes:png,gif,jpg,jpeg,svg,bmp,svg+xml,webp', + ]; } public function response(array $errors) { return $this->redirector->back()->withInput()->withErrors($errors, $this->errorBag); } + + /** + * Fields that should be traited from base64 to files + */ + protected function base64FileKeys(): array + { + /** + * image_source is here just legacy reasons. Api\AssetController + * had it once to allow encoded image uploads. + */ + return [ + 'image' => 'auto', + 'image_source' => 'auto' + ]; + } /** * Handle and store any images attached to request * @param SnipeModel $item Item the image is associated with - * @param String $path location for uploaded images, defaults to uploads/plural of item type. + * @param string $path location for uploaded images, defaults to uploads/plural of item type. * @return SnipeModel Target asset is being checked out to. */ public function handleImages($item, $w = 600, $form_fieldname = null, $path = null, $db_fieldname = 'image') { - $type = strtolower(class_basename(get_class($item))); if (is_null($path)) { $path = str_plural($type); if ($type == 'assetmodel') { - $path = 'models'; + $path = 'models'; } if ($type == 'user') { - $path = 'avatars'; + $path = 'avatars'; } } @@ -71,27 +90,34 @@ class ImageUploadRequest extends Request $use_db_field = $db_fieldname; } - \Log::info('Image path is: '.$path); \Log::debug('Type is: '.$type); \Log::debug('Form fieldname is: '.$form_fieldname); \Log::debug('DB fieldname is: '.$use_db_field); \Log::debug('Trying to upload to '. $path); + + // ConvertBase64ToFiles just changes object type, + // as it cannot currently insert files to $this->files + if ($this->offsetGet($form_fieldname) instanceof UploadedFile) { + $image=$this->offsetGet($form_fieldname); + } else { + if ($this->hasFile($form_fieldname)) { + $image = $this->file($form_fieldname); + } + } - \Log::debug($this->file()); - - if ($this->hasFile($form_fieldname)) { + if (isset($image)) { + \Log::debug($image); if (!config('app.lock_passwords')) { - $image = $this->file($form_fieldname); $ext = $image->getClientOriginalExtension(); $file_name = $type.'-'.$form_fieldname.'-'.str_random(10).'.'.$ext; \Log::info('File name will be: '.$file_name); - \Log::debug('File extension is: '. $ext); + \Log::debug('File extension is: '.$ext); - if (($image->getClientOriginalExtension()!=='webp') && ($image->getClientOriginalExtension()!=='svg')) { + if (($image->getClientOriginalExtension() !== 'webp') && ($image->getClientOriginalExtension() !== 'svg')) { \Log::debug('Not an SVG or webp - resize'); \Log::debug('Trying to upload to: '.$path.'/'.$file_name); $upload = Image::make($image->getRealPath())->resize(null, $w, function ($constraint) { @@ -100,17 +126,15 @@ class ImageUploadRequest extends Request }); // This requires a string instead of an object, so we use ($string) - Storage::disk('public')->put($path.'/'.$file_name, (string)$upload->encode()); - + Storage::disk('public')->put($path.'/'.$file_name, (string) $upload->encode()); } else { // If the file is a webp, we need to just move it since webp support // needs to be compiled into gd for resizing to be available - if ($image->getClientOriginalExtension()=='webp') { + if ($image->getClientOriginalExtension() == 'webp') { \Log::debug('This is a webp, just move it'); Storage::disk('public')->put($path.'/'.$file_name, file_get_contents($image)); // If the file is an SVG, we need to clean it and NOT encode it } else { - \Log::debug('This is an SVG'); $sanitizer = new Sanitizer(); $dirtySVG = file_get_contents($image->getRealPath()); @@ -126,43 +150,35 @@ class ImageUploadRequest extends Request } } - // Remove Current image if exists if (Storage::disk('public')->exists($path.'/'.$item->{$use_db_field})) { - \Log::debug('A file already exists that we are replacing - we should delete the old one.'); try { Storage::disk('public')->delete($path.'/'.$item->{$use_db_field}); \Log::debug('Old file '.$path.'/'.$file_name.' has been deleted.'); } catch (\Exception $e) { \Log::debug('Could not delete old file. '.$path.'/'.$file_name.' does not exist?'); - } } $item->{$use_db_field} = $file_name; - } // If the user isn't uploading anything new but wants to delete their old image, do so } else { \Log::debug('No file passed for '.$form_fieldname); - if ($this->input('image_delete')=='1') { - + if ($this->input('image_delete') == '1') { \Log::debug('Deleting image'); try { - - Storage::disk('public')->delete($path . '/' . $item->{$use_db_field}); + Storage::disk('public')->delete($path.'/'.$item->{$use_db_field}); $item->{$use_db_field} = null; - } catch (\Exception $e) { \Log::debug($e); } } - } - return $item; } + } diff --git a/app/Http/Requests/ItemImportRequest.php b/app/Http/Requests/ItemImportRequest.php index b9c12d3459..fbf36bf65f 100644 --- a/app/Http/Requests/ItemImportRequest.php +++ b/app/Http/Requests/ItemImportRequest.php @@ -34,30 +34,30 @@ class ItemImportRequest extends FormRequest { ini_set('max_execution_time', env('IMPORT_TIME_LIMIT', 600)); //600 seconds = 10 minutes ini_set('memory_limit', env('IMPORT_MEMORY_LIMIT', '500M')); - - $filename = config('app.private_uploads') . '/imports/' . $import->file_path; + + $filename = config('app.private_uploads').'/imports/'.$import->file_path; $import->import_type = $this->input('import-type'); $class = title_case($import->import_type); $classString = "App\\Importer\\{$class}Importer"; $importer = new $classString($filename); - $import->field_map = request('column-mappings'); + $import->field_map = request('column-mappings'); $import->save(); - $fieldMappings=[]; + $fieldMappings = []; if ($import->field_map) { foreach ($import->field_map as $field => $fieldValue) { $errorMessage = null; - if(is_null($fieldValue)){ + if (is_null($fieldValue)) { $errorMessage = trans('validation.import_field_empty'); $this->errorCallback($import, $field, $errorMessage); - + return $this->errors; } } // We submit as csv field: column, but the importer is happier if we flip it here. $fieldMappings = array_change_key_case(array_flip($import->field_map), CASE_LOWER); - // dd($fieldMappings); + // dd($fieldMappings); } $importer->setCallbacks([$this, 'log'], [$this, 'progress'], [$this, 'errorCallback']) ->setUserId(Auth::id()) @@ -68,19 +68,20 @@ class ItemImportRequest extends FormRequest // $logFile = storage_path('logs/importer.log'); // \Log::useFiles($logFile); $importer->import(); + return $this->errors; } public function log($string) { - \Log::Info($string); + \Log::Info($string); } public function progress($count) { // Open for future - return; } + public function errorCallback($item, $field, $errorString) { $this->errors[$item->name][$field] = $errorString; diff --git a/app/Http/Requests/Request.php b/app/Http/Requests/Request.php index 35bfcdee93..ff8f123b3d 100644 --- a/app/Http/Requests/Request.php +++ b/app/Http/Requests/Request.php @@ -1,6 +1,7 @@ ajax() || $this->wantsJson()) - { + if ($this->ajax() || $this->wantsJson()) { return Helper::formatStandardApiResponse('error', null, $errors); } diff --git a/app/Http/Requests/SaveUserRequest.php b/app/Http/Requests/SaveUserRequest.php index 3c706e854a..b6e44c3f44 100644 --- a/app/Http/Requests/SaveUserRequest.php +++ b/app/Http/Requests/SaveUserRequest.php @@ -3,9 +3,9 @@ namespace App\Http\Requests; use App\Models\Setting; -use Illuminate\Http\Exceptions\HttpResponseException; -use Illuminate\Foundation\Http\FormRequest; use Illuminate\Contracts\Validation\Validator; +use Illuminate\Foundation\Http\FormRequest; +use Illuminate\Http\Exceptions\HttpResponseException; class SaveUserRequest extends FormRequest { @@ -24,7 +24,6 @@ class SaveUserRequest extends FormRequest return $this->redirector->back()->withInput()->withErrors($errors, $this->errorBag); } - /** * Get the validation rules that apply to the request. * @@ -32,21 +31,18 @@ class SaveUserRequest extends FormRequest */ public function rules() { - $rules = [ - 'manager_id' => "nullable|exists:users,id" + 'manager_id' => 'nullable|exists:users,id', ]; - switch($this->method()) - { + switch ($this->method()) { // Brand new user case 'POST': { $rules['first_name'] = 'required|string|min:1'; $rules['username'] = 'required_unless:ldap_import,1|string|min:1'; - if ($this->request->get('ldap_import') == false) - { + if ($this->request->get('ldap_import') == false) { $rules['password'] = Setting::passwordComplexityRulesSaving('store').'|confirmed'; } break; @@ -68,9 +64,7 @@ class SaveUserRequest extends FormRequest default:break; } - + return $rules; - } - } diff --git a/app/Http/Requests/SettingsLdapRequest.php b/app/Http/Requests/SettingsLdapRequest.php index 33da10fd65..234903cba4 100644 --- a/app/Http/Requests/SettingsLdapRequest.php +++ b/app/Http/Requests/SettingsLdapRequest.php @@ -24,20 +24,19 @@ class SettingsLdapRequest extends Request public function rules() { $rules = [ - "ldap_server" => 'sometimes|required_if:ldap_enabled,1|url|nullable', - "ldap_uname" => 'sometimes|required_if:ldap_enabled,1|nullable', - "ldap_basedn" => 'sometimes|required_if:ldap_enabled,1|nullable', - "ldap_filter" => 'sometimes|required_if:ldap_enabled,1|nullable', - "ldap_username_field" => 'sometimes|required_if:ldap_enabled,1|nullable', - "ldap_fname_field" => 'sometimes|required_if:ldap_enabled,1|nullable', - "ldap_lname_field" => 'sometimes|required_if:ldap_enabled,1|nullable', - "ldap_auth_filter_query" => 'sometimes|required_if:ldap_enabled,1|nullable', - "ldap_version" => 'sometimes|required_if:ldap_enabled,1|nullable', - "ad_domain" => 'sometimes|required_if:is_ad,1|nullable', + 'ldap_server' => 'sometimes|required_if:ldap_enabled,1|url|nullable', + 'ldap_uname' => 'sometimes|required_if:ldap_enabled,1|nullable', + 'ldap_basedn' => 'sometimes|required_if:ldap_enabled,1|nullable', + 'ldap_filter' => 'sometimes|required_if:ldap_enabled,1|nullable', + 'ldap_username_field' => 'sometimes|required_if:ldap_enabled,1|nullable', + 'ldap_fname_field' => 'sometimes|required_if:ldap_enabled,1|nullable', + 'ldap_lname_field' => 'sometimes|required_if:ldap_enabled,1|nullable', + 'ldap_auth_filter_query' => 'sometimes|required_if:ldap_enabled,1|nullable', + 'ldap_version' => 'sometimes|required_if:ldap_enabled,1|nullable', + 'ad_domain' => 'sometimes|required_if:is_ad,1|nullable', ]; return $rules; - } public function response(array $errors) @@ -45,6 +44,7 @@ class SettingsLdapRequest extends Request $this->session()->flash('errors', Session::get('errors', new \Illuminate\Support\ViewErrorBag) ->put('default', new \Illuminate\Support\MessageBag($errors))); \Input::flash(); + return parent::response($errors); } } diff --git a/app/Http/Requests/SettingsSamlRequest.php b/app/Http/Requests/SettingsSamlRequest.php index 74cdaf39da..8f02d64f03 100644 --- a/app/Http/Requests/SettingsSamlRequest.php +++ b/app/Http/Requests/SettingsSamlRequest.php @@ -2,10 +2,10 @@ namespace App\Http\Requests; +use App\Models\Setting; use Illuminate\Foundation\Http\FormRequest; use OneLogin\Saml2\IdPMetadataParser as OneLogin_Saml2_IdPMetadataParser; use OneLogin\Saml2\Utils as OneLogin_Saml2_Utils; -use App\Models\Setting; /** * This handles validating and cleaning SAML settings provided by the user. @@ -42,9 +42,8 @@ class SettingsSamlRequest extends FormRequest { $validator->after(function ($validator) { if ($this->input('saml_enabled') == '1') { - $idpMetadata = $this->input('saml_idp_metadata'); - if (!empty($idpMetadata)) { + if (! empty($idpMetadata)) { try { if (filter_var($idpMetadata, FILTER_VALIDATE_URL)) { $metadataInfo = OneLogin_Saml2_IdPMetadataParser::parseRemoteXML($idpMetadata); @@ -59,21 +58,21 @@ class SettingsSamlRequest extends FormRequest $was_custom_x509cert = strpos(Setting::getSettings()->saml_custom_settings, 'sp_x509cert') !== false; - $custom_x509cert=''; - $custom_privateKey=''; - $custom_x509certNew=''; - if (!empty($this->input('saml_custom_settings'))) { + $custom_x509cert = ''; + $custom_privateKey = ''; + $custom_x509certNew = ''; + if (! empty($this->input('saml_custom_settings'))) { $req_custom_settings = preg_split('/\r\n|\r|\n/', $this->input('saml_custom_settings')); $custom_settings = []; - + foreach ($req_custom_settings as $custom_setting) { $split = explode('=', $custom_setting, 2); - + if (count($split) == 2) { $split[0] = trim($split[0]); $split[1] = trim($split[1]); - - if (!empty($split[0])) { + + if (! empty($split[0])) { $custom_settings[] = implode('=', $split); } if ($split[0] == 'sp_x509cert') { @@ -86,37 +85,36 @@ class SettingsSamlRequest extends FormRequest } } } - - $this->merge(['saml_custom_settings' => implode(PHP_EOL, $custom_settings) . PHP_EOL]); + + $this->merge(['saml_custom_settings' => implode(PHP_EOL, $custom_settings).PHP_EOL]); } - $cert_updated=false; - if (!empty($custom_x509cert) && !empty($custom_privateKey)) { + $cert_updated = false; + if (! empty($custom_x509cert) && ! empty($custom_privateKey)) { // custom certificate and private key are defined - $cert_updated=true; + $cert_updated = true; $x509 = openssl_x509_read($custom_x509cert); $pkey = openssl_pkey_get_private($custom_privateKey); - } elseif ($this->input('saml_sp_regenerate_keypair') == '1' || !$this->has('saml_sp_x509cert') || $was_custom_x509cert) { + } elseif ($this->input('saml_sp_regenerate_keypair') == '1' || ! $this->has('saml_sp_x509cert') || $was_custom_x509cert) { // key regeneration requested, no certificate defined yet or previous custom certicate was removed -error_log("regen"); - $cert_updated=true; + error_log('regen'); + $cert_updated = true; $dn = [ - "countryName" => "US", - "stateOrProvinceName" => "N/A", - "localityName" => "N/A", - "organizationName" => "Snipe-IT", - "commonName" => "Snipe-IT", + 'countryName' => 'US', + 'stateOrProvinceName' => 'N/A', + 'localityName' => 'N/A', + 'organizationName' => 'Snipe-IT', + 'commonName' => 'Snipe-IT', ]; $pkey = openssl_pkey_new([ - "private_key_bits" => 2048, - "private_key_type" => OPENSSL_KEYTYPE_RSA, + 'private_key_bits' => 2048, + 'private_key_type' => OPENSSL_KEYTYPE_RSA, ]); - + $csr = openssl_csr_new($dn, $pkey, ['digest_alg' => 'sha256']); if ($csr) { - $x509 = openssl_csr_sign($csr, null, $pkey, 3650, ['digest_alg' => 'sha256']); openssl_x509_export($x509, $x509cert); @@ -126,8 +124,8 @@ error_log("regen"); while (($error = openssl_error_string() !== false)) { $errors[] = $error; } - - if (!(empty($x509cert) && empty($privateKey))) { + + if (! (empty($x509cert) && empty($privateKey))) { $this->merge([ 'saml_sp_x509cert' => $x509cert, 'saml_sp_privatekey' => $privateKey, @@ -146,14 +144,14 @@ error_log("regen"); $errors[] = $error; } - if (!empty($x509certNew)) { + if (! empty($x509certNew)) { $this->merge([ - 'saml_sp_x509certNew' => $x509certNew + 'saml_sp_x509certNew' => $x509certNew, ]); } } else { $this->merge([ - 'saml_sp_x509certNew' => "" + 'saml_sp_x509certNew' => '', ]); } }); diff --git a/app/Http/Traits/ConvertsBase64ToFiles.php b/app/Http/Traits/ConvertsBase64ToFiles.php new file mode 100644 index 0000000000..aed8fc0dfb --- /dev/null +++ b/app/Http/Traits/ConvertsBase64ToFiles.php @@ -0,0 +1,80 @@ +base64FileKeys()); + + Collection::make($flattened)->each(function ($filename, $key) { + rescue(function () use ($key, $filename) { + // dont process plain files + if ( $this->file($key)){ + return; + } + + $base64Contents = $this->input($key); + + if (!$base64Contents) { + return; + } + + // autogenerate filenames + if ($filename == 'auto'){ + $header = explode(';', $base64Contents, 2)[0]; + // Grab the image type from the header while we're at it. + $filename = $key . '.' . substr($header, strpos($header, '/')+1); + } + + // Generate a temporary path to store the Base64 contents + $tempFilePath = tempnam(sys_get_temp_dir(), $filename); + + // Store the contents using a stream, or by decoding manually + if (Str::startsWith($base64Contents, 'data:') && count(explode(',', $base64Contents)) > 1) { + $source = fopen($base64Contents, 'r'); + $destination = fopen($tempFilePath, 'w'); + + stream_copy_to_stream($source, $destination); + + fclose($source); + fclose($destination); + } else { + file_put_contents($tempFilePath, base64_decode($base64Contents, true)); + } + + $uploadedFile = new UploadedFile($tempFilePath, $filename, null, null, true); + + \Log::debug("Trait: uploadedfile ". $tempFilePath); + $this->offsetUnset($key); + \Log::debug("Trait: encoded field \"$key\" removed" ); + + //Inserting new file to $this-files does not work so have to deal this after + $this->offsetSet($key,$uploadedFile); + \Log::debug("Trait: field \"$key\" inserted as UplodedFile" ); + + }, null, false); + }); + } +} +/** + * Loosely based on idea https://github.com/protonemedia/laravel-mixins/tree/master/src/Request + * */ \ No newline at end of file diff --git a/app/Http/Traits/TwoColumnUniqueUndeletedTrait.php b/app/Http/Traits/TwoColumnUniqueUndeletedTrait.php new file mode 100644 index 0000000000..4aae02bfbd --- /dev/null +++ b/app/Http/Traits/TwoColumnUniqueUndeletedTrait.php @@ -0,0 +1,25 @@ +{$parameters[0]}; + + if ($this->exists) { + return 'two_column_unique_undeleted:'.$this->table.','.$this->getKey().','.$column.','.$value; + } + + return 'two_column_unique_undeleted:'.$this->table.',0,'.$column.','.$value; + } +} diff --git a/app/Http/Traits/UniqueUndeletedTrait.php b/app/Http/Traits/UniqueUndeletedTrait.php index 63a3740b54..d4c726bd73 100644 --- a/app/Http/Traits/UniqueUndeletedTrait.php +++ b/app/Http/Traits/UniqueUndeletedTrait.php @@ -1,21 +1,21 @@ exists) { - return 'unique_undeleted:'.$this->table.','. $this->getKey(); + return 'unique_undeleted:'.$this->table.','.$this->getKey(); } return 'unique_undeleted:'.$this->table.',0'; diff --git a/app/Http/Transformers/AccessoriesTransformer.php b/app/Http/Transformers/AccessoriesTransformer.php index d40642d875..d8858f91b8 100644 --- a/app/Http/Transformers/AccessoriesTransformer.php +++ b/app/Http/Transformers/AccessoriesTransformer.php @@ -1,4 +1,5 @@ transformDatatables($array, $total); } - public function transformAccessory (Accessory $accessory) + public function transformAccessory(Accessory $accessory) { $array = [ 'id' => $accessory->id, 'name' => e($accessory->name), 'image' => ($accessory->image) ? Storage::disk('public')->url('accessories/'.e($accessory->image)) : null, - 'company' => ($accessory->company) ? ['id' => $accessory->company->id,'name'=> e($accessory->company->name)] : null, - 'manufacturer' => ($accessory->manufacturer) ? ['id' => $accessory->manufacturer->id,'name'=> e($accessory->manufacturer->name)] : null, - 'supplier' => ($accessory->supplier) ? ['id' => $accessory->supplier->id,'name'=> e($accessory->supplier->name)] : null, + 'company' => ($accessory->company) ? ['id' => $accessory->company->id, 'name'=> e($accessory->company->name)] : null, + 'manufacturer' => ($accessory->manufacturer) ? ['id' => $accessory->manufacturer->id, 'name'=> e($accessory->manufacturer->name)] : null, + 'supplier' => ($accessory->supplier) ? ['id' => $accessory->supplier->id, 'name'=> e($accessory->supplier->name)] : null, 'model_number' => ($accessory->model_number) ? e($accessory->model_number) : null, - 'category' => ($accessory->category) ? ['id' => $accessory->category->id,'name'=> e($accessory->category->name)] : null, - 'location' => ($accessory->location) ? ['id' => $accessory->location->id,'name'=> e($accessory->location->name)] : null, + 'category' => ($accessory->category) ? ['id' => $accessory->category->id, 'name'=> e($accessory->category->name)] : null, + 'location' => ($accessory->location) ? ['id' => $accessory->location->id, 'name'=> e($accessory->location->name)] : null, 'notes' => ($accessory->notes) ? e($accessory->notes) : null, 'qty' => ($accessory->qty) ? (int) $accessory->qty : null, 'purchase_date' => ($accessory->purchase_date) ? Helper::getFormattedDateObject($accessory->purchase_date, 'date') : null, @@ -47,7 +48,7 @@ class AccessoriesTransformer $permissions_array['available_actions'] = [ 'checkout' => Gate::allows('checkout', Accessory::class), 'checkin' => false, - 'update' => Gate::allows('update', Accessory::class) , + 'update' => Gate::allows('update', Accessory::class), 'delete' => Gate::allows('delete', Accessory::class), ]; @@ -62,13 +63,9 @@ class AccessoriesTransformer return $array; } - - public function transformCheckedoutAccessory ($accessory, $accessory_users, $total) + public function transformCheckedoutAccessory($accessory, $accessory_users, $total) { - - - $array = array(); - + $array = []; foreach ($accessory_users as $user) { \Log::debug(print_r($user->pivot, true)); @@ -85,14 +82,10 @@ class AccessoriesTransformer 'checkout_notes' => $user->pivot->note, 'last_checkout' => Helper::getFormattedDateObject($user->pivot->created_at, 'datetime'), 'type' => 'user', - 'available_actions' => ['checkin' => true] + 'available_actions' => ['checkin' => true], ]; - } return (new DatatablesTransformer)->transformDatatables($array, $total); } - - - } diff --git a/app/Http/Transformers/ActionlogsTransformer.php b/app/Http/Transformers/ActionlogsTransformer.php index f2b18fab4e..8e32ac705a 100644 --- a/app/Http/Transformers/ActionlogsTransformer.php +++ b/app/Http/Transformers/ActionlogsTransformer.php @@ -1,4 +1,5 @@ transformDatatables($array, $total); } - public function transformActionlog (Actionlog $actionlog, $settings = null) + public function transformActionlog(Actionlog $actionlog, $settings = null) { $icon = $actionlog->present()->icon(); - if ($actionlog->filename!='') { - $icon = e(\App\Helpers\Helper::filetype_icon($actionlog->filename)); + if ($actionlog->filename != '') { + $icon = e(Helper::filetype_icon($actionlog->filename)); } // This is necessary since we can't escape special characters within a JSON object - if (($actionlog->log_meta) && ($actionlog->log_meta!='')) { + if (($actionlog->log_meta) && ($actionlog->log_meta != '')) { $meta_array = json_decode($actionlog->log_meta); if ($meta_array) { foreach ($meta_array as $key => $value) { foreach ($value as $meta_key => $meta_value) { - if (is_array($meta_value)) { foreach ($meta_value as $meta_value_key => $meta_value_value) { $clean_meta[$key][$meta_value_key] = e($meta_value_value); @@ -50,9 +50,7 @@ class ActionlogsTransformer // so we have to walk down that next level if (is_object($meta_value)) { - foreach ($meta_value as $meta_value_key => $meta_value_value) { - if ($meta_value_key == 'value') { $clean_meta[$key]['old'] = null; $clean_meta[$key]['new'] = e($meta_value->value); @@ -61,79 +59,68 @@ class ActionlogsTransformer $clean_meta[$meta_value_key]['new'] = e($meta_value_value); } } - - - } else { $clean_meta[$key][$meta_key] = e($meta_value); } } - } } - } } - $array = [ 'id' => (int) $actionlog->id, 'icon' => $icon, - 'file' => ($actionlog->filename!='') ? + 'file' => ($actionlog->filename != '') ? [ 'url' => route('show/assetfile', ['assetId' => $actionlog->item->id, 'fileId' => $actionlog->id]), 'filename' => $actionlog->filename, - 'inlineable' => (bool) \App\Helpers\Helper::show_file_inline($actionlog->filename), + 'inlineable' => (bool) Helper::show_file_inline($actionlog->filename), ] : null, 'item' => ($actionlog->item) ? [ 'id' => (int) $actionlog->item->id, - 'name' => ($actionlog->itemType()=='user') ? $actionlog->filename : e($actionlog->item->getDisplayNameAttribute()), + 'name' => ($actionlog->itemType() == 'user') ? $actionlog->filename : e($actionlog->item->getDisplayNameAttribute()), 'type' => e($actionlog->itemType()), ] : null, 'location' => ($actionlog->location) ? [ 'id' => (int) $actionlog->location->id, - 'name' => e($actionlog->location->name) + 'name' => e($actionlog->location->name), ] : null, 'created_at' => Helper::getFormattedDateObject($actionlog->created_at, 'datetime'), 'updated_at' => Helper::getFormattedDateObject($actionlog->updated_at, 'datetime'), - 'next_audit_date' => ($actionlog->itemType()=='asset') ? Helper::getFormattedDateObject($actionlog->calcNextAuditDate(null, $actionlog->item), 'date'): null, + 'next_audit_date' => ($actionlog->itemType() == 'asset') ? Helper::getFormattedDateObject($actionlog->calcNextAuditDate(null, $actionlog->item), 'date') : null, 'days_to_next_audit' => $actionlog->daysUntilNextAudit($settings->audit_interval, $actionlog->item), 'action_type' => $actionlog->present()->actionType(), 'admin' => ($actionlog->user) ? [ 'id' => (int) $actionlog->user->id, 'name' => e($actionlog->user->getFullNameAttribute()), 'first_name'=> e($actionlog->user->first_name), - 'last_name'=> e($actionlog->user->last_name) + 'last_name'=> e($actionlog->user->last_name), ] : null, 'target' => ($actionlog->target) ? [ 'id' => (int) $actionlog->target->id, - 'name' => ($actionlog->targetType()=='user') ? e($actionlog->target->getFullNameAttribute()) : e($actionlog->target->getDisplayNameAttribute()), + 'name' => ($actionlog->targetType() == 'user') ? e($actionlog->target->getFullNameAttribute()) : e($actionlog->target->getDisplayNameAttribute()), 'type' => e($actionlog->targetType()), ] : null, 'note' => ($actionlog->note) ? e($actionlog->note): null, 'signature_file' => ($actionlog->accept_signature) ? route('log.signature.view', ['filename' => $actionlog->accept_signature ]) : null, 'log_meta' => ((isset($clean_meta)) && (is_array($clean_meta))) ? $clean_meta: null, - 'action_date' => ($actionlog->action_date) ? Helper::getFormattedDateObject($actionlog->action_date, 'datetime'): null, + 'action_date' => ($actionlog->action_date) ? Helper::getFormattedDateObject($actionlog->action_date, 'datetime'): Helper::getFormattedDateObject($actionlog->created_at, 'datetime'), ]; return $array; } - - - public function transformCheckedoutActionlog (Collection $accessories_users, $total) + public function transformCheckedoutActionlog(Collection $accessories_users, $total) { - - $array = array(); + $array = []; foreach ($accessories_users as $user) { $array[] = (new UsersTransformer)->transformUser($user); } + return (new DatatablesTransformer)->transformDatatables($array, $total); } - - - } diff --git a/app/Http/Transformers/AssetMaintenancesTransformer.php b/app/Http/Transformers/AssetMaintenancesTransformer.php index 49c1b38b65..72ec786f68 100644 --- a/app/Http/Transformers/AssetMaintenancesTransformer.php +++ b/app/Http/Transformers/AssetMaintenancesTransformer.php @@ -1,57 +1,58 @@ transformDatatables($array, $total); } - public function transformAssetMaintenance (AssetMaintenance $assetmaintenance) + public function transformAssetMaintenance(AssetMaintenance $assetmaintenance) { $array = [ 'id' => (int) $assetmaintenance->id, 'asset' => ($assetmaintenance->asset) ? [ 'id' => (int) $assetmaintenance->asset->id, 'name'=> ($assetmaintenance->asset->name) ? e($assetmaintenance->asset->name) : null, - 'asset_tag'=> e($assetmaintenance->asset->asset_tag) + 'asset_tag'=> e($assetmaintenance->asset->asset_tag), - ] : null, + ] : null, 'model' => (($assetmaintenance->asset) && ($assetmaintenance->asset->model)) ? [ 'id' => (int) $assetmaintenance->asset->model->id, - 'name'=> ($assetmaintenance->asset->model->name) ? e($assetmaintenance->asset->model->name).' '.e($assetmaintenance->asset->model->model_number) : null - ] : null, + 'name'=> ($assetmaintenance->asset->model->name) ? e($assetmaintenance->asset->model->name).' '.e($assetmaintenance->asset->model->model_number) : null, + ] : null, 'company' => (($assetmaintenance->asset) && ($assetmaintenance->asset->company)) ? [ 'id' => (int) $assetmaintenance->asset->company->id, 'name'=> ($assetmaintenance->asset->company->name) ? e($assetmaintenance->asset->company->name) : null, - ] : null, + ] : null, 'title' => ($assetmaintenance->title) ? e($assetmaintenance->title) : null, 'location' => (($assetmaintenance->asset) && ($assetmaintenance->asset->location)) ? [ 'id' => (int) $assetmaintenance->asset->location->id, 'name'=> e($assetmaintenance->asset->location->name), - ] : null, + ] : null, 'notes' => ($assetmaintenance->notes) ? e($assetmaintenance->notes) : null, - 'supplier' => ($assetmaintenance->supplier) ? ['id' => $assetmaintenance->supplier->id,'name'=> e($assetmaintenance->supplier->name)] : null, + 'supplier' => ($assetmaintenance->supplier) ? ['id' => $assetmaintenance->supplier->id, 'name'=> e($assetmaintenance->supplier->name)] : null, 'cost' => Helper::formatCurrencyOutput($assetmaintenance->cost), 'asset_maintenance_type' => e($assetmaintenance->asset_maintenance_type), 'start_date' => Helper::getFormattedDateObject($assetmaintenance->start_date, 'date'), 'asset_maintenance_time' => $assetmaintenance->asset_maintenance_time, 'completion_date' => Helper::getFormattedDateObject($assetmaintenance->completion_date, 'date'), - 'user_id' => ($assetmaintenance->admin) ? ['id' => $assetmaintenance->admin->id,'name'=> e($assetmaintenance->admin->getFullNameAttribute())] : null, + 'user_id' => ($assetmaintenance->admin) ? ['id' => $assetmaintenance->admin->id, 'name'=> e($assetmaintenance->admin->getFullNameAttribute())] : null, 'created_at' => Helper::getFormattedDateObject($assetmaintenance->created_at, 'datetime'), 'updated_at' => Helper::getFormattedDateObject($assetmaintenance->updated_at, 'datetime'), @@ -66,9 +67,4 @@ class AssetMaintenancesTransformer return $array; } - - - - - } diff --git a/app/Http/Transformers/AssetModelsTransformer.php b/app/Http/Transformers/AssetModelsTransformer.php index 3f561b7b9f..528df3b146 100644 --- a/app/Http/Transformers/AssetModelsTransformer.php +++ b/app/Http/Transformers/AssetModelsTransformer.php @@ -1,4 +1,5 @@ transformDatatables($array, $total); } - public function transformAssetModel (AssetModel $assetmodel) + public function transformAssetModel(AssetModel $assetmodel) { - $array = [ 'id' => (int) $assetmodel->id, 'name' => e($assetmodel->name), 'manufacturer' => ($assetmodel->manufacturer) ? [ 'id' => (int) $assetmodel->manufacturer->id, - 'name'=> e($assetmodel->manufacturer->name) - ] : null, - 'image' => ($assetmodel->image!='') ? Storage::disk('public')->url('models/'.e($assetmodel->image)) : null, + 'name'=> e($assetmodel->manufacturer->name), + ] : null, + 'image' => ($assetmodel->image != '') ? Storage::disk('public')->url('models/'.e($assetmodel->image)) : null, 'model_number' => e($assetmodel->model_number), 'depreciation' => ($assetmodel->depreciation) ? [ 'id' => (int) $assetmodel->depreciation->id, - 'name'=> e($assetmodel->depreciation->name) - ] : null, + 'name'=> e($assetmodel->depreciation->name), + ] : null, 'assets_count' => (int) $assetmodel->assets_count, 'category' => ($assetmodel->category) ? [ 'id' => (int) $assetmodel->category->id, - 'name'=> e($assetmodel->category->name) - ] : null, + 'name'=> e($assetmodel->category->name), + ] : null, 'fieldset' => ($assetmodel->fieldset) ? [ 'id' => (int) $assetmodel->fieldset->id, - 'name'=> e($assetmodel->fieldset->name) - ] : null, - 'eol' => ($assetmodel->eol > 0) ? $assetmodel->eol .' months': 'None', - 'requestable' => ($assetmodel->requestable =='1') ? true : false, + 'name'=> e($assetmodel->fieldset->name), + ] : null, + 'eol' => ($assetmodel->eol > 0) ? $assetmodel->eol.' months' : 'None', + 'requestable' => ($assetmodel->requestable == '1') ? true : false, 'notes' => e($assetmodel->notes), 'created_at' => Helper::getFormattedDateObject($assetmodel->created_at, 'datetime'), 'updated_at' => Helper::getFormattedDateObject($assetmodel->updated_at, 'datetime'), @@ -54,20 +54,19 @@ class AssetModelsTransformer ]; $permissions_array['available_actions'] = [ - 'update' => (Gate::allows('update', AssetModel::class) && ($assetmodel->deleted_at=='')), - 'delete' => (Gate::allows('delete', AssetModel::class) && ($assetmodel->assets_count==0)), - 'clone' => (Gate::allows('create', AssetModel::class) && ($assetmodel->deleted_at=='')), - 'restore' => (Gate::allows('create', AssetModel::class) && ($assetmodel->deleted_at!='')), + 'update' => (Gate::allows('update', AssetModel::class) && ($assetmodel->deleted_at == '')), + 'delete' => (Gate::allows('delete', AssetModel::class) && ($assetmodel->assets_count == 0)), + 'clone' => (Gate::allows('create', AssetModel::class) && ($assetmodel->deleted_at == '')), + 'restore' => (Gate::allows('create', AssetModel::class) && ($assetmodel->deleted_at != '')), ]; $array += $permissions_array; + return $array; } - - public function transformAssetModelsDatatable($assetmodels) { + public function transformAssetModelsDatatable($assetmodels) + { return (new DatatablesTransformer)->transformDatatables($assetmodels); } - - } diff --git a/app/Http/Transformers/AssetsTransformer.php b/app/Http/Transformers/AssetsTransformer.php index 400a5dd111..8af6f62c64 100644 --- a/app/Http/Transformers/AssetsTransformer.php +++ b/app/Http/Transformers/AssetsTransformer.php @@ -1,4 +1,5 @@ transformDatatables($array, $total); } - public function transformAsset(Asset $asset) { $array = [ @@ -27,10 +28,10 @@ class AssetsTransformer 'serial' => e($asset->serial), 'model' => ($asset->model) ? [ 'id' => (int) $asset->model->id, - 'name'=> e($asset->model->name) + 'name'=> e($asset->model->name), ] : null, 'model_number' => (($asset->model) && ($asset->model->model_number)) ? e($asset->model->model_number) : null, - 'eol' => ($asset->purchase_date!='') ? Helper::getFormattedDateObject($asset->present()->eol_date(), 'date') : null , + 'eol' => ($asset->purchase_date != '') ? Helper::getFormattedDateObject($asset->present()->eol_date(), 'date') : null, 'status_label' => ($asset->assetstatus) ? [ 'id' => (int) $asset->assetstatus->id, 'name'=> e($asset->assetstatus->name), @@ -39,34 +40,34 @@ class AssetsTransformer ] : null, 'category' => (($asset->model) && ($asset->model->category)) ? [ 'id' => (int) $asset->model->category->id, - 'name'=> e($asset->model->category->name) - ] : null, + 'name'=> e($asset->model->category->name), + ] : null, 'manufacturer' => (($asset->model) && ($asset->model->manufacturer)) ? [ 'id' => (int) $asset->model->manufacturer->id, - 'name'=> e($asset->model->manufacturer->name) + 'name'=> e($asset->model->manufacturer->name), ] : null, 'supplier' => ($asset->supplier) ? [ 'id' => (int) $asset->supplier->id, - 'name'=> e($asset->supplier->name) - ] : null, + 'name'=> e($asset->supplier->name), + ] : null, 'notes' => ($asset->notes) ? e($asset->notes) : null, 'order_number' => ($asset->order_number) ? e($asset->order_number) : null, 'company' => ($asset->company) ? [ 'id' => (int) $asset->company->id, - 'name'=> e($asset->company->name) + 'name'=> e($asset->company->name), ] : null, 'location' => ($asset->location) ? [ 'id' => (int) $asset->location->id, - 'name'=> e($asset->location->name) - ] : null, + 'name'=> e($asset->location->name), + ] : null, 'rtd_location' => ($asset->defaultLoc) ? [ 'id' => (int) $asset->defaultLoc->id, - 'name'=> e($asset->defaultLoc->name) - ] : null, + 'name'=> e($asset->defaultLoc->name), + ] : null, 'image' => ($asset->getImageUrl()) ? $asset->getImageUrl() : null, 'assigned_to' => $this->transformAssignedTo($asset), - 'warranty_months' => ($asset->warranty_months > 0) ? e($asset->warranty_months . ' ' . trans('admin/hardware/form.months')) : null, - 'warranty_expires' => ($asset->warranty_months > 0) ? Helper::getFormattedDateObject($asset->warranty_expires, 'date') : null, + 'warranty_months' => ($asset->warranty_months > 0) ? e($asset->warranty_months.' '.trans('admin/hardware/form.months')) : null, + 'warranty_expires' => ($asset->warranty_months > 0) ? Helper::getFormattedDateObject($asset->warranty_expires, 'date') : null, 'created_at' => Helper::getFormattedDateObject($asset->created_at, 'datetime'), 'updated_at' => Helper::getFormattedDateObject($asset->updated_at, 'datetime'), 'last_audit_date' => Helper::getFormattedDateObject($asset->last_audit_date, 'datetime'), @@ -84,12 +85,11 @@ class AssetsTransformer if (($asset->model) && ($asset->model->fieldset) && ($asset->model->fieldset->fields->count() > 0)) { - $fields_array = array(); + $fields_array = []; foreach ($asset->model->fieldset->fields as $field) { - if ($field->isFieldDecryptable($asset->{$field->convertUnicodeDbSlug()})) { - $decrypted = \App\Helpers\Helper::gracefulDecrypt($field,$asset->{$field->convertUnicodeDbSlug()}); + $decrypted = Helper::gracefulDecrypt($field, $asset->{$field->convertUnicodeDbSlug()}); $value = (Gate::allows('superadmin')) ? $decrypted : strtoupper(trans('admin/custom_fields/general.encrypted')); $fields_array[$field->name] = [ @@ -110,19 +110,19 @@ class AssetsTransformer $array['custom_fields'] = $fields_array; } } else { - $array['custom_fields'] = array(); + $array['custom_fields'] = []; } $permissions_array['available_actions'] = [ 'checkout' => Gate::allows('checkout', Asset::class), 'checkin' => Gate::allows('checkin', Asset::class), - 'clone' => Gate::allows('create', Asset::class), + 'clone' => false, 'restore' => false, 'update' => (bool) Gate::allows('update', Asset::class), - 'delete' => ($asset->assigned_to=='' && Gate::allows('delete', Asset::class)), + 'delete' => ($asset->assigned_to == '' && Gate::allows('delete', Asset::class)), ]; - if ($asset->deleted_at!='') { + if ($asset->deleted_at != '') { $permissions_array['available_actions'] = [ 'checkout' => true, 'checkin' => false, @@ -134,7 +134,30 @@ class AssetsTransformer } + if (request('components')=='true') { + + if ($asset->components) { + $array['components'] = []; + + foreach ($asset->components as $component) { + $array['components'][] = [ + + 'id' => $component->id, + 'pivot_id' => $component->pivot->id, + 'name' => $component->name, + 'qty' => $component->pivot->assigned_qty, + 'price_cost' => $component->purchase_cost, + 'purchase_total' => $component->purchase_cost * $component->pivot->assigned_qty, + 'checkout_date' => Helper::getFormattedDateObject($component->pivot->created_at, 'datetime') , + + ]; + } + } + + } + $array += $permissions_array; + return $array; } @@ -153,27 +176,30 @@ class AssetsTransformer 'first_name'=> e($asset->assigned->first_name), 'last_name'=> ($asset->assigned->last_name) ? e($asset->assigned->last_name) : null, 'employee_number' => ($asset->assigned->employee_num) ? e($asset->assigned->employee_num) : null, - 'type' => 'user' + 'type' => 'user', ] : null; } + return $asset->assigned ? [ 'id' => $asset->assigned->id, 'name' => $asset->assigned->display_name, - 'type' => $asset->assignedType() + 'type' => $asset->assignedType(), ] : null; } public function transformRequestedAssets(Collection $assets, $total) { - $array = array(); + $array = []; foreach ($assets as $asset) { $array[] = self::transformRequestedAsset($asset); } + return (new DatatablesTransformer)->transformDatatables($array, $total); } - public function transformRequestedAsset(Asset $asset) { + public function transformRequestedAsset(Asset $asset) + { $array = [ 'id' => (int) $asset->id, 'name' => e($asset->name), @@ -185,16 +211,17 @@ class AssetsTransformer 'expected_checkin' => Helper::getFormattedDateObject($asset->expected_checkin, 'date'), 'location' => ($asset->location) ? e($asset->location->name) : null, 'status'=> ($asset->assetstatus) ? $asset->present()->statusMeta : null, + 'assigned_to_self' => ($asset->assigned_to == \Auth::user()->id), ]; $permissions_array['available_actions'] = [ 'cancel' => ($asset->isRequestedBy(\Auth::user())) ? true : false, 'request' => ($asset->isRequestedBy(\Auth::user())) ? false : true, - ]; - $array += $permissions_array; + $array += $permissions_array; return $array; + } } diff --git a/app/Http/Transformers/CategoriesTransformer.php b/app/Http/Transformers/CategoriesTransformer.php index a07d8b345c..427cfaa299 100644 --- a/app/Http/Transformers/CategoriesTransformer.php +++ b/app/Http/Transformers/CategoriesTransformer.php @@ -1,4 +1,5 @@ transformDatatables($array, $total); } - public function transformCategory (Category $category = null) + public function transformCategory(Category $category = null) { if ($category) { - $array = [ 'id' => (int) $category->id, 'name' => e($category->name), 'image' => ($category->image) ? Storage::disk('public')->url('categories/'.e($category->image)) : null, 'category_type' => ucwords(e($category->category_type)), 'has_eula' => ($category->getEula() ? true : false), + 'use_default_eula' => ($category->use_default_eula=='1' ? true : false), 'eula' => ($category->getEula()), - 'checkin_email' => ($category->checkin_email =='1'), + 'checkin_email' => ($category->checkin_email == '1'), 'require_acceptance' => ($category->require_acceptance == '1'), 'item_count' => (int) $category->itemCount(), 'assets_count' => (int) $category->assets_count, @@ -51,10 +52,5 @@ class CategoriesTransformer return $array; } - - } - - - } diff --git a/app/Http/Transformers/CompaniesTransformer.php b/app/Http/Transformers/CompaniesTransformer.php index 4460b30c14..bafe1f9f68 100644 --- a/app/Http/Transformers/CompaniesTransformer.php +++ b/app/Http/Transformers/CompaniesTransformer.php @@ -1,4 +1,5 @@ transformDatatables($array, $total); } - public function transformCompany (Company $company = null) + public function transformCompany(Company $company = null) { if ($company) { - $array = [ 'id' => (int) $company->id, 'name' => e($company->name), 'image' => ($company->image) ? Storage::disk('public')->url('companies/'.e($company->image)) : null, - "created_at" => Helper::getFormattedDateObject($company->created_at, 'datetime'), - "updated_at" => Helper::getFormattedDateObject($company->updated_at, 'datetime'), - "assets_count" => (int) $company->assets_count, - "licenses_count" => (int) $company->licenses_count, - "accessories_count" => (int) $company->accessories_count, - "consumables_count" => (int) $company->consumables_count, - "components_count" => (int) $company->components_count, - "users_count" => (int) $company->users_count + 'created_at' => Helper::getFormattedDateObject($company->created_at, 'datetime'), + 'updated_at' => Helper::getFormattedDateObject($company->updated_at, 'datetime'), + 'assets_count' => (int) $company->assets_count, + 'licenses_count' => (int) $company->licenses_count, + 'accessories_count' => (int) $company->accessories_count, + 'consumables_count' => (int) $company->consumables_count, + 'components_count' => (int) $company->components_count, + 'users_count' => (int) $company->users_count, ]; $permissions_array['available_actions'] = [ 'update' => Gate::allows('update', Company::class), - 'delete' => $company->isDeletable() + 'delete' => $company->isDeletable(), ]; $array += $permissions_array; return $array; } - - } - - - } diff --git a/app/Http/Transformers/ComponentsAssetsTransformer.php b/app/Http/Transformers/ComponentsAssetsTransformer.php index 8ce3a8600d..1c288bfc9a 100644 --- a/app/Http/Transformers/ComponentsAssetsTransformer.php +++ b/app/Http/Transformers/ComponentsAssetsTransformer.php @@ -1,4 +1,5 @@ transformDatatables($array, $total); } - - public function transformAsset (Asset $asset) + public function transformAsset(Asset $asset) { $array = [ 'id' => $asset->id, @@ -34,8 +35,6 @@ class ComponentsAssetsTransformer 'delete' => Gate::allows('delete', Asset::class), ]; - - $array += $permissions_array; if ($asset->model->fieldset) { @@ -43,12 +42,13 @@ class ComponentsAssetsTransformer $fields_array = [$field->name => $asset->{$field->convertUnicodeDbSlug()}]; $array += $fields_array; } - } + } return $array; } - public function transformAssetsDatatable ($assets) { + public function transformAssetsDatatable($assets) + { return (new DatatablesTransformer)->transformDatatables($assets); } } diff --git a/app/Http/Transformers/ComponentsTransformer.php b/app/Http/Transformers/ComponentsTransformer.php index c27deb2a1f..c43c2d5bdc 100644 --- a/app/Http/Transformers/ComponentsTransformer.php +++ b/app/Http/Transformers/ComponentsTransformer.php @@ -1,4 +1,5 @@ transformDatatables($array, $total); } @@ -27,13 +29,13 @@ class ComponentsTransformer 'serial' => ($component->serial) ? e($component->serial) : null, 'location' => ($component->location) ? [ 'id' => (int) $component->location->id, - 'name' => e($component->location->name) + 'name' => e($component->location->name), ] : null, - 'qty' => ($component->qty!='') ? (int) $component->qty : null, - 'min_amt' => ($component->min_amt!='') ? (int) $component->min_amt : null, + 'qty' => ($component->qty != '') ? (int) $component->qty : null, + 'min_amt' => ($component->min_amt != '') ? (int) $component->min_amt : null, 'category' => ($component->category) ? [ 'id' => (int) $component->category->id, - 'name' => e($component->category->name) + 'name' => e($component->category->name), ] : null, 'order_number' => e($component->order_number), 'purchase_date' => Helper::getFormattedDateObject($component->purchase_date, 'date'), @@ -41,7 +43,7 @@ class ComponentsTransformer 'remaining' => (int) $component->numRemaining(), 'company' => ($component->company) ? [ 'id' => (int) $component->company->id, - 'name' => e($component->company->name) + 'name' => e($component->company->name), ] : null, 'created_at' => Helper::getFormattedDateObject($component->created_at, 'datetime'), 'updated_at' => Helper::getFormattedDateObject($component->updated_at, 'datetime'), @@ -59,21 +61,19 @@ class ComponentsTransformer return $array; } - public function transformCheckedoutComponents(Collection $components_assets, $total) { - $array = array(); + $array = []; foreach ($components_assets as $asset) { $array[] = [ 'assigned_pivot_id' => $asset->pivot->id, 'id' => (int) $asset->id, - 'name' => e($asset->model->present()->name) .' '.e($asset->present()->name), + 'name' => e($asset->model->present()->name).' '.e($asset->present()->name), 'qty' => $asset->pivot->assigned_qty, 'type' => 'asset', 'created_at' => Helper::getFormattedDateObject($asset->pivot->created_at, 'datetime'), - 'available_actions' => ['checkin' => true] + 'available_actions' => ['checkin' => true], ]; - } return (new DatatablesTransformer)->transformDatatables($array, $total); diff --git a/app/Http/Transformers/ConsumablesTransformer.php b/app/Http/Transformers/ConsumablesTransformer.php index c82299de98..abc1fc42ee 100644 --- a/app/Http/Transformers/ConsumablesTransformer.php +++ b/app/Http/Transformers/ConsumablesTransformer.php @@ -1,4 +1,5 @@ transformDatatables($array, $total); } - public function transformConsumable (Consumable $consumable) + public function transformConsumable(Consumable $consumable) { $array = [ 'id' => (int) $consumable->id, @@ -31,7 +32,7 @@ class ConsumablesTransformer 'location' => ($consumable->location) ? ['id' => (int) $consumable->location->id, 'name' => e($consumable->location->name)] : null, 'manufacturer' => ($consumable->manufacturer) ? ['id' => (int) $consumable->manufacturer->id, 'name' => e($consumable->manufacturer->name)] : null, 'min_amt' => (int) $consumable->min_amt, - 'model_number' => ($consumable->model_number!='') ? e($consumable->model_number) : null, + 'model_number' => ($consumable->model_number != '') ? e($consumable->model_number) : null, 'remaining' => $consumable->numRemaining(), 'order_number' => e($consumable->order_number), 'purchase_cost' => Helper::formatCurrencyOutput($consumable->purchase_cost), @@ -54,20 +55,17 @@ class ConsumablesTransformer 'delete' => Gate::allows('delete', Consumable::class), ]; $array += $permissions_array; + return $array; } - - public function transformCheckedoutConsumables (Collection $consumables_users, $total) + public function transformCheckedoutConsumables(Collection $consumables_users, $total) { - - $array = array(); + $array = []; foreach ($consumables_users as $user) { $array[] = (new UsersTransformer)->transformUser($user); } + return (new DatatablesTransformer)->transformDatatables($array, $total); } - - - } diff --git a/app/Http/Transformers/CustomFieldsTransformer.php b/app/Http/Transformers/CustomFieldsTransformer.php index 1ef6904de8..81135de13c 100644 --- a/app/Http/Transformers/CustomFieldsTransformer.php +++ b/app/Http/Transformers/CustomFieldsTransformer.php @@ -1,4 +1,5 @@ transformDatatables($array, $total); } @@ -24,7 +25,7 @@ class CustomFieldsTransformer * @param int $total * @return array */ - public function transformCustomFieldsWithDefaultValues (Collection $fields, $modelId, $total) + public function transformCustomFieldsWithDefaultValues(Collection $fields, $modelId, $total) { $array = []; @@ -35,20 +36,21 @@ class CustomFieldsTransformer return (new DatatablesTransformer)->transformDatatables($array, $total); } - public function transformCustomField (CustomField $field) + public function transformCustomField(CustomField $field) { $array = [ 'id' => $field->id, 'name' => e($field->name), 'db_column_name' => e($field->db_column_name()), 'format' => e($field->format), - 'field_values' => ($field->field_values) ? e($field->field_values) : null, - 'field_values_array' => ($field->field_values) ? explode("\r\n", e($field->field_values)) : null, + 'field_values' => ($field->field_values) ? e($field->field_values) : null, + 'field_values_array' => ($field->field_values) ? explode("\r\n", e($field->field_values)) : null, 'type' => e($field->element), 'required' => $field->pivot ? $field->pivot->required : false, 'created_at' => Helper::getFormattedDateObject($field->created_at, 'datetime'), 'updated_at' => Helper::getFormattedDateObject($field->updated_at, 'datetime'), ]; + return $array; } @@ -60,13 +62,13 @@ class CustomFieldsTransformer * @param int $modelId * @return array */ - public function transformCustomFieldWithDefaultValue (CustomField $field, $modelId) + public function transformCustomFieldWithDefaultValue(CustomField $field, $modelId) { return [ 'id' => $field->id, 'name' => e($field->name), 'type' => e($field->element), - 'field_values_array' => ($field->field_values) ? explode("\r\n", e($field->field_values)) : null, + 'field_values_array' => ($field->field_values) ? explode("\r\n", e($field->field_values)) : null, 'default_value' => $field->defaultValue($modelId), ]; } diff --git a/app/Http/Transformers/CustomFieldsetsTransformer.php b/app/Http/Transformers/CustomFieldsetsTransformer.php index 260164ef8c..61e42486ab 100644 --- a/app/Http/Transformers/CustomFieldsetsTransformer.php +++ b/app/Http/Transformers/CustomFieldsetsTransformer.php @@ -1,4 +1,5 @@ transformDatatables($array, $total); } - public function transformCustomFieldset (CustomFieldset $fieldset) + public function transformCustomFieldset(CustomFieldset $fieldset) { $fields = $fieldset->fields; $models = $fieldset->models; - $modelsArray = array(); + $modelsArray = []; - foreach ($models as $model) - { + foreach ($models as $model) { $modelsArray[] = [ 'id' => $model->id, - 'name' => e($model->name) + 'name' => e($model->name), ]; } @@ -39,6 +39,7 @@ class CustomFieldsetsTransformer 'created_at' => Helper::getFormattedDateObject($fieldset->created_at, 'datetime'), 'updated_at' => Helper::getFormattedDateObject($fieldset->updated_at, 'datetime'), ]; + return $array; } } diff --git a/app/Http/Transformers/DatatablesTransformer.php b/app/Http/Transformers/DatatablesTransformer.php index 0fc90bec8c..0e69109391 100644 --- a/app/Http/Transformers/DatatablesTransformer.php +++ b/app/Http/Transformers/DatatablesTransformer.php @@ -1,13 +1,14 @@ transformDatatables($array, $total); } - public function transformDepartment (Department $department = null) + public function transformDepartment(Department $department = null) { if ($department) { - $array = [ 'id' => (int) $department->id, 'name' => e($department->name), 'image' => ($department->image) ? Storage::disk('public')->url(app('departments_upload_url').e($department->image)) : null, 'company' => ($department->company) ? [ 'id' => (int) $department->company->id, - 'name'=> e($department->company->name) + 'name'=> e($department->company->name), ] : null, 'manager' => ($department->manager) ? [ 'id' => (int) $department->manager->id, 'name' => e($department->manager->getFullNameAttribute()), 'first_name'=> e($department->manager->first_name), - 'last_name'=> e($department->manager->last_name) + 'last_name'=> e($department->manager->last_name), ] : null, 'location' => ($department->location) ? [ 'id' => (int) $department->location->id, - 'name' => e($department->location->name) + 'name' => e($department->location->name), ] : null, 'users_count' => e($department->users_count), 'created_at' => Helper::getFormattedDateObject($department->created_at, 'datetime'), @@ -48,17 +48,12 @@ class DepartmentsTransformer $permissions_array['available_actions'] = [ 'update' => Gate::allows('update', Department::class), - 'delete' => (Gate::allows('delete', Department::class) && ($department->users_count==0)), + 'delete' => (Gate::allows('delete', Department::class) && ($department->users_count == 0)), ]; $array += $permissions_array; return $array; } - - } - - - } diff --git a/app/Http/Transformers/DepreciationReportTransformer.php b/app/Http/Transformers/DepreciationReportTransformer.php new file mode 100644 index 0000000000..592fb877b4 --- /dev/null +++ b/app/Http/Transformers/DepreciationReportTransformer.php @@ -0,0 +1,120 @@ +] + * @since [v5.2.0] + */ +class DepreciationReportTransformer +{ + public function transformAssets(Collection $assets, $total) + { + $array = array(); + foreach ($assets as $asset) { + $array[] = self::transformAsset($asset); + } + return (new DatatablesTransformer)->transformDatatables($array, $total); + } + + + public function transformAsset(Asset $asset) + { + + /** + * Set some default values here + */ + $purchase_cost = null; + $depreciated_value = null; + $monthly_depreciation = null; + $diff = null; + $checkout_target = null; + + /** + * If there is a location set and a currency set, use that for display + */ + if ($asset->location && $asset->location->currency) { + $purchase_cost_currency = $asset->location->currency; + } else { + $purchase_cost_currency = \App\Models\Setting::getSettings()->default_currency; + } + + /** + * If there is a NOT an empty purchase cost (meaning not null or '' but it *could* be zero), + * format the purchase cost. We coould do this inline in the transformer, but we need that value + * for the other calculations that come after, like diff, etc. + */ + if ($asset->purchase_cost!='') { + $purchase_cost = $asset->purchase_cost; + } + + + /** + * Override the previously set null values if there is a valid model and associated depreciation + */ + if (($asset->model) && ($asset->model->depreciation)) { + $depreciated_value = Helper::formatCurrencyOutput($asset->getDepreciatedValue()); + $monthly_depreciation = Helper::formatCurrencyOutput(($asset->model->eol > 0 ? ($asset->purchase_cost / $asset->model->eol) : 0)); + $diff = Helper::formatCurrencyOutput(($asset->purchase_cost - $asset->getDepreciatedValue())); + } + + if ($asset->assigned) { + $checkout_target = $asset->assigned->name; + if ($asset->checkedOutToUser()) { + $checkout_target = $asset->assigned->getFullNameAttribute(); + } + + } + + $array = [ + + 'company' => ($asset->company) ? e($asset->company->name) : null, + 'name' => e($asset->name), + 'asset_tag' => e($asset->asset_tag), + 'serial' => e($asset->serial), + 'model' => ($asset->model) ? e($asset->model->name) : null, + 'model_number' => (($asset->model) && ($asset->model->model_number)) ? e($asset->model->model_number) : null, + 'eol' => ($asset->purchase_date!='') ? Helper::getFormattedDateObject($asset->present()->eol_date(), 'date') : null , + 'status_label' => ($asset->assetstatus) ? e($asset->assetstatus->name) : null, + 'status' => ($asset->assetstatus) ? e($asset->present()->statusMeta) : null, + 'category' => (($asset->model) && ($asset->model->category)) ? e($asset->model->category->name) : null, + 'manufacturer' => (($asset->model) && ($asset->model->manufacturer)) ? e($asset->model->manufacturer->name) : null, + 'supplier' => ($asset->supplier) ? e($asset->supplier->name) : null, + 'notes' => ($asset->notes) ? e($asset->notes) : null, + 'order_number' => ($asset->order_number) ? e($asset->order_number) : null, + 'location' => ($asset->location) ? e($asset->location->name) : null, + 'warranty_expires' => ($asset->warranty_months > 0) ? Helper::getFormattedDateObject($asset->warranty_expires, 'date') : null, + 'currency' => $purchase_cost_currency, + 'purchase_date' => Helper::getFormattedDateObject($asset->purchase_date, 'date'), + 'purchase_cost' => Helper::formatCurrencyOutput($asset->purchase_cost), + 'book_value' => Helper::formatCurrencyOutput($depreciated_value), + 'monthly_depreciation' => $monthly_depreciation, + 'checked_out_to' => $checkout_target, + 'diff' => Helper::formatCurrencyOutput($diff), + 'number_of_months' => ($asset->model && $asset->model->depreciation) ? e($asset->model->depreciation->months) : null, + 'depreciation' => (($asset->model) && ($asset->model->depreciation)) ? e($asset->model->depreciation->name) : null, + + + + ]; + + return $array; + } + + public function transformAssetsDatatable($assets) + { + return (new DatatablesTransformer)->transformDatatables($assets); + } + + + +} diff --git a/app/Http/Transformers/DepreciationsTransformer.php b/app/Http/Transformers/DepreciationsTransformer.php index 0b9d011e23..abfbf151c6 100644 --- a/app/Http/Transformers/DepreciationsTransformer.php +++ b/app/Http/Transformers/DepreciationsTransformer.php @@ -1,4 +1,5 @@ transformDatatables($array); } - public function transformDepreciation (Depreciation $depreciation) + public function transformDepreciation(Depreciation $depreciation) { $array = [ 'id' => (int) $depreciation->id, 'name' => e($depreciation->name), - 'months' => $depreciation->months . ' '. trans('general.months'), + 'months' => $depreciation->months.' '.trans('general.months'), + 'depreciation_min' => $depreciation->depreciation_min, 'created_at' => Helper::getFormattedDateObject($depreciation->created_at, 'datetime'), 'updated_at' => Helper::getFormattedDateObject($depreciation->updated_at, 'datetime'), + 'depreciation_min' =>($depreciation->depreciation_min), ]; $permissions_array['available_actions'] = [ @@ -37,7 +40,4 @@ class DepreciationsTransformer return $array; } - - - } diff --git a/app/Http/Transformers/GroupsTransformer.php b/app/Http/Transformers/GroupsTransformer.php index 8f116aad76..93511ce9ff 100644 --- a/app/Http/Transformers/GroupsTransformer.php +++ b/app/Http/Transformers/GroupsTransformer.php @@ -1,4 +1,5 @@ transformDatatables($array); } - public function transformGroup (Group $group) + public function transformGroup(Group $group) { $array = [ 'id' => (int) $group->id, @@ -38,7 +39,4 @@ class GroupsTransformer return $array; } - - - } diff --git a/app/Http/Transformers/ImportsTransformer.php b/app/Http/Transformers/ImportsTransformer.php index 813819c193..486c18f28c 100644 --- a/app/Http/Transformers/ImportsTransformer.php +++ b/app/Http/Transformers/ImportsTransformer.php @@ -1,4 +1,5 @@ (int) $import->id, + 'id' => (int) $import->id, 'file_path' => e($import->file_path), 'filesize' => Setting::fileSizeConvert($import->filesize), 'name' => e($import->name), diff --git a/app/Http/Transformers/LicenseSeatsTransformer.php b/app/Http/Transformers/LicenseSeatsTransformer.php index c8454d06e7..126361b17a 100644 --- a/app/Http/Transformers/LicenseSeatsTransformer.php +++ b/app/Http/Transformers/LicenseSeatsTransformer.php @@ -1,4 +1,5 @@ transformDatatables($array, $total); } - public function transformLicenseSeat (LicenseSeat $seat, $seat_count=0) + public function transformLicenseSeat(LicenseSeat $seat, $seat_count = 0) { $array = [ 'id' => (int) $seat->id, @@ -28,27 +29,26 @@ class LicenseSeatsTransformer 'assigned_user' => ($seat->user) ? [ 'id' => (int) $seat->user->id, 'name'=> e($seat->user->present()->fullName), - 'department'=> - ($seat->user->department) ? + 'department'=> ($seat->user->department) ? [ - "id" => (int) $seat->user->department->id, - "name" => e($seat->user->department->name) + 'id' => (int) $seat->user->department->id, + 'name' => e($seat->user->department->name), - ] : null + ] : null, ] : null, 'assigned_asset' => ($seat->asset) ? [ 'id' => (int) $seat->asset->id, - 'name'=> e($seat->asset->present()->fullName) + 'name'=> e($seat->asset->present()->fullName), ] : null, 'location' => ($seat->location()) ? [ 'id' => (int) $seat->location()->id, - 'name'=> e($seat->location()->name) + 'name'=> e($seat->location()->name), ] : null, 'reassignable' => (bool) $seat->license->reassignable, - 'user_can_checkout' => (($seat->assigned_to=='') && ($seat->asset_id=='')), + 'user_can_checkout' => (($seat->assigned_to == '') && ($seat->asset_id == '')), ]; - if($seat_count != 0) { + if ($seat_count != 0) { $array['name'] = 'Seat '.$seat_count; } @@ -64,9 +64,4 @@ class LicenseSeatsTransformer return $array; } - - - - - } diff --git a/app/Http/Transformers/LicensesTransformer.php b/app/Http/Transformers/LicensesTransformer.php index 48d5152688..56492ba45c 100644 --- a/app/Http/Transformers/LicensesTransformer.php +++ b/app/Http/Transformers/LicensesTransformer.php @@ -1,4 +1,5 @@ transformDatatables($array, $total); } - public function transformLicense (License $license) + public function transformLicense(License $license) { $array = [ 'id' => (int) $license->id, 'name' => e($license->name), - 'company' => ($license->company) ? ['id' => (int) $license->company->id,'name'=> e($license->company->name)] : null, - 'manufacturer' => ($license->manufacturer) ? ['id' => (int) $license->manufacturer->id,'name'=> e($license->manufacturer->name)] : null, + 'company' => ($license->company) ? ['id' => (int) $license->company->id, 'name'=> e($license->company->name)] : null, + 'manufacturer' => ($license->manufacturer) ? ['id' => (int) $license->manufacturer->id, 'name'=> e($license->manufacturer->name)] : null, 'product_key' => (Gate::allows('viewKeys', License::class)) ? e($license->serial) : '------------', 'order_number' => e($license->order_number), 'purchase_order' => e($license->purchase_order), 'purchase_date' => Helper::getFormattedDateObject($license->purchase_date, 'date'), 'termination_date' => Helper::getFormattedDateObject($license->termination_date, 'date'), 'depreciation' => ($license->depreciation) ? ['id' => (int) $license->depreciation->id,'name'=> e($license->depreciation->name)] : null, - 'purchase_cost' => e($license->purchase_cost), + 'purchase_cost' => Helper::formatCurrencyOutput($license->purchase_cost), + 'purchase_cost_numeric' => $license->purchase_cost, 'notes' => e($license->notes), 'expiration_date' => Helper::getFormattedDateObject($license->expiration_date, 'date'), 'seats' => (int) $license->seats, @@ -40,8 +42,8 @@ class LicensesTransformer 'license_email' => e($license->license_email), 'reassignable' => ($license->reassignable == 1) ? true : false, 'maintained' => ($license->maintained == 1) ? true : false, - 'supplier' => ($license->supplier) ? ['id' => (int) $license->supplier->id,'name'=> e($license->supplier->name)] : null, - 'category' => ($license->category) ? ['id' => (int) $license->category->id,'name'=> e($license->category->name)] : null, + 'supplier' => ($license->supplier) ? ['id' => (int) $license->supplier->id, 'name'=> e($license->supplier->name)] : null, + 'category' => ($license->category) ? ['id' => (int) $license->category->id, 'name'=> e($license->category->name)] : null, 'created_at' => Helper::getFormattedDateObject($license->created_at, 'datetime'), 'updated_at' => Helper::getFormattedDateObject($license->updated_at, 'datetime'), 'user_can_checkout' => (bool) ($license->free_seats_count > 0), @@ -60,7 +62,8 @@ class LicensesTransformer return $array; } - public function transformAssetsDatatable($licenses) { + public function transformAssetsDatatable($licenses) + { return (new DatatablesTransformer)->transformDatatables($licenses); } diff --git a/app/Http/Transformers/LocationsTransformer.php b/app/Http/Transformers/LocationsTransformer.php index 2f7013b21a..78d8cc8096 100644 --- a/app/Http/Transformers/LocationsTransformer.php +++ b/app/Http/Transformers/LocationsTransformer.php @@ -1,4 +1,5 @@ transformDatatables($array, $total); } public function transformLocation(Location $location = null) { if ($location) { - $children_arr = []; - if(!is_null($location->children)){ - foreach($location->children as $child) { + if (! is_null($location->children)) { + foreach ($location->children as $child) { $children_arr[] = [ 'id' => (int) $child->id, - 'name' => $child->name + 'name' => $child->name, ]; } } @@ -52,11 +52,10 @@ class LocationsTransformer 'updated_at' => Helper::getFormattedDateObject($location->updated_at, 'datetime'), 'parent' => ($location->parent) ? [ 'id' => (int) $location->parent->id, - 'name'=> e($location->parent->name) + 'name'=> e($location->parent->name), ] : null, 'manager' => ($location->manager) ? (new UsersTransformer)->transformUser($location->manager) : null, - 'children' => $children_arr, ]; @@ -69,10 +68,5 @@ class LocationsTransformer return $array; } - - } - - - } diff --git a/app/Http/Transformers/LoginAttemptsTransformer.php b/app/Http/Transformers/LoginAttemptsTransformer.php index a0af36d121..cc1c512fbb 100644 --- a/app/Http/Transformers/LoginAttemptsTransformer.php +++ b/app/Http/Transformers/LoginAttemptsTransformer.php @@ -1,15 +1,14 @@ (int) $login_attempt->id, 'username' => e($login_attempt->username), 'user_agent' => e($login_attempt->user_agent), - 'remote_ip' => (!config('app.lock_passwords')) ? e($login_attempt->remote_ip) : '--', + 'remote_ip' => (! config('app.lock_passwords')) ? e($login_attempt->remote_ip) : '--', 'successful' => e($login_attempt->successful), 'created_at' => Helper::getFormattedDateObject($login_attempt->created_at, 'datetime'), ]; + return $array; } - - } - - - } diff --git a/app/Http/Transformers/ManufacturersTransformer.php b/app/Http/Transformers/ManufacturersTransformer.php index 1cdf5dd3fe..a7ac0e6a42 100644 --- a/app/Http/Transformers/ManufacturersTransformer.php +++ b/app/Http/Transformers/ManufacturersTransformer.php @@ -1,4 +1,5 @@ transformDatatables($array, $total); } - public function transformManufacturer (Manufacturer $manufacturer = null) + public function transformManufacturer(Manufacturer $manufacturer = null) { if ($manufacturer) { - $array = [ 'id' => (int) $manufacturer->id, 'name' => e($manufacturer->name), @@ -41,8 +41,8 @@ class ManufacturersTransformer ]; $permissions_array['available_actions'] = [ - 'update' => (($manufacturer->deleted_at=='') && (Gate::allows('update', Manufacturer::class))), - 'restore' => (($manufacturer->deleted_at!='') && (Gate::allows('create', Manufacturer::class))), + 'update' => (($manufacturer->deleted_at == '') && (Gate::allows('update', Manufacturer::class))), + 'restore' => (($manufacturer->deleted_at != '') && (Gate::allows('create', Manufacturer::class))), 'delete' => $manufacturer->isDeletable(), ]; @@ -50,10 +50,5 @@ class ManufacturersTransformer return $array; } - - } - - - } diff --git a/app/Http/Transformers/PredefinedKitsTransformer.php b/app/Http/Transformers/PredefinedKitsTransformer.php index 57e3aa62f4..ebd91aef0c 100644 --- a/app/Http/Transformers/PredefinedKitsTransformer.php +++ b/app/Http/Transformers/PredefinedKitsTransformer.php @@ -1,4 +1,5 @@ ] * @return array */ class PredefinedKitsTransformer { - - public function transformPredefinedKits (Collection $kits, $total) + public function transformPredefinedKits(Collection $kits, $total) { - $array = array(); + $array = []; foreach ($kits as $kit) { $array[] = self::transformPredefinedKit($kit); } + return (new DatatablesTransformer)->transformDatatables($array, $total); } - public function transformPredefinedKit (PredefinedKit $kit) + public function transformPredefinedKit(PredefinedKit $kit) { $array = [ 'id' => (int) $kit->id, - 'name' => e($kit->name) + 'name' => e($kit->name), ]; $permissions_array['available_actions'] = [ @@ -40,28 +41,32 @@ class PredefinedKitsTransformer ]; $array['user_can_checkout'] = true; $array += $permissions_array; + return $array; } /** - * transform collection of any elemets attached to kit + * transform collection of any elemets attached to kit * @return array */ - public function transformElements(Collection $elements, $total) { - $array = array(); + public function transformElements(Collection $elements, $total) + { + $array = []; foreach ($elements as $element) { $array[] = self::transformElement($element); } + return (new DatatablesTransformer)->transformDatatables($array, $total); } - public function transformElement(SnipeModel $element) { + public function transformElement(SnipeModel $element) + { $array = [ 'id' => (int) $element->id, 'pivot_id' => (int) $element->pivot->id, 'owner_id' => (int) $element->pivot->kit_id, 'quantity' => (int) $element->pivot->quantity, - 'name' => e($element->name) + 'name' => e($element->name), ]; $permissions_array['available_actions'] = [ @@ -70,12 +75,12 @@ class PredefinedKitsTransformer ]; $array += $permissions_array; + return $array; } - public function transformPredefinedKitsDatatable($kits) { + public function transformPredefinedKitsDatatable($kits) + { return (new DatatablesTransformer)->transformDatatables($kits); } - - } diff --git a/app/Http/Transformers/SelectlistTransformer.php b/app/Http/Transformers/SelectlistTransformer.php index 6b0d8caee3..363d92126a 100644 --- a/app/Http/Transformers/SelectlistTransformer.php +++ b/app/Http/Transformers/SelectlistTransformer.php @@ -1,5 +1,7 @@ ] * @since [v4.0.16] * @return \Illuminate\Http\Response */ - class SelectlistTransformer { - - public function transformSelectlist (LengthAwarePaginator $select_items) + public function transformSelectlist(LengthAwarePaginator $select_items) { - $items_array=[]; + $items_array = []; // Loop through the paginated collection to set the array values foreach ($select_items as $select_item) { - $items_array[]= [ + $items_array[] = [ 'id' => (int) $select_item->id, 'text' => ($select_item->use_text) ? $select_item->use_text : $select_item->name, - 'image' => ($select_item->use_image) ? $select_item->use_image : null, + 'image' => ($select_item->use_image) ? $select_item->use_image : null, ]; - } $results = [ 'results' => $items_array, - 'pagination' => - [ + 'pagination' => [ 'more' => ($select_items->currentPage() >= $select_items->lastPage()) ? false : true, - 'per_page' => $select_items->perPage() + 'per_page' => $select_items->perPage(), ], 'total_count' => $select_items->total(), 'page' => $select_items->currentPage(), - 'page_count' => $select_items->lastPage() + 'page_count' => $select_items->lastPage(), ]; return $results; - } - } diff --git a/app/Http/Transformers/StatuslabelsTransformer.php b/app/Http/Transformers/StatuslabelsTransformer.php index b320129f37..cc229a590f 100644 --- a/app/Http/Transformers/StatuslabelsTransformer.php +++ b/app/Http/Transformers/StatuslabelsTransformer.php @@ -1,4 +1,5 @@ transformDatatables($array, $total); } - public function transformStatuslabel (Statuslabel $statuslabel) + public function transformStatuslabel(Statuslabel $statuslabel) { $array = [ 'id' => (int) $statuslabel->id, 'name' => e($statuslabel->name), 'type' => $statuslabel->getStatuslabelType(), 'color' => ($statuslabel->color) ? e($statuslabel->color) : null, - 'show_in_nav' => ($statuslabel->show_in_nav=='1') ? true : false, - 'default_label' => ($statuslabel->default_label =='1') ? true : false, + 'show_in_nav' => ($statuslabel->show_in_nav == '1') ? true : false, + 'default_label' => ($statuslabel->default_label == '1') ? true : false, 'assets_count' => (int) $statuslabel->assets_count, 'notes' => e($statuslabel->notes), 'created_at' => Helper::getFormattedDateObject($statuslabel->created_at, 'datetime'), @@ -41,7 +42,4 @@ class StatuslabelsTransformer return $array; } - - - } diff --git a/app/Http/Transformers/SuppliersTransformer.php b/app/Http/Transformers/SuppliersTransformer.php index e24e399bd1..76b2a01514 100644 --- a/app/Http/Transformers/SuppliersTransformer.php +++ b/app/Http/Transformers/SuppliersTransformer.php @@ -1,4 +1,5 @@ transformDatatables($array, $total); } - public function transformSupplier (Supplier $supplier = null) + public function transformSupplier(Supplier $supplier = null) { if ($supplier) { - $array = [ 'id' => (int) $supplier->id, 'name' => e($supplier->name), @@ -49,17 +49,12 @@ class SuppliersTransformer $permissions_array['available_actions'] = [ 'update' => Gate::allows('update', Supplier::class), - 'delete' => (Gate::allows('delete', Supplier::class) && ($supplier->assets_count == 0) && ($supplier->licenses_count == 0) && ($supplier->accessories_count == 0)), + 'delete' => (Gate::allows('delete', Supplier::class) && ($supplier->assets_count == 0) && ($supplier->licenses_count == 0) && ($supplier->accessories_count == 0)), ]; $array += $permissions_array; return $array; } - - } - - - } diff --git a/app/Http/Transformers/UsersTransformer.php b/app/Http/Transformers/UsersTransformer.php index f2d1c795fa..49aea90a1d 100644 --- a/app/Http/Transformers/UsersTransformer.php +++ b/app/Http/Transformers/UsersTransformer.php @@ -1,4 +1,5 @@ transformDatatables($array, $total); } - public function transformUser (User $user) + public function transformUser(User $user) { $array = [ 'id' => (int) $user->id, @@ -31,8 +32,8 @@ class UsersTransformer 'employee_num' => e($user->employee_num), 'manager' => ($user->manager) ? [ 'id' => (int) $user->manager->id, - 'name'=> e($user->manager->username) - ] : null, + 'name'=> e($user->manager->username), + ] : null, 'jobtitle' => ($user->jobtitle) ? e($user->jobtitle) : null, 'phone' => ($user->phone) ? e($user->phone) : null, 'website' => ($user->website) ? e($user->website) : null, @@ -44,61 +45,57 @@ class UsersTransformer 'email' => e($user->email), 'department' => ($user->department) ? [ 'id' => (int) $user->department->id, - 'name'=> e($user->department->name) - ] : null, + 'name'=> e($user->department->name), + ] : null, 'location' => ($user->userloc) ? [ 'id' => (int) $user->userloc->id, - 'name'=> e($user->userloc->name) - ] : null, + 'name'=> e($user->userloc->name), + ] : null, 'notes'=> e($user->notes), 'permissions' => $user->decodePermissions(), - 'activated' => ($user->activated =='1') ? true : false, - 'ldap_import' => ($user->ldap_import =='1') ? true : false, + 'activated' => ($user->activated == '1') ? true : false, + 'ldap_import' => ($user->ldap_import == '1') ? true : false, 'two_factor_activated' => ($user->two_factor_active()) ? true : false, 'two_factor_enrolled' => ($user->two_factor_active_and_enrolled()) ? true : false, 'assets_count' => (int) $user->assets_count, 'licenses_count' => (int) $user->licenses_count, 'accessories_count' => (int) $user->accessories_count, 'consumables_count' => (int) $user->consumables_count, - 'company' => ($user->company) ? ['id' => (int) $user->company->id,'name'=> e($user->company->name)] : null, + 'company' => ($user->company) ? ['id' => (int) $user->company->id, 'name'=> e($user->company->name)] : null, 'created_at' => Helper::getFormattedDateObject($user->created_at, 'datetime'), 'updated_at' => Helper::getFormattedDateObject($user->updated_at, 'datetime'), 'last_login' => Helper::getFormattedDateObject($user->last_login, 'datetime'), - 'deleted_at' => ($user->deleted_at) ? Helper::getFormattedDateObject($user->deleted_at, 'datetime') : null, + 'deleted_at' => ($user->deleted_at) ? Helper::getFormattedDateObject($user->deleted_at, 'datetime') : null, ]; $permissions_array['available_actions'] = [ - 'update' => (Gate::allows('update', User::class) && ($user->deleted_at=='')), - 'delete' => (Gate::allows('delete', User::class) && ($user->assets_count == 0) && ($user->licenses_count == 0) && ($user->accessories_count == 0) && ($user->consumables_count == 0)), - 'clone' => (Gate::allows('create', User::class) && ($user->deleted_at=='')) , - 'restore' => (Gate::allows('create', User::class) && ($user->deleted_at!='')), + 'update' => (Gate::allows('update', User::class) && ($user->deleted_at == '')), + 'delete' => (Gate::allows('delete', User::class) && ($user->assets_count == 0) && ($user->licenses_count == 0) && ($user->accessories_count == 0) && ($user->consumables_count == 0)), + 'clone' => (Gate::allows('create', User::class) && ($user->deleted_at == '')), + 'restore' => (Gate::allows('create', User::class) && ($user->deleted_at != '')), ]; $array += $permissions_array; - $numGroups = $user->groups->count(); - if($numGroups > 0) - { - $groups["total"] = $numGroups; - foreach($user->groups as $group) - { - $groups["rows"][] = [ + if ($numGroups > 0) { + $groups['total'] = $numGroups; + foreach ($user->groups as $group) { + $groups['rows'][] = [ 'id' => (int) $group->id, - 'name' => e($group->name) + 'name' => e($group->name), ]; } - $array["groups"] = $groups; - } - else { - $array["groups"] = null; + $array['groups'] = $groups; + } else { + $array['groups'] = null; } return $array; } - public function transformUsersDatatable($users) { + public function transformUsersDatatable($users) + { return (new DatatablesTransformer)->transformDatatables($users); } - } diff --git a/app/Importer/AccessoryImporter.php b/app/Importer/AccessoryImporter.php index 709b58ea3c..f9c871fa7c 100644 --- a/app/Importer/AccessoryImporter.php +++ b/app/Importer/AccessoryImporter.php @@ -14,7 +14,7 @@ class AccessoryImporter extends ItemImporter protected function handle($row) { parent::handle($row); // TODO: Change the autogenerated stub - $this->createAccessoryIfNotExists(); + $this->createAccessoryIfNotExists($row); } /** @@ -23,29 +23,34 @@ class AccessoryImporter extends ItemImporter * @author Daniel Melzter * @since 3.0 */ - public function createAccessoryIfNotExists() + public function createAccessoryIfNotExists($row) { $accessory = Accessory::where('name', $this->item['name'])->first(); if ($accessory) { - if (!$this->updating) { - $this->log('A matching Accessory ' . $this->item["name"] . ' already exists. '); + if (! $this->updating) { + $this->log('A matching Accessory '.$this->item['name'].' already exists. '); + return; } $this->log('Updating Accessory'); + $this->item['model_number'] = $this->findCsvMatch($row, "model_number"); $accessory->update($this->sanitizeItemForUpdating($accessory)); $accessory->save(); + return; } - $this->log("No Matching Accessory, Creating a new one"); + $this->log('No Matching Accessory, Creating a new one'); $accessory = new Accessory(); + $this->item['model_number'] = $this->findCsvMatch($row, "model_number"); $accessory->fill($this->sanitizeItemForStoring($accessory)); //FIXME: this disables model validation. Need to find a way to avoid double-logs without breaking everything. // $accessory->unsetEventDispatcher(); if ($accessory->save()) { $accessory->logCreate('Imported using CSV Importer'); - $this->log('Accessory ' . $this->item["name"] . ' was created'); + $this->log('Accessory '.$this->item['name'].' was created'); + return; } $this->logError($accessory, 'Accessory'); diff --git a/app/Importer/AssetImporter.php b/app/Importer/AssetImporter.php index be117d6fae..8e6781db7d 100644 --- a/app/Importer/AssetImporter.php +++ b/app/Importer/AssetImporter.php @@ -21,20 +21,17 @@ class AssetImporter extends ItemImporter parent::handle($row); if ($this->customFields) { - foreach ($this->customFields as $customField) { $customFieldValue = $this->array_smart_custom_field_fetch($row, $customField); if ($customFieldValue) { - if ($customField->field_encrypted == 1) { $this->item['custom_fields'][$customField->db_column_name()] = \Crypt::encrypt($customFieldValue); - $this->log('Custom Field '. $customField->name.': '.\Crypt::encrypt($customFieldValue)); + $this->log('Custom Field '.$customField->name.': '.\Crypt::encrypt($customFieldValue)); } else { $this->item['custom_fields'][$customField->db_column_name()] = $customFieldValue; - $this->log('Custom Field '. $customField->name.': '.$customFieldValue); + $this->log('Custom Field '.$customField->name.': '.$customFieldValue); } - } else { // Clear out previous data. $this->item['custom_fields'][$customField->db_column_name()] = null; @@ -42,7 +39,6 @@ class AssetImporter extends ItemImporter } } - $this->createAssetIfNotExists($row); } @@ -57,30 +53,31 @@ class AssetImporter extends ItemImporter public function createAssetIfNotExists(array $row) { $editingAsset = false; - $asset_tag = $this->findCsvMatch($row, "asset_tag"); + $asset_tag = $this->findCsvMatch($row, 'asset_tag'); $asset = Asset::where(['asset_tag'=> $asset_tag])->first(); if ($asset) { - if (!$this->updating) { - $this->log('A matching Asset ' . $asset_tag . ' already exists'); + if (! $this->updating) { + $this->log('A matching Asset '.$asset_tag.' already exists'); + return; } - $this->log("Updating Asset"); + $this->log('Updating Asset'); $editingAsset = true; } else { - $this->log("No Matching Asset, Creating a new one"); + $this->log('No Matching Asset, Creating a new one'); $asset = new Asset; } - $this->item['image'] = $this->findCsvMatch($row, "image"); - $this->item['requestable'] = $this->fetchHumanBoolean($this->findCsvMatch($row, "requestable"));; - $asset->requestable = $this->fetchHumanBoolean($this->findCsvMatch($row, "requestable")); - $this->item['warranty_months'] = intval($this->findCsvMatch($row, "warranty_months")); + $this->item['image'] = $this->findCsvMatch($row, 'image'); + $this->item['requestable'] = $this->fetchHumanBoolean($this->findCsvMatch($row, 'requestable')); + $asset->requestable = $this->fetchHumanBoolean($this->findCsvMatch($row, 'requestable')); + $this->item['warranty_months'] = intval($this->findCsvMatch($row, 'warranty_months')); $this->item['model_id'] = $this->createOrFetchAssetModel($row); // If no status ID is found - if (!array_key_exists('status_id', $this->item) && !$editingAsset) { - $this->log("No status field found, defaulting to first status."); + if (! array_key_exists('status_id', $this->item) && ! $editingAsset) { + $this->log('No status field found, defaulting to first status.'); $this->item['status_id'] = $this->defaultStatusLabelId; } @@ -88,18 +85,17 @@ class AssetImporter extends ItemImporter // We need to save the user if it exists so that we can checkout to user later. // Sanitizing the item will remove it. - if(array_key_exists('checkout_target', $this->item)) { + if (array_key_exists('checkout_target', $this->item)) { $target = $this->item['checkout_target']; } $item = $this->sanitizeItemForStoring($asset, $editingAsset); // The location id fetched by the csv reader is actually the rtd_location_id. // This will also set location_id, but then that will be overridden by the // checkout method if necessary below. - if (isset($this->item["location_id"])) { + if (isset($this->item['location_id'])) { $item['rtd_location_id'] = $this->item['location_id']; } - if ($editingAsset) { $asset->update($item); } else { @@ -117,16 +113,17 @@ class AssetImporter extends ItemImporter // $asset->unsetEventDispatcher(); if ($asset->save()) { $asset->logCreate('Imported using csv importer'); - $this->log('Asset ' . $this->item["name"] . ' with serial number ' . $this->item['serial'] . ' was created'); + $this->log('Asset '.$this->item['name'].' with serial number '.$this->item['serial'].' was created'); // If we have a target to checkout to, lets do so. //-- user_id is a property of the abstract class Importer, which this class inherits from and it's setted by //-- the class that needs to use it (command importer or GUI importer inside the project). - if(isset($target)) { + if (isset($target)) { $asset->fresh()->checkOut($target, $this->user_id); } + return; } - $this->logError($asset, 'Asset "' . $this->item['name'].'"'); + $this->logError($asset, 'Asset "'.$this->item['name'].'"'); } } diff --git a/app/Importer/ComponentImporter.php b/app/Importer/ComponentImporter.php index a12828f5d5..de3ee14d1c 100644 --- a/app/Importer/ComponentImporter.php +++ b/app/Importer/ComponentImporter.php @@ -27,30 +27,32 @@ class ComponentImporter extends ItemImporter public function createComponentIfNotExists() { $component = null; - $this->log("Creating Component"); + $this->log('Creating Component'); $component = Component::where('name', $this->item['name']) ->where('serial', $this->item['serial']) ->first(); if ($component) { - $this->log('A matching Component ' . $this->item["name"] . ' with serial ' .$this->item['serial'].' already exists. '); - if (!$this->updating) { - $this->log("Skipping Component"); + $this->log('A matching Component '.$this->item['name'].' with serial '.$this->item['serial'].' already exists. '); + if (! $this->updating) { + $this->log('Skipping Component'); + return; } - $this->log("Updating Component"); + $this->log('Updating Component'); $component->update($this->sanitizeItemForUpdating($component)); $component->save(); + return; } - $this->log("No matching component, creating one"); + $this->log('No matching component, creating one'); $component = new Component; $component->fill($this->sanitizeItemForStoring($component)); //FIXME: this disables model validation. Need to find a way to avoid double-logs without breaking everything. $component->unsetEventDispatcher(); if ($component->save()) { $component->logCreate('Imported using CSV Importer'); - $this->log("Component " . $this->item["name"] . ' was created'); + $this->log('Component '.$this->item['name'].' was created'); // If we have an asset tag, checkout to that asset. if (isset($this->item['asset_tag']) && ($asset = Asset::where('asset_tag', $this->item['asset_tag'])->first())) { @@ -59,9 +61,10 @@ class ComponentImporter extends ItemImporter 'user_id' => $this->user_id, 'created_at' => date('Y-m-d H:i:s'), 'assigned_qty' => 1, // Only assign the first one to the asset - 'asset_id' => $asset->id + 'asset_id' => $asset->id, ]); } + return; } $this->logError($component, 'Component'); diff --git a/app/Importer/ConsumableImporter.php b/app/Importer/ConsumableImporter.php index e7972bb2cd..cc24daa930 100644 --- a/app/Importer/ConsumableImporter.php +++ b/app/Importer/ConsumableImporter.php @@ -28,28 +28,30 @@ class ConsumableImporter extends ItemImporter { $consumable = Consumable::where('name', $this->item['name'])->first(); if ($consumable) { - if (!$this->updating) { - $this->log('A matching Consumable ' . $this->item["name"] . ' already exists. '); + if (! $this->updating) { + $this->log('A matching Consumable '.$this->item['name'].' already exists. '); + return; } $this->log('Updating Consumable'); $consumable->update($this->sanitizeItemForUpdating($consumable)); $consumable->save(); + return; } - $this->log("No matching consumable, creating one"); + $this->log('No matching consumable, creating one'); $consumable = new Consumable(); - $this->item['model_number'] = $this->findCsvMatch($row, "model_number");; - $this->item['item_no'] = $this->findCsvMatch($row, "item_number"); + $this->item['model_number'] = $this->findCsvMatch($row, 'model_number'); + $this->item['item_no'] = $this->findCsvMatch($row, 'item_number'); $consumable->fill($this->sanitizeItemForStoring($consumable)); //FIXME: this disables model validation. Need to find a way to avoid double-logs without breaking everything. $consumable->unsetEventDispatcher(); if ($consumable->save()) { $consumable->logCreate('Imported using CSV Importer'); - $this->log("Consumable " . $this->item["name"] . ' was created'); + $this->log('Consumable '.$this->item['name'].' was created'); + return; } $this->logError($consumable, 'Consumable'); - return; } } diff --git a/app/Importer/Importer.php b/app/Importer/Importer.php index 6466c3b2d1..f80b869d54 100644 --- a/app/Importer/Importer.php +++ b/app/Importer/Importer.php @@ -1,13 +1,14 @@ 'checkout location', 'company' => 'company', 'item_name' => 'item name', - 'item_number' => "item number", + 'item_number' => 'item number', 'image' => 'image', 'expiration_date' => 'expiration date', 'location' => 'location', 'notes' => 'notes', 'license_email' => 'licensed to email', - 'license_name' => "licensed to name", + 'license_name' => 'licensed to name', 'maintained' => 'maintained', 'manufacturer' => 'manufacturer', - 'asset_model' => "model name", + 'asset_model' => 'model name', 'model_number' => 'model number', 'order_number' => 'order number', 'purchase_cost' => 'purchase cost', @@ -106,8 +107,8 @@ abstract class Importer public function __construct($file) { $this->fieldMap = $this->defaultFieldMap; - if (! ini_get("auto_detect_line_endings")) { - ini_set("auto_detect_line_endings", '1'); + if (! ini_get('auto_detect_line_endings')) { + ini_set('auto_detect_line_endings', '1'); } // By default the importer passes a url to the file. // However, for testing we also support passing a string directly @@ -116,8 +117,9 @@ abstract class Importer } else { $this->csv = Reader::createFromString($file); } - $this->tempPassword = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 20); + $this->tempPassword = substr(str_shuffle('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'), 0, 20); } + // Cached Values for import lookups protected $customFields; @@ -138,7 +140,7 @@ abstract class Importer DB::transaction(function () use (&$results) { Model::unguard(); - $resultsCount = sizeof($results); + $resultsCount = count($results); foreach ($results as $row) { $this->handle($row); if ($this->progressCallback) { @@ -150,7 +152,6 @@ abstract class Importer }); } - abstract protected function handle($row); /** @@ -166,6 +167,7 @@ abstract class Importer // This 'inverts' the fields such that we have a collection of fields indexed by name. $this->customFields = CustomField::All()->reduce(function ($nameLookup, $field) { $nameLookup[$field['name']] = $field; + return $nameLookup; }); // Remove any custom fields that do not exist in the header row. This prevents nulling out values that shouldn't exist. @@ -177,8 +179,8 @@ abstract class Importer array_change_key_case(array_flip($headerRow)) ); } - } + /** * Check to see if the given key exists in the array, and trim excess white space before returning it * @@ -191,13 +193,12 @@ abstract class Importer */ public function findCsvMatch(array $array, $key, $default = null) { - $val = $default; $key = $this->lookupCustomKey($key); // $this->log("Custom Key: ${key}"); if (array_key_exists($key, $array)) { - $val = Encoding::toUTF8(trim($array[ $key ])); + $val = Encoding::toUTF8(trim($array[$key])); } // $this->log("${key}: ${val}"); return $val; @@ -222,7 +223,7 @@ abstract class Importer /** * Used to lowercase header values to ensure we're comparing values properly. - * + * * @param $results * @return array */ @@ -232,8 +233,10 @@ abstract class Importer foreach ($results as $index => $arrayToNormalize) { $newArray[$index] = array_change_key_case($arrayToNormalize); } + return $newArray; } + /** * Figure out the fieldname of the custom field * @@ -245,6 +248,7 @@ abstract class Importer public function array_smart_custom_field_fetch(array $array, $key) { $index_name = strtolower($key->name); + return array_key_exists($index_name, $array) ? trim($array[$index_name]) : false; } @@ -277,34 +281,36 @@ abstract class Importer protected function createOrFetchUser($row) { $user_array = [ - 'full_name' => $this->findCsvMatch($row, "full_name"), - 'email' => $this->findCsvMatch($row, "email"), + 'full_name' => $this->findCsvMatch($row, 'full_name'), + 'email' => $this->findCsvMatch($row, 'email'), 'manager_id'=> '', 'department_id' => '', - 'username' => $this->findCsvMatch($row, "username"), + 'username' => $this->findCsvMatch($row, 'username'), 'activated' => $this->fetchHumanBoolean($this->findCsvMatch($row, 'activated')), ]; // Maybe we're lucky and the user already exists. - if($user = User::where('username', $user_array['username'])->first()) { + if ($user = User::where('username', $user_array['username'])->first()) { $this->log('User '.$user_array['username'].' already exists'); + return $user; } // If the full name is empty, bail out--we need this to extract first name (at the very least) - if(empty($user_array['full_name'])) { + if (empty($user_array['full_name'])) { $this->log('Insufficient user data provided (Full name is required)- skipping user creation, just adding asset'); + return false; } // Is the user actually an ID? - if($user = $this->findUserByNumber($user_array['full_name'])) { + if ($user = $this->findUserByNumber($user_array['full_name'])) { return $user; } $this->log('User does not appear to be an id with number: '.$user_array['full_name'].'. Continuing through our processes'); // Populate email if it does not exist. - if(empty($user_array['email'])) { + if (empty($user_array['email'])) { $user_array['email'] = User::generateEmailFromFullName($user_array['full_name']); } @@ -314,7 +320,7 @@ abstract class Importer if (empty($user_array['username'])) { $user_array['username'] = $user_formatted_array['username']; - if ($this->usernameFormat =='email') { + if ($this->usernameFormat == 'email') { $user_array['username'] = $user_array['email']; } } @@ -323,32 +329,35 @@ abstract class Importer // Check for a matching user after trying to guess username. if ($user = User::where('username', $user_array['username'])->first()) { $this->log('User '.$user_array['username'].' already exists'); + return $user; } // If at this point we have not found a username or first name, bail out in shame. - if(empty($user_array['username']) || empty($user_array['first_name'])) { + if (empty($user_array['username']) || empty($user_array['first_name'])) { return false; } // No Luck, let's create one. $user = new User; - $user->first_name = $user_array['first_name']; - $user->last_name = $user_array['last_name']; - $user->username = $user_array['username']; - $user->email = $user_array['email']; - $user->manager_id = $user_array['manager_id'] ?? null; + $user->first_name = $user_array['first_name']; + $user->last_name = $user_array['last_name']; + $user->username = $user_array['username']; + $user->email = $user_array['email']; + $user->manager_id = $user_array['manager_id'] ?? null; $user->department_id = $user_array['department_id'] ?? null; - $user->activated = 1; - $user->password = $this->tempPassword; + $user->activated = 1; + $user->password = $this->tempPassword; \Log::debug('Creating a user with the following attributes: '.print_r($user_array, true)); if ($user->save()) { $this->log('User '.$user_array['username'].' created'); + return $user; } - $this->logError($user, 'User "' . $user_array['username'] . '" was not able to be created.'); + $this->logError($user, 'User "'.$user_array['username'].'" was not able to be created.'); + return false; } @@ -362,6 +371,7 @@ abstract class Importer // A number was given instead of a name if (is_numeric($user_name)) { $this->log('User '.$user_name.' is a number - lets see if it matches a user id'); + return User::find($user_name); } } @@ -442,6 +452,7 @@ abstract class Importer return $this; } + /** * Sets the value of usernameFormat. * @@ -458,7 +469,7 @@ abstract class Importer public function fetchHumanBoolean($value) { - return (int) filter_var($value, FILTER_VALIDATE_BOOLEAN); + return (int) filter_var($value, FILTER_VALIDATE_BOOLEAN); } /** @@ -471,11 +482,12 @@ abstract class Importer */ public function createOrFetchDepartment($user_department_name) { - if ($user_department_name!='') { + if ($user_department_name != '') { $department = Department::where('name', '=', $user_department_name)->first(); if ($department) { - $this->log('A matching Department ' . $user_department_name . ' already exists'); + $this->log('A matching Department '.$user_department_name.' already exists'); + return $department->id; } @@ -483,7 +495,8 @@ abstract class Importer $department->name = $user_department_name; if ($department->save()) { - $this->log('Department ' . $user_department_name . ' was created'); + $this->log('Department '.$user_department_name.' was created'); + return $department->id; } $this->logError($department, 'Department'); @@ -505,10 +518,12 @@ abstract class Importer $manager = User::where('first_name', '=', $user_manager_first_name) ->where('last_name', '=', $user_manager_last_name)->first(); if ($manager) { - $this->log('A matching Manager ' . $user_manager_first_name . ' '. $user_manager_last_name . ' already exists'); + $this->log('A matching Manager '.$user_manager_first_name.' '.$user_manager_last_name.' already exists'); + return $manager->id; } - $this->log('No matching Manager ' . $user_manager_first_name . ' '. $user_manager_last_name . ' found. If their user account is being created through this import, you should re-process this file again. '); + $this->log('No matching Manager '.$user_manager_first_name.' '.$user_manager_last_name.' found. If their user account is being created through this import, you should re-process this file again. '); + return null; } } diff --git a/app/Importer/ItemImporter.php b/app/Importer/ItemImporter.php index b68d9d5e8c..1584539ee2 100644 --- a/app/Importer/ItemImporter.php +++ b/app/Importer/ItemImporter.php @@ -14,6 +14,7 @@ use App\Models\User; class ItemImporter extends Importer { protected $item; + public function __construct($filename) { parent::__construct($filename); @@ -24,67 +25,67 @@ class ItemImporter extends Importer // Need to reset this between iterations or we'll have stale data. $this->item = []; - $item_category = $this->findCsvMatch($row, "category"); + $item_category = $this->findCsvMatch($row, 'category'); if ($this->shouldUpdateField($item_category)) { - $this->item["category_id"] = $this->createOrFetchCategory($item_category); + $this->item['category_id'] = $this->createOrFetchCategory($item_category); } - $item_company_name = $this->findCsvMatch($row, "company"); + $item_company_name = $this->findCsvMatch($row, 'company'); if ($this->shouldUpdateField($item_company_name)) { - $this->item["company_id"] = $this->createOrFetchCompany($item_company_name); + $this->item['company_id'] = $this->createOrFetchCompany($item_company_name); } - $item_location = $this->findCsvMatch($row, "location"); + $item_location = $this->findCsvMatch($row, 'location'); if ($this->shouldUpdateField($item_location)) { - $this->item["location_id"] = $this->createOrFetchLocation($item_location); + $this->item['location_id'] = $this->createOrFetchLocation($item_location); } - $item_manufacturer = $this->findCsvMatch($row, "manufacturer"); + $item_manufacturer = $this->findCsvMatch($row, 'manufacturer'); if ($this->shouldUpdateField($item_manufacturer)) { - $this->item["manufacturer_id"] = $this->createOrFetchManufacturer($item_manufacturer); + $this->item['manufacturer_id'] = $this->createOrFetchManufacturer($item_manufacturer); } - $item_status_name = $this->findCsvMatch($row, "status"); + $item_status_name = $this->findCsvMatch($row, 'status'); if ($this->shouldUpdateField($item_status_name)) { - $this->item["status_id"] = $this->createOrFetchStatusLabel($item_status_name); + $this->item['status_id'] = $this->createOrFetchStatusLabel($item_status_name); } - $item_supplier = $this->findCsvMatch($row, "supplier"); + $item_supplier = $this->findCsvMatch($row, 'supplier'); if ($this->shouldUpdateField($item_supplier)) { $this->item['supplier_id'] = $this->createOrFetchSupplier($item_supplier); } - $item_department = $this->findCsvMatch($row, "department"); + $item_department = $this->findCsvMatch($row, 'department'); if ($this->shouldUpdateField($item_department)) { $this->item['department_id'] = $this->createOrFetchDepartment($item_department); } - $item_manager_first_name = $this->findCsvMatch($row, "manage_first_name"); - $item_manager_last_name = $this->findCsvMatch($row, "manage_last_name"); + $item_manager_first_name = $this->findCsvMatch($row, 'manage_first_name'); + $item_manager_last_name = $this->findCsvMatch($row, 'manage_last_name'); if ($this->shouldUpdateField($item_manager_first_name)) { $this->item['manager_id'] = $this->fetchManager($item_manager_first_name, $item_manager_last_name); } - $this->item["name"] = $this->findCsvMatch($row, "item_name"); - $this->item["notes"] = $this->findCsvMatch($row, "notes"); - $this->item["order_number"] = $this->findCsvMatch($row, "order_number"); - $this->item["purchase_cost"] = $this->findCsvMatch($row, "purchase_cost"); + $this->item['name'] = $this->findCsvMatch($row, 'item_name'); + $this->item['notes'] = $this->findCsvMatch($row, 'notes'); + $this->item['order_number'] = $this->findCsvMatch($row, 'order_number'); + $this->item['purchase_cost'] = $this->findCsvMatch($row, 'purchase_cost'); - $this->item["purchase_date"] = null; - if ($this->findCsvMatch($row, "purchase_date")!='') { - $this->item["purchase_date"] = date("Y-m-d 00:00:01", strtotime($this->findCsvMatch($row, "purchase_date"))); + $this->item['purchase_date'] = null; + if ($this->findCsvMatch($row, 'purchase_date') != '') { + $this->item['purchase_date'] = date('Y-m-d 00:00:01', strtotime($this->findCsvMatch($row, 'purchase_date'))); } - $this->item["qty"] = $this->findCsvMatch($row, "quantity"); - $this->item["requestable"] = $this->findCsvMatch($row, "requestable"); - $this->item["user_id"] = $this->user_id; - $this->item['serial'] = $this->findCsvMatch($row, "serial"); + $this->item['qty'] = $this->findCsvMatch($row, 'quantity'); + $this->item['requestable'] = $this->findCsvMatch($row, 'requestable'); + $this->item['user_id'] = $this->user_id; + $this->item['serial'] = $this->findCsvMatch($row, 'serial'); // NO need to call this method if we're running the user import. // TODO: Merge these methods. - $this->item['checkout_class'] = $this->findCsvMatch($row, "checkout_class"); - if(get_class($this) !== UserImporter::class) { + $this->item['checkout_class'] = $this->findCsvMatch($row, 'checkout_class'); + if (get_class($this) !== UserImporter::class) { // $this->item["user"] = $this->createOrFetchUser($row); - $this->item["checkout_target"] = $this->determineCheckout($row); + $this->item['checkout_target'] = $this->determineCheckout($row); } } @@ -92,20 +93,19 @@ class ItemImporter extends Importer * Parse row to determine what (if anything) we should checkout to. * @param array $row CSV Row being parsed * @return SnipeModel Model to be checked out to - */ + */ protected function determineCheckout($row) { // We only support checkout-to-location for asset, so short circuit otherwise. - if(get_class($this) != AssetImporter::class) { + if (get_class($this) != AssetImporter::class) { return $this->createOrFetchUser($row); } - if ($this->item['checkout_class'] === 'location') { + if (strtolower($this->item['checkout_class']) === 'location') { return Location::findOrFail($this->createOrFetchLocation($this->findCsvMatch($row, 'checkout_location'))); } return $this->createOrFetchUser($row); - } /** @@ -119,7 +119,6 @@ class ItemImporter extends Importer * @param $updating boolean Should we remove blank values? * @return array */ - protected function sanitizeItemForStoring($model, $updating = false) { // Create a collection for all manipulations to come. @@ -138,10 +137,10 @@ class ItemImporter extends Importer } /** - * Convenience function for updating that strips the empty values. + * Convenience function for updating that strips the empty values. * @param $model SnipeModel Model that's being updated. * @return array - */ + */ protected function sanitizeItemForUpdating($model) { return $this->sanitizeItemForStoring($model, true); @@ -156,15 +155,17 @@ class ItemImporter extends Importer * @author Daniel Melzter * @since 4.0 * @param $field string - * @return boolean + * @return bool */ protected function shouldUpdateField($field) { if (empty($field)) { return false; } - return !($this->updating && empty($field)); + + return ! ($this->updating && empty($field)); } + /** * Select the asset model if it exists, otherwise create it. * @@ -177,36 +178,37 @@ class ItemImporter extends Importer */ public function createOrFetchAssetModel(array $row) { - - $asset_model_name = $this->findCsvMatch($row, "asset_model"); - $asset_modelNumber = $this->findCsvMatch($row, "model_number"); + $asset_model_name = $this->findCsvMatch($row, 'asset_model'); + $asset_modelNumber = $this->findCsvMatch($row, 'model_number'); // TODO: At the moment, this means we can't update the model number if the model name stays the same. - if (!$this->shouldUpdateField($asset_model_name)) { + if (! $this->shouldUpdateField($asset_model_name)) { return; } - if ((empty($asset_model_name)) && (!empty($asset_modelNumber))) { + if ((empty($asset_model_name)) && (! empty($asset_modelNumber))) { $asset_model_name = $asset_modelNumber; - } elseif ((empty($asset_model_name)) && (empty($asset_modelNumber))) { - $asset_model_name ='Unknown'; + } elseif ((empty($asset_model_name)) && (empty($asset_modelNumber))) { + $asset_model_name = 'Unknown'; } $editingModel = $this->updating; $asset_model = AssetModel::where(['name' => $asset_model_name, 'model_number' => $asset_modelNumber])->first(); if ($asset_model) { - if (!$this->updating) { - $this->log("A matching model already exists, returning it."); + if (! $this->updating) { + $this->log('A matching model already exists, returning it.'); + return $asset_model->id; } - $this->log("Matching Model found, updating it."); + $this->log('Matching Model found, updating it.'); $item = $this->sanitizeItemForStoring($asset_model, $editingModel); $item['name'] = $asset_model_name; $item['model_number'] = $asset_modelNumber; $asset_model->update($item); $asset_model->save(); - $this->log("Asset Model Updated"); + $this->log('Asset Model Updated'); + return $asset_model->id; } - $this->log("No Matching Model, Creating a new one"); + $this->log('No Matching Model, Creating a new one'); $asset_model = new AssetModel(); $item = $this->sanitizeItemForStoring($asset_model, $editingModel); @@ -217,10 +219,12 @@ class ItemImporter extends Importer $item = null; if ($asset_model->save()) { - $this->log('Asset Model ' . $asset_model_name . ' with model number ' . $asset_modelNumber . ' was created'); + $this->log('Asset Model '.$asset_model_name.' with model number '.$asset_modelNumber.' was created'); + return $asset_model->id; } - $this->logError($asset_model, 'Asset Model "' . $asset_model_name . '"'); + $this->logError($asset_model, 'Asset Model "'.$asset_model_name.'"'); + return null; } @@ -245,7 +249,8 @@ class ItemImporter extends Importer $category = Category::where(['name' => $asset_category, 'category_type' => $item_type])->first(); if ($category) { - $this->log("A matching category: " . $asset_category . " already exists"); + $this->log('A matching category: '.$asset_category.' already exists'); + return $category->id; } @@ -255,11 +260,13 @@ class ItemImporter extends Importer $category->user_id = $this->user_id; if ($category->save()) { - $this->log('Category ' . $asset_category . ' was created'); + $this->log('Category '.$asset_category.' was created'); + return $category->id; } - $this->logError($category, 'Category "'. $asset_category. '"'); + $this->logError($category, 'Category "'.$asset_category.'"'); + return null; } @@ -275,22 +282,23 @@ class ItemImporter extends Importer { $company = Company::where(['name' => $asset_company_name])->first(); if ($company) { - $this->log('A matching Company ' . $asset_company_name . ' already exists'); + $this->log('A matching Company '.$asset_company_name.' already exists'); + return $company->id; } $company = new Company(); $company->name = $asset_company_name; if ($company->save()) { - $this->log('Company ' . $asset_company_name . ' was created'); + $this->log('Company '.$asset_company_name.' was created'); + return $company->id; } $this->logError($company, 'Company'); + return null; } - - /** * Fetch an existing manager * @@ -304,14 +312,15 @@ class ItemImporter extends Importer $manager = User::where('first_name', '=', $user_manager_first_name) ->where('last_name', '=', $user_manager_last_name)->first(); if ($manager) { - $this->log('A matching Manager ' . $user_manager_first_name . ' '. $user_manager_last_name . ' already exists'); + $this->log('A matching Manager '.$user_manager_first_name.' '.$user_manager_last_name.' already exists'); + return $manager->id; } - $this->log('No matching Manager ' . $user_manager_first_name . ' '. $user_manager_last_name . ' found. If their user account is being created through this import, you should re-process this file again. '); + $this->log('No matching Manager '.$user_manager_first_name.' '.$user_manager_last_name.' found. If their user account is being created through this import, you should re-process this file again. '); + return null; } - /** * Fetch the existing status label or create new if it doesn't exist. * @@ -322,17 +331,17 @@ class ItemImporter extends Importer */ public function createOrFetchStatusLabel($asset_statuslabel_name) { - if (empty($asset_statuslabel_name)) { return null; } $status = Statuslabel::where(['name' => $asset_statuslabel_name])->first(); if ($status) { - $this->log('A matching Status ' . $asset_statuslabel_name . ' already exists'); + $this->log('A matching Status '.$asset_statuslabel_name.' already exists'); + return $status->id; } - $this->log("Creating a new status"); + $this->log('Creating a new status'); $status = new Statuslabel(); $status->name = $asset_statuslabel_name; @@ -341,11 +350,13 @@ class ItemImporter extends Importer $status->archived = 0; if ($status->save()) { - $this->log('Status ' . $asset_statuslabel_name . ' was created'); + $this->log('Status '.$asset_statuslabel_name.' was created'); + return $status->id; } - $this->logError($status, 'Status "'. $asset_statuslabel_name . '"'); + $this->logError($status, 'Status "'.$asset_statuslabel_name.'"'); + return null; } @@ -357,17 +368,16 @@ class ItemImporter extends Importer * @param $item_manufacturer string * @return Manufacturer */ - public function createOrFetchManufacturer($item_manufacturer) { - if (empty($item_manufacturer)) { - $item_manufacturer='Unknown'; + $item_manufacturer = 'Unknown'; } $manufacturer = Manufacturer::where(['name'=> $item_manufacturer])->first(); if ($manufacturer) { - $this->log('Manufacturer ' . $item_manufacturer . ' already exists') ; + $this->log('Manufacturer '.$item_manufacturer.' already exists'); + return $manufacturer->id; } @@ -377,10 +387,12 @@ class ItemImporter extends Importer $manufacturer->user_id = $this->user_id; if ($manufacturer->save()) { - $this->log('Manufacturer ' . $manufacturer->name . ' was created'); + $this->log('Manufacturer '.$manufacturer->name.' was created'); + return $manufacturer->id; } - $this->logError($manufacturer, 'Manufacturer "'. $manufacturer->name . '"'); + $this->logError($manufacturer, 'Manufacturer "'.$manufacturer->name.'"'); + return null; } @@ -396,12 +408,14 @@ class ItemImporter extends Importer { if (empty($asset_location)) { $this->log('No location given, so none created.'); + return null; } $location = Location::where(['name' => $asset_location])->first(); if ($location) { - $this->log('Location ' . $asset_location . ' already exists'); + $this->log('Location '.$asset_location.' already exists'); + return $location->id; } // No matching locations in the collection, create a new one. @@ -414,10 +428,12 @@ class ItemImporter extends Importer $location->user_id = $this->user_id; if ($location->save()) { - $this->log('Location ' . $asset_location . ' was created'); + $this->log('Location '.$asset_location.' was created'); + return $location->id; } $this->logError($location, 'Location'); + return null; } @@ -432,13 +448,14 @@ class ItemImporter extends Importer public function createOrFetchSupplier($item_supplier) { if (empty($item_supplier)) { - $item_supplier='Unknown'; + $item_supplier = 'Unknown'; } - $supplier = Supplier::where(['name' => $item_supplier ])->first(); + $supplier = Supplier::where(['name' => $item_supplier])->first(); if ($supplier) { - $this->log('Supplier ' . $item_supplier . ' already exists'); + $this->log('Supplier '.$item_supplier.' already exists'); + return $supplier->id; } @@ -447,10 +464,12 @@ class ItemImporter extends Importer $supplier->user_id = $this->user_id; if ($supplier->save()) { - $this->log('Supplier ' . $item_supplier . ' was created'); + $this->log('Supplier '.$item_supplier.' was created'); + return $supplier->id; } $this->logError($supplier, 'Supplier'); + return null; } } diff --git a/app/Importer/LicenseImporter.php b/app/Importer/LicenseImporter.php index f9bc1d825b..627e6ae5f1 100644 --- a/app/Importer/LicenseImporter.php +++ b/app/Importer/LicenseImporter.php @@ -35,21 +35,22 @@ class LicenseImporter extends ItemImporter ->where('serial', $this->item['serial']) ->first(); if ($license) { - if (!$this->updating) { - $this->log('A matching License ' . $this->item['name'] . 'with serial ' . $this->item['serial'] . ' already exists'); + if (! $this->updating) { + $this->log('A matching License '.$this->item['name'].'with serial '.$this->item['serial'].' already exists'); + return; } - $this->log("Updating License"); + $this->log('Updating License'); $editingLicense = true; } else { - $this->log("No Matching License, Creating a new one"); + $this->log('No Matching License, Creating a new one'); $license = new License; } $asset_tag = $this->item['asset_tag'] = $this->findCsvMatch($row, 'asset_tag'); // used for checkout out to an asset. $this->item['expiration_date'] = $this->findCsvMatch($row, 'expiration_date'); - $this->item['license_email'] = $this->findCsvMatch($row, "license_email"); - $this->item['license_name'] = $this->findCsvMatch($row, "license_name"); + $this->item['license_email'] = $this->findCsvMatch($row, 'license_email'); + $this->item['license_name'] = $this->findCsvMatch($row, 'license_name'); $this->item['maintained'] = $this->findCsvMatch($row, 'maintained'); $this->item['purchase_order'] = $this->findCsvMatch($row, 'purchase_order'); $this->item['reassignable'] = $this->findCsvMatch($row, 'reassignable'); @@ -65,7 +66,7 @@ class LicenseImporter extends ItemImporter // $license->unsetEventDispatcher(); if ($license->save()) { $license->logCreate('Imported using csv importer'); - $this->log('License ' . $this->item["name"] . ' with serial number ' . $this->item['serial'] . ' was created'); + $this->log('License '.$this->item['name'].' with serial number '.$this->item['serial'].' was created'); // Lets try to checkout seats if the fields exist and we have seats. if ($license->seats > 0) { @@ -85,8 +86,9 @@ class LicenseImporter extends ItemImporter $targetLicense->save(); } } + return; } - $this->logError($license, 'License "' . $this->item['name'].'"'); + $this->logError($license, 'License "'.$this->item['name'].'"'); } } diff --git a/app/Importer/UserImporter.php b/app/Importer/UserImporter.php index be476aef97..136b9bfe9e 100644 --- a/app/Importer/UserImporter.php +++ b/app/Importer/UserImporter.php @@ -12,8 +12,6 @@ use App\Notifications\WelcomeNotification; * App\Importer.php. [ALG] * * Class UserImporter - * @package App\Importer - * */ class UserImporter extends ItemImporter { @@ -52,20 +50,21 @@ class UserImporter extends ItemImporter $this->item['city'] = $this->findCsvMatch($row, 'city'); $this->item['state'] = $this->findCsvMatch($row, 'state'); $this->item['country'] = $this->findCsvMatch($row, 'country'); - $this->item['activated'] = ($this->fetchHumanBoolean($this->findCsvMatch($row, 'activated')) == 1) ? '1' : 0; + $this->item['activated'] = ($this->fetchHumanBoolean($this->findCsvMatch($row, 'activated')) == 1) ? '1' : 0; $this->item['employee_num'] = $this->findCsvMatch($row, 'employee_num'); $this->item['department_id'] = $this->createOrFetchDepartment($this->findCsvMatch($row, 'department')); $this->item['manager_id'] = $this->fetchManager($this->findCsvMatch($row, 'manager_first_name'), $this->findCsvMatch($row, 'manager_last_name')); $user_department = $this->findCsvMatch($row, 'department'); if ($this->shouldUpdateField($user_department)) { - $this->item["department_id"] = $this->createOrFetchDepartment($user_department); + $this->item['department_id'] = $this->createOrFetchDepartment($user_department); } $user = User::where('username', $this->item['username'])->first(); if ($user) { - if (!$this->updating) { - $this->log('A matching User ' . $this->item["name"] . ' already exists. '); - \Log::debug('A matching User ' . $this->item["name"] . ' already exists. '); + if (! $this->updating) { + $this->log('A matching User '.$this->item['name'].' already exists. '); + \Log::debug('A matching User '.$this->item['name'].' already exists. '); + return; } $this->log('Updating User'); @@ -76,20 +75,19 @@ class UserImporter extends ItemImporter } - // This needs to be applied after the update logic, otherwise we'll overwrite user passwords // Issue #5408 $this->item['password'] = bcrypt($this->tempPassword); - $this->log("No matching user, creating one"); + $this->log('No matching user, creating one'); $user = new User(); $user->fill($this->sanitizeItemForStoring($user)); if ($user->save()) { // $user->logCreate('Imported using CSV Importer'); - $this->log("User " . $this->item["name"] . ' was created'); + $this->log('User '.$this->item['name'].' was created'); - if(($user->email) && ($user->activated=='1')) { + if (($user->email) && ($user->activated == '1')) { $data = [ 'email' => $user->email, 'username' => $user->username, @@ -104,6 +102,7 @@ class UserImporter extends ItemImporter } $user = null; $this->item = null; + return; } @@ -111,7 +110,7 @@ class UserImporter extends ItemImporter return; } - /** + /** * Fetch an existing department, or create new if it doesn't exist * * @author Daniel Melzter @@ -121,12 +120,15 @@ class UserImporter extends ItemImporter */ public function createOrFetchDepartment($department_name) { + if (is_null($department_name) || $department_name == ''){ + return null; + } + + $department = Department::where(['name' => $department_name])->first(); if ($department) { $this->log('A matching department ' . $department_name . ' already exists'); return $department->id; - } else { - return null; } $department = new department(); @@ -141,8 +143,10 @@ class UserImporter extends ItemImporter $this->logError($department, 'Department'); return null; } + - public function sendWelcome($send = true) { + public function sendWelcome($send = true) + { $this->send_welcome = $send; } } diff --git a/app/Listeners/CheckoutableListener.php b/app/Listeners/CheckoutableListener.php index ce38d7253c..c8acd65f11 100644 --- a/app/Listeners/CheckoutableListener.php +++ b/app/Listeners/CheckoutableListener.php @@ -23,15 +23,15 @@ use Illuminate\Support\Facades\Notification; class CheckoutableListener { - /** * Notify the user about the checked out checkoutable */ - public function onCheckedOut($event) { + public function onCheckedOut($event) + { /** * When the item wasn't checked out to a user, we can't send notifications */ - if(! $event->checkedOutTo instanceof User) { + if (! $event->checkedOutTo instanceof User) { return; } @@ -40,7 +40,7 @@ class CheckoutableListener */ $acceptance = $this->getCheckoutAcceptance($event); - if(!$event->checkedOutTo->locale){ + if (! $event->checkedOutTo->locale) { Notification::locale(Setting::getSettings()->locale)->send( $this->getNotifiables($event), $this->getCheckoutNotification($event, $acceptance) @@ -56,35 +56,43 @@ class CheckoutableListener /** * Notify the user about the checked in checkoutable */ - public function onCheckedIn($event) { - + public function onCheckedIn($event) + { \Log::debug('checkin fired'); /** * When the item wasn't checked out to a user, we can't send notifications */ - if(!$event->checkedOutTo instanceof User) { + if (! $event->checkedOutTo instanceof User) { \Log::debug('checked out to not a user'); + return; } /** * Send the appropriate notification */ + $acceptances = CheckoutAcceptance::where('checkoutable_id', $event->checkoutable->id) + ->where('assigned_to_id', $event->checkedOutTo->id) + ->get(); - + foreach($acceptances as $acceptance){ + if($acceptance->isPending()){ + $acceptance->delete(); + } + } \Log::debug('checked out to a user'); - if(!$event->checkedOutTo->locale){ + if (! $event->checkedOutTo->locale) { \Log::debug('Use default settings locale'); Notification::locale(Setting::getSettings()->locale)->send( - $this->getNotifiables($event), + $this->getNotifiables($event), $this->getCheckinNotification($event) ); } else { \Log::debug('Use user locale? I do not think this works as expected yet'); // \Log::debug(print_r($this->getNotifiables($event), true)); Notification::send( - $this->getNotifiables($event), + $this->getNotifiables($event), $this->getCheckinNotification($event) ); } @@ -95,8 +103,9 @@ class CheckoutableListener * @param Event $event * @return mixed */ - private function getCheckoutAcceptance($event) { - if (!$event->checkoutable->requireAcceptance()) { + private function getCheckoutAcceptance($event) + { + if (! $event->checkoutable->requireAcceptance()) { return null; } @@ -114,7 +123,8 @@ class CheckoutableListener * @param Event $event * @return Collection */ - private function getNotifiables($event) { + private function getNotifiables($event) + { $notifiables = collect(); /** @@ -138,7 +148,8 @@ class CheckoutableListener * @param CheckoutableCheckedIn $event * @return Notification */ - private function getCheckinNotification($event) { + private function getCheckinNotification($event) + { // $model = get_class($event->checkoutable); @@ -159,6 +170,7 @@ class CheckoutableListener } \Log::debug('Notification class: '.$notificationClass); + return new $notificationClass($event->checkoutable, $event->checkedOutTo, $event->checkedInBy, $event->note); } @@ -169,7 +181,8 @@ class CheckoutableListener * @param CheckoutAcceptance $acceptance * @return Notification */ - private function getCheckoutNotification($event, $acceptance) { + private function getCheckoutNotification($event, $acceptance) + { $notificationClass = null; switch (get_class($event->checkoutable)) { @@ -198,14 +211,13 @@ class CheckoutableListener public function subscribe($events) { $events->listen( - 'App\Events\CheckoutableCheckedIn', + \App\Events\CheckoutableCheckedIn::class, 'App\Listeners\CheckoutableListener@onCheckedIn' ); $events->listen( - 'App\Events\CheckoutableCheckedOut', + \App\Events\CheckoutableCheckedOut::class, 'App\Listeners\CheckoutableListener@onCheckedOut' ); } - -} \ No newline at end of file +} diff --git a/app/Listeners/LogFailedLogin.php b/app/Listeners/LogFailedLogin.php index 663b4559c1..9ce326219d 100644 --- a/app/Listeners/LogFailedLogin.php +++ b/app/Listeners/LogFailedLogin.php @@ -40,6 +40,5 @@ class LogFailedLogin } catch (\Exception $e) { \Log::debug($e); } - } } diff --git a/app/Listeners/LogListener.php b/app/Listeners/LogListener.php index 5e9445183f..f337df60f5 100644 --- a/app/Listeners/LogListener.php +++ b/app/Listeners/LogListener.php @@ -22,16 +22,18 @@ use App\Models\LicenseSeat; class LogListener { - - public function onCheckoutableCheckedIn(CheckoutableCheckedIn $event) { + public function onCheckoutableCheckedIn(CheckoutableCheckedIn $event) + { $event->checkoutable->logCheckin($event->checkedOutTo, $event->note, $event->action_date); } - public function onCheckoutableCheckedOut(CheckoutableCheckedOut $event) { + public function onCheckoutableCheckedOut(CheckoutableCheckedOut $event) + { $event->checkoutable->logCheckout($event->note, $event->checkedOutTo, $event->checkoutable->last_checkout); - } + } - public function onCheckoutAccepted(CheckoutAccepted $event) { + public function onCheckoutAccepted(CheckoutAccepted $event) + { $logaction = new Actionlog(); $logaction->item()->associate($event->acceptance->checkoutable); @@ -40,14 +42,15 @@ class LogListener $logaction->action_type = 'accepted'; // TODO: log the actual license seat that was checked out - if($event->acceptance->checkoutable instanceof LicenseSeat) { + if ($event->acceptance->checkoutable instanceof LicenseSeat) { $logaction->item()->associate($event->acceptance->checkoutable->license); } - - $logaction->save(); - } - public function onCheckoutDeclined(CheckoutDeclined $event) { + $logaction->save(); + } + + public function onCheckoutDeclined(CheckoutDeclined $event) + { $logaction = new Actionlog(); $logaction->item()->associate($event->acceptance->checkoutable); $logaction->target()->associate($event->acceptance->assignedTo); @@ -55,12 +58,12 @@ class LogListener $logaction->action_type = 'declined'; // TODO: log the actual license seat that was checked out - if($event->acceptance->checkoutable instanceof LicenseSeat) { + if ($event->acceptance->checkoutable instanceof LicenseSeat) { $logaction->item()->associate($event->acceptance->checkoutable->license); } - $logaction->save(); - } + $logaction->save(); + } /** * Register the listeners for the subscriber. @@ -73,15 +76,14 @@ class LogListener 'CheckoutableCheckedIn', 'CheckoutableCheckedOut', 'CheckoutAccepted', - 'CheckoutDeclined', + 'CheckoutDeclined', ]; - foreach($list as $event) { + foreach ($list as $event) { $events->listen( - 'App\Events\\' . $event, - 'App\Listeners\LogListener@on' . $event + 'App\Events\\'.$event, + 'App\Listeners\LogListener@on'.$event ); - } + } } - } diff --git a/app/Listeners/LogSuccessfulLogin.php b/app/Listeners/LogSuccessfulLogin.php index 0fab5d00f6..3bfb3b6ffe 100644 --- a/app/Listeners/LogSuccessfulLogin.php +++ b/app/Listeners/LogSuccessfulLogin.php @@ -29,7 +29,6 @@ class LogSuccessfulLogin $now = new Carbon(); try { - DB::table('login_attempts')->insert( [ 'username' => $event->user->username, @@ -42,7 +41,5 @@ class LogSuccessfulLogin } catch (\Exception $e) { \Log::debug($e); } - - } } diff --git a/app/Models/Accessory.php b/app/Models/Accessory.php index fbd611939d..bbb0917e5d 100755 --- a/app/Models/Accessory.php +++ b/app/Models/Accessory.php @@ -1,9 +1,11 @@ 'boolean' - ]; + 'purchase_date' => 'datetime', + 'requestable' => 'boolean', ]; use Searchable; - use Acceptable; /** @@ -47,28 +49,27 @@ class Accessory extends SnipeModel 'company' => ['name'], 'manufacturer' => ['name'], 'supplier' => ['name'], - 'location' => ['name'] + 'location' => ['name'], ]; /** * Accessory validation rules */ - public $rules = array( + public $rules = [ 'name' => 'required|min:3|max:255', 'qty' => 'required|integer|min:1', 'category_id' => 'required|integer|exists:categories,id', 'company_id' => 'integer|nullable', 'min_amt' => 'integer|min:0|nullable', 'purchase_cost' => 'numeric|nullable', - ); - + ]; /** * Whether the model should inject it's identifier to the unique * validation rules before attempting validation. If this property * is not set in the model it will default to true. * - * @var boolean + * @var bool */ protected $injectUniqueIdentifier = true; use ValidatingTrait; @@ -91,7 +92,8 @@ class Accessory extends SnipeModel 'supplier_id', 'image', 'qty', - 'requestable' + 'min_amt', + 'requestable', ]; @@ -105,10 +107,9 @@ class Accessory extends SnipeModel */ public function supplier() { - return $this->belongsTo('\App\Models\Supplier', 'supplier_id'); + return $this->belongsTo(\App\Models\Supplier::class, 'supplier_id'); } - /** * Sets the requestable attribute on the accessory * @@ -122,7 +123,6 @@ class Accessory extends SnipeModel $value = null; } $this->attributes['requestable'] = filter_var($value, FILTER_VALIDATE_BOOLEAN); - return; } /** @@ -134,7 +134,7 @@ class Accessory extends SnipeModel */ public function company() { - return $this->belongsTo('\App\Models\Company', 'company_id'); + return $this->belongsTo(\App\Models\Company::class, 'company_id'); } /** @@ -146,7 +146,7 @@ class Accessory extends SnipeModel */ public function location() { - return $this->belongsTo('\App\Models\Location', 'location_id'); + return $this->belongsTo(\App\Models\Location::class, 'location_id'); } /** @@ -158,7 +158,7 @@ class Accessory extends SnipeModel */ public function category() { - return $this->belongsTo('\App\Models\Category', 'category_id')->where('category_type', '=', 'accessory'); + return $this->belongsTo(\App\Models\Category::class, 'category_id')->where('category_type', '=', 'accessory'); } /** @@ -170,7 +170,7 @@ class Accessory extends SnipeModel */ public function assetlog() { - return $this->hasMany('\App\Models\Actionlog', 'item_id')->where('item_type', Accessory::class)->orderBy('created_at', 'desc')->withTrashed(); + return $this->hasMany(\App\Models\Actionlog::class, 'item_id')->where('item_type', self::class)->orderBy('created_at', 'desc')->withTrashed(); } /** @@ -198,11 +198,10 @@ class Accessory extends SnipeModel * @since v5.0.0 * * @see \App\Http\Controllers\Api\AccessoriesController\checkedout() - * */ public function lastCheckout() { - return $this->assetlog()->where('action_type','=','checkout')->take(1); + return $this->assetlog()->where('action_type', '=', 'checkout')->take(1); } @@ -216,12 +215,13 @@ class Accessory extends SnipeModel * @since [v3.0] * @return string */ - public function getImageUrl() { + public function getImageUrl() + { if ($this->image) { return Storage::disk('public')->url(app('accessories_upload_path').$this->image); } - return false; + return false; } /** @@ -231,10 +231,9 @@ class Accessory extends SnipeModel * @since [v3.0] * @return \Illuminate\Database\Eloquent\Relations\Relation */ - public function users() { - return $this->belongsToMany('\App\Models\User', 'accessories_users', 'accessory_id', 'assigned_to')->withPivot('id', 'created_at', 'note')->withTrashed(); + return $this->belongsToMany(\App\Models\User::class, 'accessories_users', 'accessory_id', 'assigned_to')->withPivot('id', 'created_at', 'note')->withTrashed(); } /** @@ -246,7 +245,7 @@ class Accessory extends SnipeModel */ public function hasUsers() { - return $this->belongsToMany('\App\Models\User', 'accessories_users', 'accessory_id', 'assigned_to')->count(); + return $this->belongsToMany(\App\Models\User::class, 'accessories_users', 'accessory_id', 'assigned_to')->count(); } /** @@ -258,7 +257,7 @@ class Accessory extends SnipeModel */ public function manufacturer() { - return $this->belongsTo('\App\Models\Manufacturer', 'manufacturer_id'); + return $this->belongsTo(\App\Models\Manufacturer::class, 'manufacturer_id'); } /** @@ -267,7 +266,7 @@ class Accessory extends SnipeModel * * @author [A. Gianotto] [] * @since [v3.0] - * @return boolean + * @return bool */ public function checkin_email() { @@ -280,7 +279,7 @@ class Accessory extends SnipeModel * * @author [A. Gianotto] [] * @since [v3.0] - * @return boolean + * @return bool */ public function requireAcceptance() { @@ -297,14 +296,14 @@ class Accessory extends SnipeModel */ public function getEula() { - $Parsedown = new \Parsedown(); if ($this->category->eula_text) { return $Parsedown->text(e($this->category->eula_text)); - } elseif ((Setting::getSettings()->default_eula_text) && ($this->category->use_default_eula=='1')) { + } elseif ((Setting::getSettings()->default_eula_text) && ($this->category->use_default_eula == '1')) { return $Parsedown->text(e(Setting::getSettings()->default_eula_text)); } + return null; } @@ -320,6 +319,7 @@ class Accessory extends SnipeModel $checkedout = $this->users->count(); $total = $this->qty; $remaining = $total - $checkedout; + return $remaining; } @@ -377,4 +377,17 @@ class Accessory extends SnipeModel { return $query->leftJoin('manufacturers', 'accessories.manufacturer_id', '=', 'manufacturers.id')->orderBy('manufacturers.name', $order); } + + /** + * Query builder scope to order on supplier + * + * @param \Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return \Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeOrderSupplier($query, $order) + { + return $query->leftJoin('suppliers', 'accessories.supplier_id', '=', 'suppliers.id')->orderBy('suppliers.name', $order); + } } diff --git a/app/Models/Actionlog.php b/app/Models/Actionlog.php index 7540568387..edbc9d9eef 100755 --- a/app/Models/Actionlog.php +++ b/app/Models/Actionlog.php @@ -1,8 +1,11 @@ ['name'] + 'company' => ['name'], ]; /** @@ -51,7 +55,7 @@ class Actionlog extends SnipeModel public static function boot() { parent::boot(); - static::creating(function (Actionlog $actionlog) { + static::creating(function (self $actionlog) { // If the admin is a superadmin, let's see if the target instead has a company. if (Auth::user() && Auth::user()->isSuperUser()) { if ($actionlog->target) { @@ -65,7 +69,6 @@ class Actionlog extends SnipeModel }); } - /** * Establishes the actionlog -> item relationship * @@ -87,7 +90,7 @@ class Actionlog extends SnipeModel */ public function company() { - return $this->hasMany('\App\Models\Company', 'id', 'company_id'); + return $this->hasMany(\App\Models\Company::class, 'id', 'company_id'); } /** @@ -99,10 +102,10 @@ class Actionlog extends SnipeModel */ public function itemType() { - if ($this->item_type == AssetModel::class) { - return "model"; + return 'model'; } + return camel_case(class_basename($this->item_type)); } @@ -116,12 +119,12 @@ class Actionlog extends SnipeModel public function targetType() { if ($this->target_type == User::class) { - return "user"; + return 'user'; } + return camel_case(class_basename($this->target_type)); } - /** * Establishes the actionlog -> uploads relationship * @@ -180,11 +183,11 @@ class Actionlog extends SnipeModel * @since [v3.0] * @return \Illuminate\Database\Eloquent\Relations\Relation */ - public function location() { - return $this->belongsTo('\App\Models\Location', 'location_id' )->withTrashed(); + public function location() + { + return $this->belongsTo(\App\Models\Location::class, 'location_id')->withTrashed(); } - /** * Check if the file exists, and if it does, force a download * @@ -194,25 +197,24 @@ class Actionlog extends SnipeModel */ public function get_src($type = 'assets', $fieldname = 'filename') { - if ($this->filename!='') { - $file = config('app.private_uploads') . '/' . $type . '/' . $this->{$fieldname}; + if ($this->filename != '') { + $file = config('app.private_uploads').'/'.$type.'/'.$this->{$fieldname}; + return $file; } + return false; } - - /** * Saves the log record with the action type * * @author [A. Gianotto] [] * @since [v3.0] - * @return boolean + * @return bool */ public function logaction($actiontype) { - $this->action_type = $actiontype; if ($this->save()) { @@ -229,8 +231,8 @@ class Actionlog extends SnipeModel * @since [v4.0] * @return int */ - public function daysUntilNextAudit($monthInterval = 12, $asset = null) { - + public function daysUntilNextAudit($monthInterval = 12, $asset = null) + { $now = Carbon::now(); $last_audit_date = $this->created_at; $next_audit = $last_audit_date->addMonth($monthInterval); @@ -252,8 +254,8 @@ class Actionlog extends SnipeModel * @since [v4.0] * @return \Datetime */ - public function calcNextAuditDate($monthInterval = 12, $asset = null) { - + public function calcNextAuditDate($monthInterval = 12, $asset = null) + { $last_audit_date = Carbon::parse($this->created_at); // If there is an asset-specific next date already given, if (($asset) && ($asset->next_audit_date)) { @@ -272,7 +274,6 @@ class Actionlog extends SnipeModel */ public function getListingOfActionLogsChronologicalOrder() { - return $this->all() ->where('action_type', '!=', 'uploaded') ->orderBy('item_id', 'asc') diff --git a/app/Models/Asset.php b/app/Models/Asset.php index 813fb6d3a4..fc0f8cc357 100644 --- a/app/Models/Asset.php +++ b/app/Models/Asset.php @@ -1,4 +1,5 @@ assigned_to = null; $this->assigned_type = null; $this->accepted = null; $this->save(); } - /** * The database table used by the model. * @@ -60,7 +65,7 @@ class Asset extends Depreciable * validation rules before attempting validation. If this property * is not set in the model it will default to true. * - * @var boolean + * @var bool */ protected $injectUniqueIdentifier = true; @@ -78,6 +83,11 @@ class Asset extends Depreciable protected $casts = [ + 'purchase_date' => 'datetime', + 'last_checkout' => 'datetime', + 'expected_checkin' => 'datetime', + 'last_audit_date' => 'datetime', + 'next_audit_date' => 'datetime', 'model_id' => 'integer', 'status_id' => 'integer', 'company_id' => 'integer', @@ -153,7 +163,7 @@ class Asset extends Depreciable 'purchase_date', 'expected_checkin', 'next_audit_date', - 'last_audit_date' + 'last_audit_date', ]; /** @@ -180,12 +190,7 @@ class Asset extends Depreciable */ public function save(array $params = []) { - $settings = \App\Models\Setting::getSettings(); - - // I don't remember why we have this here? Asset tag would always be required, even if auto increment is on... - $this->rules['asset_tag'] = ($settings->auto_increment_assets == '1') ? 'max:255' : 'required'; - - if($this->model_id != '') { + if ($this->model_id != '') { $model = AssetModel::find($this->model_id); if (($model) && ($model->fieldset)) { @@ -215,6 +220,7 @@ class Asset extends Depreciable $purchase_date = \Carbon\Carbon::instance($this->attributes['purchase_date']); } $purchase_date->setTime(0, 0, 0); + return $purchase_date->addMonths((int) $this->attributes['warranty_months']); } @@ -231,7 +237,7 @@ class Asset extends Depreciable */ public function company() { - return $this->belongsTo('\App\Models\Company', 'company_id'); + return $this->belongsTo(\App\Models\Company::class, 'company_id'); } /** @@ -242,27 +248,25 @@ class Asset extends Depreciable * * @author [A. Gianotto] [] * @since [v3.0] - * @return boolean + * @return bool */ public function availableForCheckout() { // This asset is not currently assigned to anyone and is not deleted... - if ((!$this->assigned_to) && (!$this->deleted_at)) { + if ((! $this->assigned_to) && (! $this->deleted_at)) { // The asset status is not archived and is deployable if (($this->assetstatus) && ($this->assetstatus->archived == '0') - && ($this->assetstatus->deployable == '1')) + && ($this->assetstatus->deployable == '1')) { - return true; } - } + return false; } - /** * Checks the asset out to the target * @@ -277,11 +281,11 @@ class Asset extends Depreciable * @param null $name * @return bool * @since [v3.0] - * @return boolean + * @return bool */ public function checkOut($target, $admin = null, $checkout_at = null, $expected_checkin = null, $note = null, $name = null, $location = null) { - if (!$target) { + if (! $target) { return false; } if ($this->is($target)) { @@ -296,7 +300,6 @@ class Asset extends Depreciable $this->assignedTo()->associate($target); - if ($name != null) { $this->name = $name; } @@ -313,9 +316,9 @@ class Asset extends Depreciable } if ($this->save()) { - if (is_integer($admin)){ + if (is_int($admin)) { $checkedOutBy = User::findOrFail($admin); - } elseif (get_class($admin) === 'App\Models\User') { + } elseif (get_class($admin) === \App\Models\User::class) { $checkedOutBy = $admin; } else { $checkedOutBy = Auth::user(); @@ -323,8 +326,10 @@ class Asset extends Depreciable event(new CheckoutableCheckedOut($this, $target, $checkedOutBy, $note)); $this->increment('checkout_counter', 1); + return true; } + return false; } @@ -340,9 +345,10 @@ class Asset extends Depreciable if ($this->assignedto) { $user_name = $this->assignedto->present()->name(); } else { - $user_name = "Unassigned"; + $user_name = 'Unassigned'; } - return $this->asset_tag . ' - ' . $this->name . ' (' . $user_name . ') ' . ($this->model) ? $this->model->name: ''; + + return $this->asset_tag.' - '.$this->name.' ('.$user_name.') '.($this->model) ? $this->model->name : ''; } /** @@ -367,7 +373,7 @@ class Asset extends Depreciable */ public function depreciation() { - return $this->model->belongsTo('\App\Models\Depreciation', 'depreciation_id'); + return $this->model->belongsTo(\App\Models\Depreciation::class, 'depreciation_id'); } @@ -380,7 +386,7 @@ class Asset extends Depreciable */ public function components() { - return $this->belongsToMany('\App\Models\Component', 'components_assets', 'asset_id', 'component_id')->withPivot('id', 'assigned_qty')->withTrashed(); + return $this->belongsToMany('\App\Models\Component', 'components_assets', 'asset_id', 'component_id')->withPivot('id', 'assigned_qty', 'created_at')->withTrashed(); } @@ -417,7 +423,6 @@ class Asset extends Depreciable ->orderBy('created_at', 'desc'); } - /** * Determines whether the asset is checked out to a user * @@ -426,7 +431,7 @@ class Asset extends Depreciable * * @author [A. Gianotto] [] * @since [v4.0] - * @return boolean + * @return bool */ public function checkedOutToUser() { @@ -456,7 +461,7 @@ class Asset extends Depreciable */ public function assignedAssets() { - return $this->morphMany('App\Models\Asset', 'assigned', 'assigned_type', 'assigned_to')->withTrashed(); + return $this->morphMany(self::class, 'assigned', 'assigned_type', 'assigned_to')->withTrashed(); } @@ -469,17 +474,17 @@ class Asset extends Depreciable * @since [v4.0] * @return \ArrayObject */ - public function assetLoc($iterations = 1,$first_asset = null) + public function assetLoc($iterations = 1, $first_asset = null) { - if (!empty($this->assignedType())) { + if (! empty($this->assignedType())) { if ($this->assignedType() == self::ASSET) { - if(!$first_asset) { - $first_asset=$this; + if (! $first_asset) { + $first_asset = $this; } - if($iterations>10) { - throw new \Exception("Asset assignment Loop for Asset ID: ".$first_asset->id); + if ($iterations > 10) { + throw new \Exception('Asset assignment Loop for Asset ID: '.$first_asset->id); } - $assigned_to=Asset::find($this->assigned_to); //have to do this this way because otherwise it errors + $assigned_to = self::find($this->assigned_to); //have to do this this way because otherwise it errors if ($assigned_to) { return $assigned_to->assetLoc($iterations + 1, $first_asset); } // Recurse until we have a final location @@ -496,10 +501,9 @@ class Asset extends Depreciable } //this makes no sense return $this->defaultLoc; - + } } - } return $this->defaultLoc; } @@ -524,7 +528,7 @@ class Asset extends Depreciable */ public function defaultLoc() { - return $this->belongsTo('\App\Models\Location', 'rtd_location_id'); + return $this->belongsTo(\App\Models\Location::class, 'rtd_location_id'); } /** @@ -539,11 +543,12 @@ class Asset extends Depreciable */ public function getImageUrl() { - if ($this->image && !empty($this->image)) { + if ($this->image && ! empty($this->image)) { return Storage::disk('public')->url(app('assets_upload_path').e($this->image)); - } elseif ($this->model && !empty($this->model->image)) { + } elseif ($this->model && ! empty($this->model->image)) { return Storage::disk('public')->url(app('models_upload_path').e($this->model->image)); } + return false; } @@ -557,8 +562,8 @@ class Asset extends Depreciable */ public function assetlog() { - return $this->hasMany('\App\Models\Actionlog', 'item_id') - ->where('item_type', '=', Asset::class) + return $this->hasMany(\App\Models\Actionlog::class, 'item_id') + ->where('item_type', '=', self::class) ->orderBy('created_at', 'desc') ->withTrashed(); } @@ -617,7 +622,7 @@ class Asset extends Depreciable */ public function assetmaintenances() { - return $this->hasMany('\App\Models\AssetMaintenance', 'asset_id') + return $this->hasMany(\App\Models\AssetMaintenance::class, 'asset_id') ->orderBy('created_at', 'desc'); } @@ -630,7 +635,7 @@ class Asset extends Depreciable */ public function adminuser() { - return $this->belongsTo('\App\Models\User', 'user_id'); + return $this->belongsTo(\App\Models\User::class, 'user_id'); } @@ -644,7 +649,7 @@ class Asset extends Depreciable */ public function assetstatus() { - return $this->belongsTo('\App\Models\Statuslabel', 'status_id'); + return $this->belongsTo(\App\Models\Statuslabel::class, 'status_id'); } /** @@ -656,7 +661,7 @@ class Asset extends Depreciable */ public function model() { - return $this->belongsTo('\App\Models\AssetModel', 'model_id')->withTrashed(); + return $this->belongsTo(\App\Models\AssetModel::class, 'model_id')->withTrashed(); } /** @@ -669,13 +674,13 @@ class Asset extends Depreciable */ public static function getExpiringWarrantee($days = 30) { - return Asset::where('archived', '=', '0') + return self::where('archived', '=', '0') ->whereNotNull('warranty_months') ->whereNotNull('purchase_date') ->whereNull('deleted_at') ->whereRaw(\DB::raw('DATE_ADD(`purchase_date`,INTERVAL `warranty_months` MONTH) <= DATE(NOW() + INTERVAL ' - . $days - . ' DAY) AND DATE_ADD(`purchase_date`,INTERVAL `warranty_months` MONTH) > NOW()')) + .$days + .' DAY) AND DATE_ADD(`purchase_date`,INTERVAL `warranty_months` MONTH) > NOW()')) ->orderBy('purchase_date', 'ASC') ->get(); } @@ -690,7 +695,7 @@ class Asset extends Depreciable */ public function licenses() { - return $this->belongsToMany('\App\Models\License', 'license_seats', 'asset_id', 'license_id'); + return $this->belongsToMany(\App\Models\License::class, 'license_seats', 'asset_id', 'license_id'); } /** @@ -702,7 +707,7 @@ class Asset extends Depreciable */ public function licenseseats() { - return $this->hasMany('\App\Models\LicenseSeat', 'asset_id'); + return $this->hasMany(\App\Models\LicenseSeat::class, 'asset_id'); } /** @@ -714,7 +719,7 @@ class Asset extends Depreciable */ public function supplier() { - return $this->belongsTo('\App\Models\Supplier', 'supplier_id'); + return $this->belongsTo(\App\Models\Supplier::class, 'supplier_id'); } /** @@ -726,7 +731,7 @@ class Asset extends Depreciable */ public function location() { - return $this->belongsTo('\App\Models\Location', 'location_id'); + return $this->belongsTo(\App\Models\Location::class, 'location_id'); } @@ -752,8 +757,9 @@ class Asset extends Depreciable $asset_tag = preg_replace('/^0*/', '', $asset_tag_digits); if ($settings->zerofill_count > 0) { - return $settings->auto_increment_prefix.Asset::zerofill($settings->next_auto_tag_base, $settings->zerofill_count); + return $settings->auto_increment_prefix.self::zerofill($settings->next_auto_tag_base, $settings->zerofill_count); } + return $settings->auto_increment_prefix.$settings->next_auto_tag_base; } else { return false; @@ -776,19 +782,19 @@ class Asset extends Depreciable $max = 1; foreach ($assets as $asset) { - $results = preg_match ( "/\d+$/" , $asset['asset_tag'], $matches); + $results = preg_match("/\d+$/", $asset['asset_tag'], $matches); - if ($results) + if ($results) { $number = $matches[0]; - if ($number > $max) + if ($number > $max) { $max = $number; } } } - return $max + 1; + } @@ -814,7 +820,7 @@ class Asset extends Depreciable * * @author [A. Gianotto] [] * @since [v4.0] - * @return boolean + * @return bool */ public function checkin_email() { @@ -826,7 +832,7 @@ class Asset extends Depreciable * * @author [A. Gianotto] [] * @since [v4.0] - * @return boolean + * @return bool */ public function requireAcceptance() { @@ -857,6 +863,7 @@ class Asset extends Depreciable return false; } } + return false; } @@ -874,50 +881,49 @@ class Asset extends Depreciable * @param array $terms The search terms * @return \Illuminate\Database\Eloquent\Builder */ - public function advancedTextSearch(Builder $query, array $terms) { + public function advancedTextSearch(Builder $query, array $terms) + { /** * Assigned user */ - $query = $query->leftJoin('users as assets_users',function ($leftJoin) { - $leftJoin->on("assets_users.id", "=", "assets.assigned_to") - ->where("assets.assigned_type", "=", User::class); + $query = $query->leftJoin('users as assets_users', function ($leftJoin) { + $leftJoin->on('assets_users.id', '=', 'assets.assigned_to') + ->where('assets.assigned_type', '=', User::class); }); - foreach($terms as $term) { + foreach ($terms as $term) { $query = $query ->orWhere('assets_users.first_name', 'LIKE', '%'.$term.'%') ->orWhere('assets_users.last_name', 'LIKE', '%'.$term.'%') ->orWhere('assets_users.username', 'LIKE', '%'.$term.'%') - ->orWhereRaw('CONCAT('.DB::getTablePrefix().'assets_users.first_name," ",'.DB::getTablePrefix().'assets_users.last_name) LIKE ?', ["%$term%", "%$term%"]); + ->orWhereRaw('CONCAT('.DB::getTablePrefix().'assets_users.first_name," ",'.DB::getTablePrefix().'assets_users.last_name) LIKE ?', ["%$term%"]); } /** * Assigned location */ - $query = $query->leftJoin('locations as assets_locations',function ($leftJoin) { - $leftJoin->on("assets_locations.id","=","assets.assigned_to") - ->where("assets.assigned_type","=",Location::class); + $query = $query->leftJoin('locations as assets_locations', function ($leftJoin) { + $leftJoin->on('assets_locations.id', '=', 'assets.assigned_to') + ->where('assets.assigned_type', '=', Location::class); }); - foreach($terms as $term) { + foreach ($terms as $term) { $query = $query->orWhere('assets_locations.name', 'LIKE', '%'.$term.'%'); - } /** * Assigned assets */ - $query = $query->leftJoin('assets as assigned_assets',function ($leftJoin) { + $query = $query->leftJoin('assets as assigned_assets', function ($leftJoin) { $leftJoin->on('assigned_assets.id', '=', 'assets.assigned_to') - ->where('assets.assigned_type', '=', Asset::class); + ->where('assets.assigned_type', '=', self::class); }); - foreach($terms as $term) { - + foreach ($terms as $term) { $query = $query->orWhere('assigned_assets.name', 'LIKE', '%'.$term.'%'); } @@ -971,13 +977,13 @@ class Asset extends Depreciable $query->whereHas('assignedTo', function ($query) use ($location) { $query->where([ ['users.location_id', '=', $location->id], - ['assets.assigned_type', '=', User::class] + ['assets.assigned_type', '=', User::class], ])->orWhere([ ['locations.id', '=', $location->id], - ['assets.assigned_type', '=', Location::class] + ['assets.assigned_type', '=', Location::class], ])->orWhere([ ['assets.rtd_location_id', '=', $location->id], - ['assets.assigned_type', '=', Asset::class] + ['assets.assigned_type', '=', self::class], ]); })->orWhere(function ($query) use ($location) { $query->where('assets.rtd_location_id', '=', $location->id); @@ -1112,7 +1118,7 @@ class Asset extends Depreciable $interval = $settings->audit_warning_days ?? 0; return $query->whereNotNull('assets.next_audit_date') - ->whereRaw("DATE_SUB(".DB::getTablePrefix()."assets.next_audit_date, INTERVAL $interval DAY) <= '".Carbon::now()."'") + ->whereRaw('DATE_SUB('.DB::getTablePrefix()."assets.next_audit_date, INTERVAL $interval DAY) <= '".Carbon::now()."'") ->where('assets.archived', '=', 0) ->NotArchived(); } @@ -1192,7 +1198,7 @@ class Asset extends Depreciable */ public function scopeNotYetAccepted($query) { - return $query->where("accepted", "=", "pending"); + return $query->where('accepted', '=', 'pending'); } /** @@ -1204,7 +1210,7 @@ class Asset extends Depreciable */ public function scopeRejected($query) { - return $query->where("accepted", "=", "rejected"); + return $query->where('accepted', '=', 'rejected'); } @@ -1217,7 +1223,7 @@ class Asset extends Depreciable */ public function scopeAccepted($query) { - return $query->where("accepted", "=", "accepted"); + return $query->where('accepted', '=', 'accepted'); } /** @@ -1232,15 +1238,15 @@ class Asset extends Depreciable { $search = explode(' OR ', $search); - return $query->leftJoin('users as assets_users',function ($leftJoin) { - $leftJoin->on("assets_users.id", "=", "assets.assigned_to") - ->where("assets.assigned_type", "=", User::class); - })->leftJoin('locations as assets_locations',function ($leftJoin) { - $leftJoin->on("assets_locations.id","=","assets.assigned_to") - ->where("assets.assigned_type","=",Location::class); - })->leftJoin('assets as assigned_assets',function ($leftJoin) { + return $query->leftJoin('users as assets_users', function ($leftJoin) { + $leftJoin->on('assets_users.id', '=', 'assets.assigned_to') + ->where('assets.assigned_type', '=', User::class); + })->leftJoin('locations as assets_locations', function ($leftJoin) { + $leftJoin->on('assets_locations.id', '=', 'assets.assigned_to') + ->where('assets.assigned_type', '=', Location::class); + })->leftJoin('assets as assigned_assets', function ($leftJoin) { $leftJoin->on('assigned_assets.id', '=', 'assets.assigned_to') - ->where('assets.assigned_type', '=', Asset::class); + ->where('assets.assigned_type', '=', self::class); })->where(function ($query) use ($search) { foreach ($search as $search) { $query->whereHas('model', function ($query) use ($search) { @@ -1260,7 +1266,7 @@ class Asset extends Depreciable })->orWhere(function ($query) use ($search) { $query->where('assets_users.first_name', 'LIKE', '%'.$search.'%') ->orWhere('assets_users.last_name', 'LIKE', '%'.$search.'%') - ->orWhereRaw('CONCAT('.DB::getTablePrefix().'assets_users.first_name," ",'.DB::getTablePrefix().'assets_users.last_name) LIKE ?', ["%$search%", "%$search%"]) + ->orWhereRaw('CONCAT('.DB::getTablePrefix().'assets_users.first_name," ",'.DB::getTablePrefix().'assets_users.last_name) LIKE ?', ["%$search%"]) ->orWhere('assets_users.username', 'LIKE', '%'.$search.'%') ->orWhere('assets_locations.name', 'LIKE', '%'.$search.'%') ->orWhere('assigned_assets.name', 'LIKE', '%'.$search.'%'); @@ -1271,7 +1277,7 @@ class Asset extends Depreciable ->orWhere('assets.notes', 'LIKE', '%'.$search.'%'); } - })->withTrashed()->whereNull("assets.deleted_at"); //workaround for laravel bug + })->withTrashed()->whereNull('assets.deleted_at'); //workaround for laravel bug } /** @@ -1285,13 +1291,13 @@ class Asset extends Depreciable */ public function scopeCheckedOutToTargetInDepartment($query, $search) { - return $query->leftJoin('users as assets_dept_users',function ($leftJoin) { - $leftJoin->on("assets_dept_users.id", "=", "assets.assigned_to") - ->where("assets.assigned_type", "=", User::class); + return $query->leftJoin('users as assets_dept_users', function ($leftJoin) { + $leftJoin->on('assets_dept_users.id', '=', 'assets.assigned_to') + ->where('assets.assigned_type', '=', User::class); })->where(function ($query) use ($search) { $query->where('assets_dept_users.department_id', '=', $search); - })->withTrashed()->whereNull("assets.deleted_at"); //workaround for laravel bug + })->withTrashed()->whereNull('assets.deleted_at'); //workaround for laravel bug } @@ -1308,60 +1314,60 @@ class Asset extends Depreciable { return $query->where(function ($query) use ($filter) { foreach ($filter as $key => $search_val) { + $fieldname = str_replace('custom_fields.', '', $key); - $fieldname = str_replace('custom_fields.','', $key) ; - - if ($fieldname =='asset_tag') { + if ($fieldname == 'asset_tag') { $query->where('assets.asset_tag', 'LIKE', '%'.$search_val.'%'); } - if ($fieldname =='name') { + if ($fieldname == 'name') { $query->where('assets.name', 'LIKE', '%'.$search_val.'%'); } - if ($fieldname =='product_key') { + + if ($fieldname =='serial') { $query->where('assets.serial', 'LIKE', '%'.$search_val.'%'); } - if ($fieldname =='purchase_date') { + if ($fieldname == 'purchase_date') { $query->where('assets.purchase_date', 'LIKE', '%'.$search_val.'%'); } - if ($fieldname =='purchase_cost') { + if ($fieldname == 'purchase_cost') { $query->where('assets.purchase_cost', 'LIKE', '%'.$search_val.'%'); } - if ($fieldname =='notes') { + if ($fieldname == 'notes') { $query->where('assets.notes', 'LIKE', '%'.$search_val.'%'); } - if ($fieldname =='order_number') { + if ($fieldname == 'order_number') { $query->where('assets.order_number', 'LIKE', '%'.$search_val.'%'); } - if ($fieldname =='status_label') { + if ($fieldname == 'status_label') { $query->whereHas('assetstatus', function ($query) use ($search_val) { - $query->where('status_labels.name', 'LIKE', '%' . $search_val . '%'); + $query->where('status_labels.name', 'LIKE', '%'.$search_val.'%'); }); } - if ($fieldname =='location') { + if ($fieldname == 'location') { $query->whereHas('location', function ($query) use ($search_val) { - $query->where('locations.name', 'LIKE', '%' . $search_val . '%'); + $query->where('locations.name', 'LIKE', '%'.$search_val.'%'); }); } - if ($fieldname =='checkedout_to') { + if ($fieldname == 'checkedout_to') { $query->whereHas('assigneduser', function ($query) use ($search_val) { $query->where(function ($query) use ($search_val) { - $query->where('users.first_name', 'LIKE', '%' . $search_val . '%') - ->orWhere('users.last_name', 'LIKE', '%' . $search_val . '%'); + $query->where('users.first_name', 'LIKE', '%'.$search_val.'%') + ->orWhere('users.last_name', 'LIKE', '%'.$search_val.'%'); }); }); } - if ($fieldname =='manufacturer') { + if ($fieldname == 'manufacturer') { $query->whereHas('model', function ($query) use ($search_val) { $query->whereHas('manufacturer', function ($query) use ($search_val) { $query->where(function ($query) use ($search_val) { @@ -1371,47 +1377,47 @@ class Asset extends Depreciable }); } - if ($fieldname =='category') { + if ($fieldname == 'category') { $query->whereHas('model', function ($query) use ($search_val) { $query->whereHas('category', function ($query) use ($search_val) { $query->where(function ($query) use ($search_val) { - $query->where('categories.name', 'LIKE', '%' . $search_val . '%') - ->orWhere('models.name', 'LIKE', '%' . $search_val . '%') - ->orWhere('models.model_number', 'LIKE', '%' . $search_val . '%'); + $query->where('categories.name', 'LIKE', '%'.$search_val.'%') + ->orWhere('models.name', 'LIKE', '%'.$search_val.'%') + ->orWhere('models.model_number', 'LIKE', '%'.$search_val.'%'); }); }); }); } - if ($fieldname =='model') { + if ($fieldname == 'model') { $query->where(function ($query) use ($search_val) { $query->whereHas('model', function ($query) use ($search_val) { - $query->where('models.name', 'LIKE', '%' . $search_val . '%'); + $query->where('models.name', 'LIKE', '%'.$search_val.'%'); }); }); } - if ($fieldname =='model_number') { + if ($fieldname == 'model_number') { $query->where(function ($query) use ($search_val) { $query->whereHas('model', function ($query) use ($search_val) { - $query->where('models.model_number', 'LIKE', '%' . $search_val . '%'); + $query->where('models.model_number', 'LIKE', '%'.$search_val.'%'); }); }); } - if ($fieldname =='company') { + if ($fieldname == 'company') { $query->where(function ($query) use ($search_val) { $query->whereHas('company', function ($query) use ($search_val) { - $query->where('companies.name', 'LIKE', '%' . $search_val . '%'); + $query->where('companies.name', 'LIKE', '%'.$search_val.'%'); }); }); } - if ($fieldname =='supplier') { + if ($fieldname == 'supplier') { $query->where(function ($query) use ($search_val) { $query->whereHas('supplier', function ($query) use ($search_val) { - $query->where('suppliers.name', 'LIKE', '%' . $search_val . '%'); + $query->where('suppliers.name', 'LIKE', '%'.$search_val.'%'); }); }); } @@ -1439,9 +1445,10 @@ class Asset extends Depreciable * - snipe * */ + if (($fieldname!='category') && ($fieldname!='model_number') && ($fieldname!='rtd_location') && ($fieldname!='location') && ($fieldname!='supplier') && ($fieldname!='status_label') && ($fieldname!='model') && ($fieldname!='company') && ($fieldname!='manufacturer')) { - $query->orWhere('assets.'.$fieldname, 'LIKE', '%' . $search_val . '%'); + $query->where('assets.'.$fieldname, 'LIKE', '%' . $search_val . '%'); } diff --git a/app/Models/AssetMaintenance.php b/app/Models/AssetMaintenance.php index 580aa18e04..27273eefc4 100644 --- a/app/Models/AssetMaintenance.php +++ b/app/Models/AssetMaintenance.php @@ -1,8 +1,10 @@ 'datetime', + 'completion_date' => 'datetime', + ]; protected $table = 'asset_maintenances'; protected $rules = [ 'asset_id' => 'required|integer', @@ -30,21 +34,21 @@ class AssetMaintenance extends Model implements ICompanyableChild 'start_date' => 'required|date', 'completion_date' => 'nullable|date', 'notes' => 'string|nullable', - 'cost' => 'numeric|nullable' + 'cost' => 'numeric|nullable', ]; use Searchable; - + /** * The attributes that should be included when searching the model. - * + * * @var array */ protected $searchableAttributes = ['title', 'notes', 'asset_maintenance_type', 'cost', 'start_date', 'completion_date']; /** * The relations and their attributes that should be included when searching the model. - * + * * @var array */ protected $searchableRelations = [ @@ -52,22 +56,20 @@ class AssetMaintenance extends Model implements ICompanyableChild 'asset.model' => ['name', 'model_number'], ]; - public function getCompanyableParents() { - return [ 'asset' ]; + return ['asset']; } /** - * getImprovementOptions - * - * @return array - * @author Vincent Sposato - * @version v1.0 - */ + * getImprovementOptions + * + * @return array + * @author Vincent Sposato + * @version v1.0 + */ public static function getImprovementOptions() { - return [ trans('admin/asset_maintenances/general.maintenance') => trans('admin/asset_maintenances/general.maintenance'), trans('admin/asset_maintenances/general.repair') => trans('admin/asset_maintenances/general.repair'), @@ -92,7 +94,7 @@ class AssetMaintenance extends Model implements ICompanyableChild */ public function setCostAttribute($value) { - $value = Helper::ParseFloat($value); + $value = Helper::ParseFloat($value); if ($value == '0.0') { $value = null; } @@ -115,24 +117,23 @@ class AssetMaintenance extends Model implements ICompanyableChild */ public function setCompletionDateAttribute($value) { - if ($value == '' || $value == "0000-00-00") { + if ($value == '' || $value == '0000-00-00') { $value = null; } $this->attributes['completion_date'] = $value; } /** - * asset - * Get asset for this improvement - * - * @return mixed - * @author Vincent Sposato - * @version v1.0 - */ + * asset + * Get asset for this improvement + * + * @return mixed + * @author Vincent Sposato + * @version v1.0 + */ public function asset() { - - return $this->belongsTo('\App\Models\Asset', 'asset_id') + return $this->belongsTo(\App\Models\Asset::class, 'asset_id') ->withTrashed(); } @@ -145,25 +146,21 @@ class AssetMaintenance extends Model implements ICompanyableChild */ public function admin() { - - return $this->belongsTo('\App\Models\User', 'user_id') + return $this->belongsTo(\App\Models\User::class, 'user_id') ->withTrashed(); } public function supplier() { - - return $this->belongsTo('\App\Models\Supplier', 'supplier_id') + return $this->belongsTo(\App\Models\Supplier::class, 'supplier_id') ->withTrashed(); } - /** - * ----------------------------------------------- - * BEGIN QUERY SCOPES - * ----------------------------------------------- - **/ - + * ----------------------------------------------- + * BEGIN QUERY SCOPES + * ----------------------------------------------- + **/ /** * Query builder scope to order on admin user @@ -207,6 +204,4 @@ class AssetMaintenance extends Model implements ICompanyableChild return $query->leftJoin('assets', 'asset_maintenances.asset_id', '=', 'assets.id') ->orderBy('assets.name', $order); } - - } diff --git a/app/Models/AssetModel.php b/app/Models/AssetModel.php index 1bb7902fda..7968f84085 100755 --- a/app/Models/AssetModel.php +++ b/app/Models/AssetModel.php @@ -1,8 +1,10 @@ 'required|min:1|max:255', 'model_number' => 'max:255|nullable', 'category_id' => 'required|integer|exists:categories,id', 'manufacturer_id' => 'required|integer|exists:manufacturers,id', 'eol' => 'integer:min:0|max:240|nullable', - ); + ]; /** - * Whether the model should inject it's identifier to the unique - * validation rules before attempting validation. If this property - * is not set in the model it will default to true. - * - * @var boolean - */ + * Whether the model should inject it's identifier to the unique + * validation rules before attempting validation. If this property + * is not set in the model it will default to true. + * + * @var bool + */ protected $injectUniqueIdentifier = true; use ValidatingTrait; @@ -49,6 +52,7 @@ class AssetModel extends SnipeModel $this->attributes['eol'] = $value; } + /** * The attributes that are mass assignable. * @@ -68,17 +72,17 @@ class AssetModel extends SnipeModel ]; use Searchable; - + /** * The attributes that should be included when searching the model. - * + * * @var array */ protected $searchableAttributes = ['name', 'model_number', 'notes', 'eol']; /** * The relations and their attributes that should be included when searching the model. - * + * * @var array */ protected $searchableRelations = [ @@ -87,7 +91,6 @@ class AssetModel extends SnipeModel 'manufacturer' => ['name'], ]; - /** * Establishes the model -> assets relationship * @@ -97,7 +100,7 @@ class AssetModel extends SnipeModel */ public function assets() { - return $this->hasMany('\App\Models\Asset', 'model_id'); + return $this->hasMany(\App\Models\Asset::class, 'model_id'); } /** @@ -109,7 +112,7 @@ class AssetModel extends SnipeModel */ public function category() { - return $this->belongsTo('\App\Models\Category', 'category_id'); + return $this->belongsTo(\App\Models\Category::class, 'category_id'); } /** @@ -121,10 +124,9 @@ class AssetModel extends SnipeModel */ public function depreciation() { - return $this->belongsTo('\App\Models\Depreciation', 'depreciation_id'); + return $this->belongsTo(\App\Models\Depreciation::class, 'depreciation_id'); } - /** * Establishes the model -> manufacturer relationship * @@ -134,7 +136,7 @@ class AssetModel extends SnipeModel */ public function manufacturer() { - return $this->belongsTo('\App\Models\Manufacturer', 'manufacturer_id'); + return $this->belongsTo(\App\Models\Manufacturer::class, 'manufacturer_id'); } /** @@ -146,7 +148,7 @@ class AssetModel extends SnipeModel */ public function fieldset() { - return $this->belongsTo('\App\Models\CustomFieldset', 'fieldset_id'); + return $this->belongsTo(\App\Models\CustomFieldset::class, 'fieldset_id'); } /** @@ -158,10 +160,9 @@ class AssetModel extends SnipeModel */ public function defaultValues() { - return $this->belongsToMany('\App\Models\CustomField', 'models_custom_fields')->withPivot('default_value'); + return $this->belongsToMany(\App\Models\CustomField::class, 'models_custom_fields')->withPivot('default_value'); } - /** * Gets the full url for the image * @@ -171,19 +172,20 @@ class AssetModel extends SnipeModel * @since [v2.0] * @return \Illuminate\Database\Eloquent\Relations\Relation */ - public function getImageUrl() { + public function getImageUrl() + { if ($this->image) { return Storage::disk('public')->url(app('models_upload_path').$this->image); } + return false; } /** - * ----------------------------------------------- - * BEGIN QUERY SCOPES - * ----------------------------------------------- - **/ - + * ----------------------------------------------- + * BEGIN QUERY SCOPES + * ----------------------------------------------- + **/ /** * scopeInCategory @@ -198,7 +200,6 @@ class AssetModel extends SnipeModel */ public function scopeInCategory($query, array $categoryIdListing) { - return $query->whereIn('category_id', $categoryIdListing); } @@ -214,9 +215,8 @@ class AssetModel extends SnipeModel */ public function scopeRequestableModels($query) { - return $query->where('requestable', '1'); - } + } /** * Query builder scope to search on text, including catgeory and manufacturer name @@ -228,7 +228,6 @@ class AssetModel extends SnipeModel */ public function scopeSearchByManufacturerOrCat($query, $search) { - return $query->where('models.name', 'LIKE', "%$search%") ->orWhere('model_number', 'LIKE', "%$search%") ->orWhere(function ($query) use ($search) { @@ -241,7 +240,6 @@ class AssetModel extends SnipeModel $query->where('manufacturers.name', 'LIKE', '%'.$search.'%'); }); }); - } /** @@ -269,6 +267,4 @@ class AssetModel extends SnipeModel { return $query->leftJoin('categories', 'models.category_id', '=', 'categories.id')->orderBy('categories.name', $order); } - - } diff --git a/app/Models/Category.php b/app/Models/Category.php index ad21f15b48..6445dec5cf 100755 --- a/app/Models/Category.php +++ b/app/Models/Category.php @@ -1,9 +1,11 @@ 'integer', ]; - /** - * Category validation rules - */ - public $rules = array( + * Category validation rules + */ + public $rules = [ 'user_id' => 'numeric|nullable', - 'name' => 'required|min:1|max:255|unique_undeleted', + 'name' => 'required|min:1|max:255|two_column_unique_undeleted:category_type', 'require_acceptance' => 'boolean', 'use_default_eula' => 'boolean', 'category_type' => 'required|in:asset,accessory,consumable,component,license', - ); + ]; /** - * Whether the model should inject it's identifier to the unique - * validation rules before attempting validation. If this property - * is not set in the model it will default to true. - * - * @var boolean - */ + * Whether the model should inject it's identifier to the unique + * validation rules before attempting validation. If this property + * is not set in the model it will default to true. + * + * @var bool + */ protected $injectUniqueIdentifier = true; use ValidatingTrait; - use UniqueUndeletedTrait; + use TwoColumnUniqueUndeletedTrait; /** @@ -85,7 +87,6 @@ class Category extends SnipeModel */ protected $searchableRelations = []; - /** * Checks if category can be deleted * @@ -95,8 +96,8 @@ class Category extends SnipeModel */ public function isDeletable() { - return (Gate::allows('delete', $this) - && ($this->itemCount() == 0)); + return Gate::allows('delete', $this) + && ($this->itemCount() == 0); } /** @@ -108,7 +109,7 @@ class Category extends SnipeModel */ public function accessories() { - return $this->hasMany('\App\Models\Accessory'); + return $this->hasMany(\App\Models\Accessory::class); } /** @@ -120,7 +121,7 @@ class Category extends SnipeModel */ public function licenses() { - return $this->hasMany('\App\Models\License'); + return $this->hasMany(\App\Models\License::class); } /** @@ -132,7 +133,7 @@ class Category extends SnipeModel */ public function consumables() { - return $this->hasMany('\App\Models\Consumable'); + return $this->hasMany(\App\Models\Consumable::class); } /** @@ -144,7 +145,7 @@ class Category extends SnipeModel */ public function components() { - return $this->hasMany('\App\Models\Component'); + return $this->hasMany(\App\Models\Component::class); } /** @@ -168,6 +169,7 @@ class Category extends SnipeModel case 'license': return $this->licenses()->count(); } + return '0'; } @@ -180,7 +182,7 @@ class Category extends SnipeModel */ public function assets() { - return $this->hasManyThrough('\App\Models\Asset', '\App\Models\AssetModel', 'category_id', 'model_id'); + return $this->hasManyThrough(\App\Models\Asset::class, \App\Models\AssetModel::class, 'category_id', 'model_id'); } /** @@ -192,7 +194,7 @@ class Category extends SnipeModel */ public function models() { - return $this->hasMany('\App\Models\AssetModel', 'category_id'); + return $this->hasMany(\App\Models\AssetModel::class, 'category_id'); } /** @@ -205,20 +207,17 @@ class Category extends SnipeModel */ public function getEula() { - $Parsedown = new \Parsedown(); if ($this->eula_text) { return $Parsedown->text(e($this->eula_text)); - } elseif ((Setting::getSettings()->default_eula_text) && ($this->use_default_eula=='1')) { + } elseif ((Setting::getSettings()->default_eula_text) && ($this->use_default_eula == '1')) { return $Parsedown->text(e(Setting::getSettings()->default_eula_text)); } else { return null; } - } - /** * ----------------------------------------------- * BEGIN QUERY SCOPES @@ -233,10 +232,8 @@ class Category extends SnipeModel * @param \Illuminate\Database\Query\Builder $query Query builder instance * @return \Illuminate\Database\Query\Builder Modified query builder */ - public function scopeRequiresAcceptance($query) { - return $query->where('require_acceptance', '=', true); } } diff --git a/app/Models/CheckoutAcceptance.php b/app/Models/CheckoutAcceptance.php index 4bbe0af164..cc6ca37fd4 100644 --- a/app/Models/CheckoutAcceptance.php +++ b/app/Models/CheckoutAcceptance.php @@ -8,80 +8,79 @@ use Illuminate\Database\Eloquent\SoftDeletes; class CheckoutAcceptance extends Model { + use SoftDeletes; - use SoftDeletes; - - /** - * The attributes that should be mutated to dates. - * - * @var array - */ - protected $dates = [ - 'accepted_at', - 'declined_at', - 'deleted_at' + protected $casts = [ + 'accepted_at' => 'datetime', + 'declined_at' => 'datetime', ]; /** * The resource that was is out - * + * * @return Illuminate\Database\Eloquent\Relations\MorphTo */ - public function checkoutable() { - return $this->morphTo(); + public function checkoutable() + { + return $this->morphTo(); } /** * The user that the checkoutable was checked out to - * + * * @return Illuminate\Database\Eloquent\Relations\BelongsTo */ - public function assignedTo() { - return $this->belongsTo(User::class); + public function assignedTo() + { + return $this->belongsTo(User::class); } /** * Is this checkout acceptance pending? - * - * @return boolean + * + * @return bool */ - public function isPending() { + public function isPending() + { return $this->accepted_at == null && $this->declined_at == null; } /** * Was the checkoutable checked out to this user? - * + * * @param User $user - * @return boolean + * @return bool */ - public function isCheckedOutTo(User $user) { + public function isCheckedOutTo(User $user) + { return $this->assignedTo->is($user); } /** * Accept the checkout acceptance - * + * * @param string $signature_filename */ - public function accept($signature_filename) { - $this->accepted_at = now(); + public function accept($signature_filename) + { + $this->accepted_at = now(); $this->signature_filename = $signature_filename; $this->save(); /** * Update state for the checked out item */ - $this->checkoutable->acceptedCheckout($this->assignedTo, $signature_filename); + $this->checkoutable->acceptedCheckout($this->assignedTo, $signature_filename); } /** * Decline the checkout acceptance - * + * * @param string $signature_filename */ - public function decline($signature_filename) { - $this->declined_at = now(); + public function decline($signature_filename) + { + $this->declined_at = now(); $this->signature_filename = $signature_filename; $this->save(); @@ -89,7 +88,7 @@ class CheckoutAcceptance extends Model * Update state for the checked out item */ $this->checkoutable->declinedCheckout($this->assignedTo, $signature_filename); - } + } /** * Filter checkout acceptences by the user @@ -97,7 +96,8 @@ class CheckoutAcceptance extends Model * @param User $user * @return \Illuminate\Database\Eloquent\Builder */ - public function scopeForUser(Builder $query, User $user) { + public function scopeForUser(Builder $query, User $user) + { return $query->where('assigned_to_id', $user->id); } @@ -106,7 +106,8 @@ class CheckoutAcceptance extends Model * @param Illuminate\Database\Eloquent\Builder $query * @return \Illuminate\Database\Eloquent\Builder */ - public function scopePending(Builder $query) { + public function scopePending(Builder $query) + { return $query->whereNull('accepted_at')->whereNull('declined_at'); } } diff --git a/app/Models/CheckoutRequest.php b/app/Models/CheckoutRequest.php index 462af447e9..26abdd301e 100644 --- a/app/Models/CheckoutRequest.php +++ b/app/Models/CheckoutRequest.php @@ -1,6 +1,7 @@ itemType() == "asset") { + if ($this->itemType() == 'asset') { return $this->itemRequested()->present()->name(); } - return $this->itemRequested()->name; + return $this->itemRequested()->name; } } diff --git a/app/Models/Company.php b/app/Models/Company.php index 04f138ccd0..fadc2a1974 100644 --- a/app/Models/Company.php +++ b/app/Models/Company.php @@ -1,10 +1,12 @@ 'required|min:1|max:255|unique:companies,name' + 'name' => 'required|min:1|max:255|unique:companies,name', ]; - protected $presenter = 'App\Presenters\CompanyPresenter'; + protected $presenter = \App\Presenters\CompanyPresenter::class; use Presentable; /** @@ -30,11 +34,10 @@ final class Company extends SnipeModel * validation rules before attempting validation. If this property * is not set in the model it will default to true. * - * @var boolean + * @var bool */ protected $injectUniqueIdentifier = true; use ValidatingTrait; - use Searchable; /** @@ -70,7 +73,7 @@ final class Company extends SnipeModel } } - private static function scopeCompanyablesDirectly($query, $column = 'company_id', $table_name = null ) + private static function scopeCompanyablesDirectly($query, $column = 'company_id', $table_name = null) { if (Auth::user()) { $company_id = Auth::user()->company_id; @@ -78,12 +81,12 @@ final class Company extends SnipeModel $company_id = null; } - $table = ($table_name) ? $table_name."." : ''; + $table = ($table_name) ? $table_name."." : $query->getModel()->getTable()."."; - if(\Schema::hasColumn($query->getModel()->getTable(), $column)){ - return $query->where($table.$column, '=', $company_id); + if (\Schema::hasColumn($query->getModel()->getTable(), $column)) { + return $query->where($table.$column, '=', $company_id); } else { - return $query->join('users as users_comp', 'users_comp.id', 'user_id')->where('users_comp.company_id', '=', $company_id); + return $query->join('users as users_comp', 'users_comp.id', 'user_id')->where('users_comp.company_id', '=', $company_id); } } @@ -100,7 +103,7 @@ final class Company extends SnipeModel public static function getIdForCurrentUser($unescaped_input) { - if (!static::isFullMultipleCompanySupportEnabled()) { + if (! static::isFullMultipleCompanySupportEnabled()) { return static::getIdFromInput($unescaped_input); } else { $current_user = Auth::user(); @@ -115,7 +118,6 @@ final class Company extends SnipeModel return static::getIdFromInput($unescaped_input); } } - } } @@ -123,27 +125,27 @@ final class Company extends SnipeModel { if (is_null($companyable)) { return false; - } elseif (!static::isFullMultipleCompanySupportEnabled()) { + } elseif (! static::isFullMultipleCompanySupportEnabled()) { return true; } else { if (Auth::user()) { $current_user_company_id = Auth::user()->company_id; $companyable_company_id = $companyable->company_id; - return ($current_user_company_id == null || $current_user_company_id == $companyable_company_id || Auth::user()->isSuperUser()); - } + return $current_user_company_id == null || $current_user_company_id == $companyable_company_id || Auth::user()->isSuperUser(); + } } } public static function isCurrentUserAuthorized() { - return ((!static::isFullMultipleCompanySupportEnabled()) || (Auth::user()->isSuperUser())); + return (! static::isFullMultipleCompanySupportEnabled()) || (Auth::user()->isSuperUser()); } public static function canManageUsersCompanies() { - return (!static::isFullMultipleCompanySupportEnabled() || Auth::user()->isSuperUser() || - Auth::user()->company_id == null); + return ! static::isFullMultipleCompanySupportEnabled() || Auth::user()->isSuperUser() || + Auth::user()->company_id == null; } /** @@ -153,7 +155,8 @@ final class Company extends SnipeModel * @since [v5.0] * @return bool */ - public function isDeletable() { + public function isDeletable() + { return Gate::allows('delete', $this) && ($this->assets()->count() === 0) && ($this->accessories()->count() === 0) @@ -164,17 +167,17 @@ final class Company extends SnipeModel public static function getIdForUser($unescaped_input) { - if (!static::isFullMultipleCompanySupportEnabled() || Auth::user()->isSuperUser()) { + if (! static::isFullMultipleCompanySupportEnabled() || Auth::user()->isSuperUser()) { return static::getIdFromInput($unescaped_input); } else { return static::getIdForCurrentUser($unescaped_input); } } - public static function scopeCompanyables($query, $column = 'company_id', $table_name = null ) + public static function scopeCompanyables($query, $column = 'company_id', $table_name = null) { // If not logged in and hitting this, assume we are on the command line and don't scope?' - if (!static::isFullMultipleCompanySupportEnabled() || (Auth::check() && Auth::user()->isSuperUser()) || (!Auth::check())) { + if (! static::isFullMultipleCompanySupportEnabled() || (Auth::check() && Auth::user()->isSuperUser()) || (! Auth::check())) { return $query; } else { return static::scopeCompanyablesDirectly($query, $column, $table_name); @@ -185,7 +188,7 @@ final class Company extends SnipeModel { if (count($companyable_names) == 0) { throw new Exception('No Companyable Children to scope'); - } elseif (!static::isFullMultipleCompanySupportEnabled() || (Auth::check() && Auth::user()->isSuperUser())) { + } elseif (! static::isFullMultipleCompanySupportEnabled() || (Auth::check() && Auth::user()->isSuperUser())) { return $query; } else { $f = function ($q) { @@ -199,6 +202,7 @@ final class Company extends SnipeModel $q2 = $q2->orWhereHas($companyable_names[$i], $f); } }); + return $q; } } @@ -217,6 +221,7 @@ final class Company extends SnipeModel { return $this->hasMany(License::class, 'company_id'); } + public function accessories() { return $this->hasMany(Accessory::class, 'company_id'); diff --git a/app/Models/CompanyableChildScope.php b/app/Models/CompanyableChildScope.php index e83eb18ed8..4077ebd596 100644 --- a/app/Models/CompanyableChildScope.php +++ b/app/Models/CompanyableChildScope.php @@ -1,4 +1,5 @@ getModel(); + return Company::scopeCompanyableChildren($model->getCompanyableParents(), $builder); } diff --git a/app/Models/CompanyableChildTrait.php b/app/Models/CompanyableChildTrait.php index 02682d0bab..1158c70e98 100644 --- a/app/Models/CompanyableChildTrait.php +++ b/app/Models/CompanyableChildTrait.php @@ -1,4 +1,5 @@ 'datetime', + ]; protected $table = 'components'; /** - * Category validation rules - */ - public $rules = array( + * Category validation rules + */ + public $rules = [ 'name' => 'required|min:3|max:255', 'qty' => 'required|integer|min:1', 'category_id' => 'required|integer|exists:categories,id', @@ -32,15 +37,15 @@ class Component extends SnipeModel 'min_amt' => 'integer|min:0|nullable', 'purchase_date' => 'date|nullable', 'purchase_cost' => 'numeric|nullable', - ); + ]; /** - * Whether the model should inject it's identifier to the unique - * validation rules before attempting validation. If this property - * is not set in the model it will default to true. - * - * @var boolean - */ + * Whether the model should inject it's identifier to the unique + * validation rules before attempting validation. If this property + * is not set in the model it will default to true. + * + * @var bool + */ protected $injectUniqueIdentifier = true; use ValidatingTrait; @@ -63,17 +68,17 @@ class Component extends SnipeModel ]; use Searchable; - + /** * The attributes that should be included when searching the model. - * + * * @var array */ protected $searchableAttributes = ['name', 'order_number', 'serial', 'purchase_cost', 'purchase_date']; /** * The relations and their attributes that should be included when searching the model. - * + * * @var array */ protected $searchableRelations = [ @@ -91,7 +96,7 @@ class Component extends SnipeModel */ public function location() { - return $this->belongsTo('\App\Models\Location', 'location_id'); + return $this->belongsTo(\App\Models\Location::class, 'location_id'); } /** @@ -103,7 +108,7 @@ class Component extends SnipeModel */ public function assets() { - return $this->belongsToMany('\App\Models\Asset', 'components_assets')->withPivot('id', 'assigned_qty', 'created_at', 'user_id'); + return $this->belongsToMany(\App\Models\Asset::class, 'components_assets')->withPivot('id', 'assigned_qty', 'created_at', 'user_id'); } /** @@ -117,7 +122,7 @@ class Component extends SnipeModel */ public function admin() { - return $this->belongsTo('\App\Models\User', 'user_id'); + return $this->belongsTo(\App\Models\User::class, 'user_id'); } /** @@ -129,7 +134,7 @@ class Component extends SnipeModel */ public function company() { - return $this->belongsTo('\App\Models\Company', 'company_id'); + return $this->belongsTo(\App\Models\Company::class, 'company_id'); } /** @@ -141,7 +146,7 @@ class Component extends SnipeModel */ public function category() { - return $this->belongsTo('\App\Models\Category', 'category_id'); + return $this->belongsTo(\App\Models\Category::class, 'category_id'); } /** @@ -153,7 +158,7 @@ class Component extends SnipeModel */ public function assetlog() { - return $this->hasMany('\App\Models\Actionlog', 'item_id')->where('item_type', Component::class)->orderBy('created_at', 'desc')->withTrashed(); + return $this->hasMany(\App\Models\Actionlog::class, 'item_id')->where('item_type', self::class)->orderBy('created_at', 'desc')->withTrashed(); } /** @@ -186,40 +191,39 @@ class Component extends SnipeModel } /** - * Query builder scope to order on company - * - * @param \Illuminate\Database\Query\Builder $query Query builder instance - * @param string $order Order - * - * @return \Illuminate\Database\Query\Builder Modified query builder - */ + * Query builder scope to order on company + * + * @param \Illuminate\Database\Query\Builder $query Query builder instance + * @param string $order Order + * + * @return \Illuminate\Database\Query\Builder Modified query builder + */ public function scopeOrderCategory($query, $order) { return $query->join('categories', 'components.category_id', '=', 'categories.id')->orderBy('categories.name', $order); } /** - * Query builder scope to order on company - * - * @param \Illuminate\Database\Query\Builder $query Query builder instance - * @param string $order Order - * - * @return \Illuminate\Database\Query\Builder Modified query builder - */ + * Query builder scope to order on company + * + * @param \Illuminate\Database\Query\Builder $query Query builder instance + * @param string $order Order + * + * @return \Illuminate\Database\Query\Builder Modified query builder + */ public function scopeOrderLocation($query, $order) { return $query->leftJoin('locations', 'components.location_id', '=', 'locations.id')->orderBy('locations.name', $order); } - /** - * Query builder scope to order on company - * - * @param \Illuminate\Database\Query\Builder $query Query builder instance - * @param string $order Order - * - * @return \Illuminate\Database\Query\Builder Modified query builder - */ + * Query builder scope to order on company + * + * @param \Illuminate\Database\Query\Builder $query Query builder instance + * @param string $order Order + * + * @return \Illuminate\Database\Query\Builder Modified query builder + */ public function scopeOrderCompany($query, $order) { return $query->leftJoin('companies', 'components.company_id', '=', 'companies.id')->orderBy('companies.name', $order); diff --git a/app/Models/Consumable.php b/app/Models/Consumable.php index 14de8c6ebb..2d456e12c4 100644 --- a/app/Models/Consumable.php +++ b/app/Models/Consumable.php @@ -1,53 +1,53 @@ 'datetime', 'requestable' => 'boolean', 'category_id' => 'integer', 'company_id' => 'integer', 'qty' => 'integer', - 'min_amt' => 'integer', - ]; - - + 'min_amt' => 'integer', ]; /** - * Category validation rules - */ - public $rules = array( + * Category validation rules + */ + public $rules = [ 'name' => 'required|min:3|max:255', 'qty' => 'required|integer|min:0', 'category_id' => 'required|integer', 'company_id' => 'integer|nullable', 'min_amt' => 'integer|min:0|nullable', 'purchase_cost' => 'numeric|nullable', - ); + ]; /** - * Whether the model should inject it's identifier to the unique - * validation rules before attempting validation. If this property - * is not set in the model it will default to true. - * - * @var boolean - */ + * Whether the model should inject it's identifier to the unique + * validation rules before attempting validation. If this property + * is not set in the model it will default to true. + * + * @var bool + */ protected $injectUniqueIdentifier = true; use ValidatingTrait; @@ -68,27 +68,27 @@ class Consumable extends SnipeModel 'purchase_cost', 'purchase_date', 'qty', - 'requestable' + 'requestable', ]; use Searchable; - + /** * The attributes that should be included when searching the model. - * + * * @var array */ - protected $searchableAttributes = ['name', 'order_number', 'purchase_cost', 'purchase_date', 'item_no']; + protected $searchableAttributes = ['name', 'order_number', 'purchase_cost', 'purchase_date', 'item_no', 'model_number']; /** * The relations and their attributes that should be included when searching the model. - * + * * @var array */ protected $searchableRelations = [ 'category' => ['name'], 'company' => ['name'], - 'location' => ['name'], + 'location' => ['name'], 'manufacturer' => ['name'], ]; @@ -111,7 +111,6 @@ class Consumable extends SnipeModel $value = null; } $this->attributes['requestable'] = filter_var($value, FILTER_VALIDATE_BOOLEAN); - return; } /** @@ -123,7 +122,7 @@ class Consumable extends SnipeModel */ public function admin() { - return $this->belongsTo('\App\Models\User', 'user_id'); + return $this->belongsTo(\App\Models\User::class, 'user_id'); } /** @@ -135,7 +134,7 @@ class Consumable extends SnipeModel */ public function consumableAssignments() { - return $this->hasMany('\App\Models\ConsumableAssignment'); + return $this->hasMany(\App\Models\ConsumableAssignment::class); } /** @@ -147,7 +146,7 @@ class Consumable extends SnipeModel */ public function company() { - return $this->belongsTo('\App\Models\Company', 'company_id'); + return $this->belongsTo(\App\Models\Company::class, 'company_id'); } /** @@ -159,7 +158,7 @@ class Consumable extends SnipeModel */ public function manufacturer() { - return $this->belongsTo('\App\Models\Manufacturer', 'manufacturer_id'); + return $this->belongsTo(\App\Models\Manufacturer::class, 'manufacturer_id'); } /** @@ -171,7 +170,7 @@ class Consumable extends SnipeModel */ public function location() { - return $this->belongsTo('\App\Models\Location', 'location_id'); + return $this->belongsTo(\App\Models\Location::class, 'location_id'); } /** @@ -183,10 +182,9 @@ class Consumable extends SnipeModel */ public function category() { - return $this->belongsTo('\App\Models\Category', 'category_id'); + return $this->belongsTo(\App\Models\Category::class, 'category_id'); } - /** * Establishes the component -> action logs relationship * @@ -196,7 +194,7 @@ class Consumable extends SnipeModel */ public function assetlog() { - return $this->hasMany('\App\Models\Actionlog', 'item_id')->where('item_type', Consumable::class)->orderBy('created_at', 'desc')->withTrashed(); + return $this->hasMany(\App\Models\Actionlog::class, 'item_id')->where('item_type', self::class)->orderBy('created_at', 'desc')->withTrashed(); } /** @@ -206,12 +204,13 @@ class Consumable extends SnipeModel * @since [v3.0] * @return string | false */ - public function getImageUrl() { + public function getImageUrl() + { if ($this->image) { return Storage::disk('public')->url(app('consumables_upload_path').$this->image); } - return false; + return false; } /** @@ -223,17 +222,16 @@ class Consumable extends SnipeModel */ public function users() { - return $this->belongsToMany('\App\Models\User', 'consumables_users', 'consumable_id', 'assigned_to')->withPivot('user_id')->withTrashed()->withTimestamps(); + return $this->belongsToMany(\App\Models\User::class, 'consumables_users', 'consumable_id', 'assigned_to')->withPivot('user_id')->withTrashed()->withTimestamps(); } - /** * Determine whether to send a checkin/checkout email based on * asset model category * * @author [A. Gianotto] [] * @since [v4.0] - * @return boolean + * @return bool */ public function checkin_email() { @@ -245,7 +243,7 @@ class Consumable extends SnipeModel * * @author [A. Gianotto] [] * @since [v4.0] - * @return boolean + * @return bool */ public function requireAcceptance() { @@ -262,17 +260,15 @@ class Consumable extends SnipeModel */ public function getEula() { - $Parsedown = new \Parsedown(); if ($this->category->eula_text) { return $Parsedown->text(e($this->category->eula_text)); - } elseif ((Setting::getSettings()->default_eula_text) && ($this->category->use_default_eula=='1')) { + } elseif ((Setting::getSettings()->default_eula_text) && ($this->category->use_default_eula == '1')) { return $Parsedown->text(e(Setting::getSettings()->default_eula_text)); } else { return null; } - } /** @@ -287,30 +283,31 @@ class Consumable extends SnipeModel $checkedout = $this->users->count(); $total = $this->qty; $remaining = $total - $checkedout; + return $remaining; } /** - * Query builder scope to order on company - * - * @param \Illuminate\Database\Query\Builder $query Query builder instance - * @param string $order Order - * - * @return \Illuminate\Database\Query\Builder Modified query builder - */ + * Query builder scope to order on company + * + * @param \Illuminate\Database\Query\Builder $query Query builder instance + * @param string $order Order + * + * @return \Illuminate\Database\Query\Builder Modified query builder + */ public function scopeOrderCategory($query, $order) { return $query->join('categories', 'consumables.category_id', '=', 'categories.id')->orderBy('categories.name', $order); } /** - * Query builder scope to order on location - * - * @param \Illuminate\Database\Query\Builder $query Query builder instance - * @param text $order Order - * - * @return \Illuminate\Database\Query\Builder Modified query builder - */ + * Query builder scope to order on location + * + * @param \Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return \Illuminate\Database\Query\Builder Modified query builder + */ public function scopeOrderLocation($query, $order) { return $query->leftJoin('locations', 'consumables.location_id', '=', 'locations.id')->orderBy('locations.name', $order); @@ -329,15 +326,14 @@ class Consumable extends SnipeModel return $query->leftJoin('manufacturers', 'consumables.manufacturer_id', '=', 'manufacturers.id')->orderBy('manufacturers.name', $order); } - /** - * Query builder scope to order on company - * - * @param \Illuminate\Database\Query\Builder $query Query builder instance - * @param string $order Order - * - * @return \Illuminate\Database\Query\Builder Modified query builder - */ + * Query builder scope to order on company + * + * @param \Illuminate\Database\Query\Builder $query Query builder instance + * @param string $order Order + * + * @return \Illuminate\Database\Query\Builder Modified query builder + */ public function scopeOrderCompany($query, $order) { return $query->leftJoin('companies', 'consumables.company_id', '=', 'companies.id')->orderBy('companies.name', $order); diff --git a/app/Models/ConsumableAssignment.php b/app/Models/ConsumableAssignment.php index d8d684ca27..1e21a7f7d2 100644 --- a/app/Models/ConsumableAssignment.php +++ b/app/Models/ConsumableAssignment.php @@ -1,4 +1,5 @@ belongsTo('\App\Models\Consumable'); + return $this->belongsTo(\App\Models\Consumable::class); } public function user() { - return $this->belongsTo('\App\Models\User', 'assigned_to'); + return $this->belongsTo(\App\Models\User::class, 'assigned_to'); } public function admin() { - return $this->belongsTo('\App\Models\User', 'user_id'); + return $this->belongsTo(\App\Models\User::class, 'user_id'); } } diff --git a/app/Models/CustomField.php b/app/Models/CustomField.php index 76ae0dd0f1..0f58055254 100644 --- a/app/Models/CustomField.php +++ b/app/Models/CustomField.php @@ -1,8 +1,10 @@ ] * @since [v3.0] */ - public static $table_name = "assets"; + public static $table_name = 'assets'; /** * Convert the custom field's name property to a db-safe string. @@ -81,11 +84,11 @@ class CustomField extends Model * * @author [A. Gianotto] [] * @since [v3.4] - * @return String + * @return string */ public static function name_to_db_name($name) { - return "_snipeit_" . preg_replace("/[^a-zA-Z0-9]/", "_", strtolower($name)); + return '_snipeit_'.preg_replace('/[^a-zA-Z0-9]/', '_', strtolower($name)); } /** @@ -98,7 +101,7 @@ class CustomField extends Model * * @author [A. Gianotto] [] * @since [v3.4] - * @return Boolean + * @return bool */ public static function boot() { @@ -107,12 +110,12 @@ class CustomField extends Model // Column already exists on the assets table - nothing to do here. // This *shouldn't* happen in the wild. - if (Schema::hasColumn(CustomField::$table_name, $custom_field->convertUnicodeDbSlug())) { + if (Schema::hasColumn(self::$table_name, $custom_field->convertUnicodeDbSlug())) { return false; } // Update the column name in the assets table - Schema::table(CustomField::$table_name, function ($table) use ($custom_field) { + Schema::table(self::$table_name, function ($table) use ($custom_field) { $table->text($custom_field->convertUnicodeDbSlug())->nullable(); }); @@ -121,13 +124,11 @@ class CustomField extends Model $custom_field->save(); }); - self::updating(function ($custom_field) { // Column already exists on the assets table - nothing to do here. - if ($custom_field->isDirty("name")) { - - if (Schema::hasColumn(CustomField::$table_name, $custom_field->convertUnicodeDbSlug())) { + if ($custom_field->isDirty('name')) { + if (Schema::hasColumn(self::$table_name, $custom_field->convertUnicodeDbSlug())) { return true; } @@ -137,8 +138,8 @@ class CustomField extends Model $platform->registerDoctrineTypeMapping('enum', 'string'); // Rename the field if the name has changed - Schema::table(CustomField::$table_name, function ($table) use ($custom_field) { - $table->renameColumn($custom_field->convertUnicodeDbSlug($custom_field->getOriginal("name")), $custom_field->convertUnicodeDbSlug()); + Schema::table(self::$table_name, function ($table) use ($custom_field) { + $table->renameColumn($custom_field->convertUnicodeDbSlug($custom_field->getOriginal('name')), $custom_field->convertUnicodeDbSlug()); }); // Save the updated column name to the custom fields table @@ -147,13 +148,13 @@ class CustomField extends Model return true; } + return true; }); - // Drop the assets column if we've deleted it from custom fields self::deleting(function ($custom_field) { - return Schema::table(CustomField::$table_name, function ($table) use ($custom_field) { + return Schema::table(self::$table_name, function ($table) use ($custom_field) { $table->dropColumn($custom_field->convertUnicodeDbSlug()); }); }); @@ -168,7 +169,7 @@ class CustomField extends Model */ public function fieldset() { - return $this->belongsToMany('\App\Models\CustomFieldset'); + return $this->belongsToMany(\App\Models\CustomFieldset::class); } /** @@ -180,7 +181,7 @@ class CustomField extends Model */ public function user() { - return $this->belongsTo('\App\Models\User'); + return $this->belongsTo(\App\Models\User::class); } /** @@ -192,7 +193,7 @@ class CustomField extends Model */ public function defaultValues() { - return $this->belongsToMany('\App\Models\AssetModel', 'models_custom_fields')->withPivot('default_value'); + return $this->belongsToMany(\App\Models\AssetModel::class, 'models_custom_fields')->withPivot('default_value'); } /** @@ -217,11 +218,11 @@ class CustomField extends Model * @author [A. Gianotto] [] * @param $value string * @since [v3.0] - * @return boolean + * @return bool */ public function check_format($value) { - return preg_match('/^'.$this->attributes['format'].'$/', $value)===1; + return preg_match('/^'.$this->attributes['format'].'$/', $value) === 1; } /** @@ -270,9 +271,9 @@ class CustomField extends Model public function setFormatAttribute($value) { if (isset(self::PREDEFINED_FORMATS[$value])) { - $this->attributes['format']=self::PREDEFINED_FORMATS[$value]; + $this->attributes['format'] = self::PREDEFINED_FORMATS[$value]; } else { - $this->attributes['format']=$value; + $this->attributes['format'] = $value; } } @@ -286,17 +287,16 @@ class CustomField extends Model public function formatFieldValuesAsArray() { $result = []; - $arr = preg_split("/\\r\\n|\\r|\\n/", $this->field_values); + $arr = preg_split('/\\r\\n|\\r|\\n/', $this->field_values); - if (($this->element!='checkbox') && ($this->element!='radio')) { + if (($this->element != 'checkbox') && ($this->element != 'radio')) { $result[''] = 'Select '.strtolower($this->format); } - for ($x = 0; $x < count($arr); $x++) { $arr_parts = explode('|', $arr[$x]); - if ($arr_parts[0]!='') { - if (key_exists('1', $arr_parts)) { + if ($arr_parts[0] != '') { + if (array_key_exists('1', $arr_parts)) { $result[$arr_parts[0]] = $arr_parts[1]; } else { $result[$arr_parts[0]] = $arr_parts[0]; @@ -304,7 +304,6 @@ class CustomField extends Model } } - return $result; } @@ -313,17 +312,17 @@ class CustomField extends Model * * @author [A. Gianotto] [] * @since [v3.4] - * @return boolean + * @return bool */ public function isFieldDecryptable($string) { - if (($this->field_encrypted=='1') && ($string!='')) { + if (($this->field_encrypted == '1') && ($string != '')) { return true; } + return false; } - /** * Convert non-UTF-8 or weirdly encoded text into something that * won't break the database. @@ -337,52 +336,52 @@ class CustomField extends Model $name = $original ? $original : $this->name; $id = $this->id ? $this->id : 'xx'; - if (!function_exists('transliterator_transliterate')) { - $long_slug = '_snipeit_' . str_slug(\Patchwork\Utf8::utf8_encode(trim($name)), '_'); + if (! function_exists('transliterator_transliterate')) { + $long_slug = '_snipeit_'.str_slug(\Patchwork\Utf8::utf8_encode(trim($name)), '_'); } else { - $long_slug = '_snipeit_' . Utf8Slugger::slugify($name, '_'); + $long_slug = '_snipeit_'.Utf8Slugger::slugify($name, '_'); } - return substr($long_slug, 0, 50) . '_' . $id; + return substr($long_slug, 0, 50).'_'.$id; } /** - * Get validation rules for custom fields to use with Validator - * @author [V. Cordes] [] - * @param int $id - * @since [v4.1.10] - * @return array - */ + * Get validation rules for custom fields to use with Validator + * @author [V. Cordes] [] + * @param int $id + * @since [v4.1.10] + * @return array + */ public function validationRules($regex_format = null) { return [ - "name" => "required|unique:custom_fields", - "element" => [ - "required", - Rule::in(['text', 'listbox', 'textarea', 'checkbox', 'radio']) + 'name' => 'required|unique:custom_fields', + 'element' => [ + 'required', + Rule::in(['text', 'listbox', 'textarea', 'checkbox', 'radio']), ], 'format' => [ - Rule::in(array_merge(array_keys(CustomField::PREDEFINED_FORMATS), CustomField::PREDEFINED_FORMATS, [$regex_format])) + Rule::in(array_merge(array_keys(self::PREDEFINED_FORMATS), self::PREDEFINED_FORMATS, [$regex_format])), ], - 'field_encrypted' => "nullable|boolean" + 'field_encrypted' => 'nullable|boolean', ]; } /** * Check to see if there is a custom regex format type * @see https://github.com/snipe/snipe-it/issues/5896 - * - * @author Wes Hulette - * + * + * @author Wes Hulette + * * @since 5.0.0 - * + * * @return string */ public function getFormatType() { - if(stripos($this->format,'regex') === 0 && ($this->format !== self::PREDEFINED_FORMATS['MAC'])) { - return 'CUSTOM REGEX'; - } + if (stripos($this->format, 'regex') === 0 && ($this->format !== self::PREDEFINED_FORMATS['MAC'])) { + return 'CUSTOM REGEX'; + } return $this->format; } diff --git a/app/Models/CustomFieldset.php b/app/Models/CustomFieldset.php index 157c193b41..bcbe0b81d9 100644 --- a/app/Models/CustomFieldset.php +++ b/app/Models/CustomFieldset.php @@ -1,22 +1,25 @@ "required|unique:custom_fieldsets" + 'name' => 'required|unique:custom_fieldsets', ]; /** @@ -24,11 +27,10 @@ class CustomFieldset extends Model * validation rules before attempting validation. If this property * is not set in the model it will default to true. * - * @var boolean + * @var bool */ protected $injectUniqueIdentifier = true; - /** * Establishes the fieldset -> field relationship * @@ -38,7 +40,7 @@ class CustomFieldset extends Model */ public function fields() { - return $this->belongsToMany('\App\Models\CustomField')->withPivot(["required","order"])->orderBy("pivot_order"); + return $this->belongsToMany(\App\Models\CustomField::class)->withPivot(['required', 'order'])->orderBy('pivot_order'); } /** @@ -50,7 +52,7 @@ class CustomFieldset extends Model */ public function models() { - return $this->hasMany('\App\Models\AssetModel', "fieldset_id"); + return $this->hasMany(\App\Models\AssetModel::class, 'fieldset_id'); } /** @@ -62,7 +64,7 @@ class CustomFieldset extends Model */ public function user() { - return $this->belongsTo('\App\Models\User'); //WARNING - not all CustomFieldsets have a User!! + return $this->belongsTo(\App\Models\User::class); //WARNING - not all CustomFieldsets have a User!! } /** @@ -75,18 +77,19 @@ class CustomFieldset extends Model */ public function validation_rules() { - $rules=[]; + $rules = []; foreach ($this->fields as $field) { $rule = []; - if (($field->field_encrypted!='1') || - (($field->field_encrypted =='1') && (Gate::allows('admin')) )) { - $rule[] = ($field->pivot->required=='1') ? "required" : "nullable"; + if (($field->field_encrypted != '1') || + (($field->field_encrypted == '1') && (Gate::allows('admin')))) { + $rule[] = ($field->pivot->required == '1') ? 'required' : 'nullable'; } array_push($rule, $field->attributes['format']); - $rules[$field->db_column_name()]=$rule; + $rules[$field->db_column_name()] = $rule; } + return $rules; } } diff --git a/app/Models/Department.php b/app/Models/Department.php index 96aa4dd860..7be99d097b 100644 --- a/app/Models/Department.php +++ b/app/Models/Department.php @@ -4,16 +4,19 @@ namespace App\Models; use App\Http\Traits\UniqueUndeletedTrait; use App\Models\Traits\Searchable; +use Illuminate\Database\Eloquent\Factories\HasFactory; use Watson\Validating\ValidatingTrait; class Department extends SnipeModel { + use HasFactory; + /** * Whether the model should inject it's identifier to the unique * validation rules before attempting validation. If this property * is not set in the model it will default to true. * - * @var boolean + * @var bool */ protected $injectUniqueIdentifier = true; @@ -47,17 +50,17 @@ class Department extends SnipeModel ]; use Searchable; - + /** * The attributes that should be included when searching the model. - * + * * @var array */ protected $searchableAttributes = ['name', 'notes']; /** * The relations and their attributes that should be included when searching the model. - * + * * @var array */ protected $searchableRelations = []; @@ -71,10 +74,9 @@ class Department extends SnipeModel */ public function company() { - return $this->belongsTo('\App\Models\Company', 'company_id'); + return $this->belongsTo(\App\Models\Company::class, 'company_id'); } - /** * Establishes the department -> users relationship * @@ -84,10 +86,9 @@ class Department extends SnipeModel */ public function users() { - return $this->hasMany('\App\Models\User', 'department_id'); + return $this->hasMany(\App\Models\User::class, 'department_id'); } - /** * Establishes the department -> manager relationship * @@ -97,7 +98,7 @@ class Department extends SnipeModel */ public function manager() { - return $this->belongsTo('\App\Models\User', 'manager_id'); + return $this->belongsTo(\App\Models\User::class, 'manager_id'); } /** @@ -109,9 +110,9 @@ class Department extends SnipeModel */ public function location() { - return $this->belongsTo('\App\Models\Location', 'location_id'); + return $this->belongsTo(\App\Models\Location::class, 'location_id'); } - + /** * Query builder scope to order on location name * @@ -137,6 +138,4 @@ class Department extends SnipeModel { return $query->leftJoin('users as department_user', 'departments.manager_id', '=', 'department_user.id')->orderBy('department_user.first_name', $order)->orderBy('department_user.last_name', $order); } - - } diff --git a/app/Models/Depreciable.php b/app/Models/Depreciable.php index fde9530c45..35f494233b 100644 --- a/app/Models/Depreciable.php +++ b/app/Models/Depreciable.php @@ -1,11 +1,12 @@ belongsTo('\App\Models\Depreciation', 'depreciation_id'); + return $this->belongsTo(\App\Models\Depreciation::class, 'depreciation_id'); } public function get_depreciation() @@ -35,10 +36,9 @@ class Depreciable extends SnipeModel /** * @return float|int */ - public function getDepreciatedValue() { - if (!$this->get_depreciation()) { // will never happen + if (! $this->get_depreciation()) { // will never happen return $this->purchase_cost; } @@ -47,11 +47,11 @@ class Depreciable extends SnipeModel } $depreciation = 0; $setting = Setting::getSettings(); - switch($setting->depreciation_method) { + switch ($setting->depreciation_method) { case 'half_1': $depreciation = $this->getHalfYearDepreciatedValue(true); break; - + case 'half_2': $depreciation = $this->getHalfYearDepreciatedValue(false); break; @@ -59,22 +59,27 @@ class Depreciable extends SnipeModel default: $depreciation = $this->getLinearDepreciatedValue(); } + return $depreciation; } /** * @return float|int */ - public function getLinearDepreciatedValue() { // fraction of value left - $months_remaining = $this->time_until_depreciated()->m + 12*$this->time_until_depreciated()->y; //UGlY - $current_value = round(($months_remaining/ $this->get_depreciation()->months) * $this->purchase_cost, 2); + $months_remaining = $this->time_until_depreciated()->m + 12 * $this->time_until_depreciated()->y; //UGlY + $current_value = round(($months_remaining / $this->get_depreciation()->months) * $this->purchase_cost, 2); + if($this->get_depreciation()->depreciation_min > $current_value) { + + $current_value=$this->get_depreciation()->depreciation_min; + } if ($current_value < 0) { $current_value = 0; } + return $current_value; } @@ -82,55 +87,56 @@ class Depreciable extends SnipeModel * @param onlyHalfFirstYear Boolean always applied only second half of the first year * @return float|int */ - public function getHalfYearDepreciatedValue($onlyHalfFirstYear = false) + public function getHalfYearDepreciatedValue($onlyHalfFirstYear = false) { // @link http://www.php.net/manual/en/class.dateinterval.php $current_date = $this->getDateTime(); $purchase_date = date_create($this->purchase_date); - $currentYear = $this->get_fiscal_year( $current_date ); - $purchaseYear = $this->get_fiscal_year( $purchase_date ); + $currentYear = $this->get_fiscal_year($current_date); + $purchaseYear = $this->get_fiscal_year($purchase_date); $yearsPast = $currentYear - $purchaseYear; $deprecationYears = ceil($this->get_depreciation()->months / 12); - if( $onlyHalfFirstYear ) { + if ($onlyHalfFirstYear) { + $yearsPast -= 0.5; + } elseif (! $this->is_first_half_of_year($purchase_date)) { $yearsPast -= 0.5; } - else if( !$this->is_first_half_of_year($purchase_date) ) { - $yearsPast -= 0.5; - } - if( !$this->is_first_half_of_year($current_date) ) { + if (! $this->is_first_half_of_year($current_date)) { $yearsPast += 0.5; } - if($yearsPast >= $deprecationYears) { + if ($yearsPast >= $deprecationYears) { $yearsPast = $deprecationYears; - } - else if($yearsPast < 0) { + } elseif ($yearsPast < 0) { $yearsPast = 0; } + return round($yearsPast / $deprecationYears * $this->purchase_cost, 2); } - + /** - * @param \DateTime $date - * @return int - */ - protected function get_fiscal_year($date) { + * @param \DateTime $date + * @return int + */ + protected function get_fiscal_year($date) + { $year = intval($date->format('Y')); // also, maybe it'll have to set fiscal year date - if($date->format('nj') === '1231') { + if ($date->format('nj') === '1231') { return $year; - } - else { + } else { return $year - 1; } } /** - * @param \DateTime $date - * @return bool - */ - protected function is_first_half_of_year($date) { + * @param \DateTime $date + * @return bool + */ + protected function is_first_half_of_year($date) + { $date0m0d = intval($date->format('md')); + return ($date0m0d < 601) || ($date0m0d >= 1231); } @@ -142,22 +148,23 @@ class Depreciable extends SnipeModel // @link http://www.php.net/manual/en/class.dateinterval.php $interval = $d1->diff($d2); - if (!$interval->invert) { + if (! $interval->invert) { return $interval; } else { - return new \DateInterval("PT0S"); //null interval (zero seconds from now) + return new \DateInterval('PT0S'); //null interval (zero seconds from now) } } public function depreciated_date() { $date = date_create($this->purchase_date); - date_add($date, date_interval_create_from_date_string($this->get_depreciation()->months . ' months')); + date_add($date, date_interval_create_from_date_string($this->get_depreciation()->months.' months')); + return $date; //date_format($date, 'Y-m-d'); //don't bake-in format, for internationalization } // it's necessary for unit tests - protected function getDateTime($time = null) + protected function getDateTime($time = null) { return new \DateTime($time); } diff --git a/app/Models/Depreciation.php b/app/Models/Depreciation.php index c706f2f1e7..39fb935494 100755 --- a/app/Models/Depreciation.php +++ b/app/Models/Depreciation.php @@ -1,27 +1,31 @@ 'required|min:3|max:255|unique:depreciations,name', 'months' => 'required|max:3600|integer', - ); + ]; /** - * Whether the model should inject it's identifier to the unique - * validation rules before attempting validation. If this property - * is not set in the model it will default to true. - * - * @var boolean - */ + * Whether the model should inject it's identifier to the unique + * validation rules before attempting validation. If this property + * is not set in the model it will default to true. + * + * @var bool + */ protected $injectUniqueIdentifier = true; use ValidatingTrait; @@ -30,20 +34,20 @@ class Depreciation extends SnipeModel * * @var array */ - protected $fillable = ['name','months']; + protected $fillable = ['name', 'months']; use Searchable; - + /** * The attributes that should be included when searching the model. - * + * * @var array */ protected $searchableAttributes = ['name', 'months']; /** * The relations and their attributes that should be included when searching the model. - * + * * @var array */ protected $searchableRelations = []; @@ -57,10 +61,9 @@ class Depreciation extends SnipeModel */ public function models() { - return $this->hasMany('\App\Models\AssetModel', 'depreciation_id'); + return $this->hasMany(\App\Models\AssetModel::class, 'depreciation_id'); } - /** * Establishes the depreciation -> licenses relationship * @@ -70,6 +73,6 @@ class Depreciation extends SnipeModel */ public function licenses() { - return $this->hasMany('\App\Models\License', 'depreciation_id'); - } + return $this->hasMany(\App\Models\License::class, 'depreciation_id'); + } } diff --git a/app/Models/Group.php b/app/Models/Group.php index 25c2505101..a68579adac 100755 --- a/app/Models/Group.php +++ b/app/Models/Group.php @@ -1,39 +1,42 @@ 'required|min:2|max:255', - ); + ]; /** - * Whether the model should inject it's identifier to the unique - * validation rules before attempting validation. If this property - * is not set in the model it will default to true. - * - * @var boolean - */ + * Whether the model should inject it's identifier to the unique + * validation rules before attempting validation. If this property + * is not set in the model it will default to true. + * + * @var bool + */ protected $injectUniqueIdentifier = true; use ValidatingTrait; - use Searchable; - + /** * The attributes that should be included when searching the model. - * + * * @var array */ protected $searchableAttributes = ['name', 'created_at']; /** * The relations and their attributes that should be included when searching the model. - * + * * @var array */ protected $searchableRelations = []; @@ -47,7 +50,7 @@ class Group extends SnipeModel */ public function users() { - return $this->belongsToMany('\App\Models\User', 'users_groups'); + return $this->belongsToMany(\App\Models\User::class, 'users_groups'); } /** diff --git a/app/Models/ICompanyableChild.php b/app/Models/ICompanyableChild.php index 0f24598ec9..b435ee00a4 100644 --- a/app/Models/ICompanyableChild.php +++ b/app/Models/ICompanyableChild.php @@ -1,4 +1,5 @@ 'array', 'first_row' => 'array', - 'field_map' => 'json' + 'field_map' => 'json', ]; } diff --git a/app/Models/Ldap.php b/app/Models/Ldap.php index f06da90581..6b23fd54ec 100644 --- a/app/Models/Ldap.php +++ b/app/Models/Ldap.php @@ -1,16 +1,16 @@ Settings. * @@ -18,30 +18,27 @@ class Ldap extends Model * @since [v3.0] * @return connection */ - public static function connectToLdap() { - - $ldap_host = Setting::getSettings()->ldap_server; + $ldap_host = Setting::getSettings()->ldap_server; $ldap_version = Setting::getSettings()->ldap_version; $ldap_server_cert_ignore = Setting::getSettings()->ldap_server_cert_ignore; $ldap_use_tls = Setting::getSettings()->ldap_tls; - // If we are ignoring the SSL cert we need to setup the environment variable // before we create the connection - if ($ldap_server_cert_ignore=='1') { + if ($ldap_server_cert_ignore == '1') { putenv('LDAPTLS_REQCERT=never'); } // If the user specifies where CA Certs are, make sure to use them - if (env("LDAPTLS_CACERT")) { - putenv("LDAPTLS_CACERT=".env("LDAPTLS_CACERT")); + if (env('LDAPTLS_CACERT')) { + putenv('LDAPTLS_CACERT='.env('LDAPTLS_CACERT')); } $connection = @ldap_connect($ldap_host); - if (!$connection) { + if (! $connection) { throw new Exception('Could not connect to LDAP server at '.$ldap_host.'. Please check your LDAP server name and port number in your settings.'); } @@ -50,10 +47,16 @@ class Ldap extends Model ldap_set_option($connection, LDAP_OPT_PROTOCOL_VERSION, $ldap_version); ldap_set_option($connection, LDAP_OPT_NETWORK_TIMEOUT, 20); + if (Setting::getSettings()->ldap_client_tls_cert && Setting::getSettings()->ldap_client_tls_key) { + ldap_set_option($connection, LDAP_OPT_X_TLS_CERTFILE, Setting::get_client_side_cert_path()); + ldap_set_option($connection, LDAP_OPT_X_TLS_KEYFILE, Setting::get_client_side_key_path()); + } + if ($ldap_use_tls=='1') { ldap_start_tls($connection); } + return $connection; } @@ -69,61 +72,55 @@ class Ldap extends Model * @return bool true if the username and/or password provided are valid * false if the username and/or password provided are invalid * array of ldap_attributes if $user is true - * */ - static function findAndBindUserLdap($username, $password) + public static function findAndBindUserLdap($username, $password) { $settings = Setting::getSettings(); - $connection = Ldap::connectToLdap(); - $ldap_username_field = $settings->ldap_username_field; - $baseDn = $settings->ldap_basedn; - $userDn = $ldap_username_field.'='.$username.','.$settings->ldap_basedn; + $connection = self::connectToLdap(); + $ldap_username_field = $settings->ldap_username_field; + $baseDn = $settings->ldap_basedn; + $userDn = $ldap_username_field.'='.$username.','.$settings->ldap_basedn; - if ($settings->is_ad =='1') { + if ($settings->is_ad == '1') { // Check if they are using the userprincipalname for the username field. // If they are, we can skip building the UPN to authenticate against AD - if ($ldap_username_field=='userprincipalname') { + if ($ldap_username_field == 'userprincipalname') { $userDn = $username; } else { // In case they haven't added an AD domain - $userDn = ($settings->ad_domain != '') ? $username.'@'.$settings->ad_domain : $username.'@'.$settings->email_domain; + $userDn = ($settings->ad_domain != '') ? $username.'@'.$settings->ad_domain : $username.'@'.$settings->email_domain; } - } \Log::debug('Attempting to login using distinguished name:'.$userDn); - - $filterQuery = $settings->ldap_auth_filter_query . $username; + $filterQuery = $settings->ldap_auth_filter_query.$username; $filter = Setting::getSettings()->ldap_filter; $filterQuery = "({$filter}({$filterQuery}))"; \Log::debug('Filter query: '.$filterQuery); - - if (!$ldapbind = @ldap_bind($connection, $userDn, $password)) { - if(!$ldapbind = Ldap::bindAdminToLdap($connection)){ + if (! $ldapbind = @ldap_bind($connection, $userDn, $password)) { + if (! $ldapbind = self::bindAdminToLdap($connection)) { return false; } } - if (!$results = ldap_search($connection, $baseDn, $filterQuery)) { + if (! $results = ldap_search($connection, $baseDn, $filterQuery)) { throw new Exception('Could not search LDAP: '); } - if (!$entry = ldap_first_entry($connection, $results)) { + if (! $entry = ldap_first_entry($connection, $results)) { return false; } - if (!$user = ldap_get_attributes($connection, $entry)) { + if (! $user = ldap_get_attributes($connection, $entry)) { return false; } return array_change_key_case($user); - } - /** * Binds/authenticates an admin to LDAP for LDAP searching/syncing. * Here we also return a better error if the app key is donked. @@ -133,26 +130,23 @@ class Ldap extends Model * @param bool|false $user * @return bool true if the username and/or password provided are valid * false if the username and/or password provided are invalid - * */ - static function bindAdminToLdap($connection) + public static function bindAdminToLdap($connection) { + $ldap_username = Setting::getSettings()->ldap_uname; $ldap_username = Setting::getSettings()->ldap_uname; // Lets return some nicer messages for users who donked their app key, and disable LDAP try { - $ldap_pass = \Crypt::decrypt(Setting::getSettings()->ldap_pword); + $ldap_pass = \Crypt::decrypt(Setting::getSettings()->ldap_pword); } catch (Exception $e) { - throw new Exception('Your app key has changed! Could not decrypt LDAP password using your current app key, so LDAP authentication has been disabled. Login with a local account, update the LDAP password and re-enable it in Admin > Settings.'); } - - if (!$ldapbind = @ldap_bind($connection, $ldap_username, $ldap_pass)) { + if (! $ldapbind = @ldap_bind($connection, $ldap_username, $ldap_pass)) { throw new Exception('Could not bind to LDAP: '.ldap_error($connection)); } - } @@ -165,7 +159,7 @@ class Ldap extends Model * @param $ldapatttibutes * @return array|bool */ - static function parseAndMapLdapAttributes($ldapattributes) + public static function parseAndMapLdapAttributes($ldapattributes) { //Get LDAP attribute config $ldap_result_username = Setting::getSettings()->ldap_username_field; @@ -175,22 +169,21 @@ class Ldap extends Model $ldap_result_email = Setting::getSettings()->ldap_email; $ldap_result_phone = Setting::getSettings()->ldap_phone; $ldap_result_jobtitle = Setting::getSettings()->ldap_jobtitle; - $ldap_result_country = Setting::getSettings()->ldap_country; + $ldap_result_country = Setting::getSettings()->ldap_country; $ldap_result_dept = Setting::getSettings()->ldap_dept; // Get LDAP user data - $item = array(); - $item["username"] = isset($ldapattributes[$ldap_result_username][0]) ? $ldapattributes[$ldap_result_username][0] : ""; - $item["employee_number"] = isset($ldapattributes[$ldap_result_emp_num][0]) ? $ldapattributes[$ldap_result_emp_num][0] : ""; - $item["lastname"] = isset($ldapattributes[$ldap_result_last_name][0]) ? $ldapattributes[$ldap_result_last_name][0] : ""; - $item["firstname"] = isset($ldapattributes[$ldap_result_first_name][0]) ? $ldapattributes[$ldap_result_first_name][0] : ""; - $item["email"] = isset($ldapattributes[$ldap_result_email][0]) ? $ldapattributes[$ldap_result_email][0] : "" ; - $item["telephone"] = isset($ldapattributes[$ldap_result_phone][0]) ?$ldapattributes[$ldap_result_phone][0] : ""; - $item["jobtitle"] = isset($ldapattributes[$ldap_result_jobtitle][0]) ? $ldapattributes[$ldap_result_jobtitle][0] : ""; - $item["country"] = isset($ldapattributes[$ldap_result_country][0]) ? $ldapattributes[$ldap_result_country][0] : ""; - $item["department"] = isset($ldapattributes[$ldap_result_dept][0]) ? $ldapattributes[$ldap_result_dept][0] : ""; + $item = []; + $item['username'] = isset($ldapattributes[$ldap_result_username][0]) ? $ldapattributes[$ldap_result_username][0] : ''; + $item['employee_number'] = isset($ldapattributes[$ldap_result_emp_num][0]) ? $ldapattributes[$ldap_result_emp_num][0] : ''; + $item['lastname'] = isset($ldapattributes[$ldap_result_last_name][0]) ? $ldapattributes[$ldap_result_last_name][0] : ''; + $item['firstname'] = isset($ldapattributes[$ldap_result_first_name][0]) ? $ldapattributes[$ldap_result_first_name][0] : ''; + $item['email'] = isset($ldapattributes[$ldap_result_email][0]) ? $ldapattributes[$ldap_result_email][0] : ''; + $item['telephone'] = isset($ldapattributes[$ldap_result_phone][0]) ? $ldapattributes[$ldap_result_phone][0] : ''; + $item['jobtitle'] = isset($ldapattributes[$ldap_result_jobtitle][0]) ? $ldapattributes[$ldap_result_jobtitle][0] : ''; + $item['country'] = isset($ldapattributes[$ldap_result_country][0]) ? $ldapattributes[$ldap_result_country][0] : ''; + $item['department'] = isset($ldapattributes[$ldap_result_dept][0]) ? $ldapattributes[$ldap_result_dept][0] : ''; + return $item; - - } /** @@ -201,23 +194,22 @@ class Ldap extends Model * @param $ldapatttibutes * @return array|bool */ - static function createUserFromLdap($ldapatttibutes) + public static function createUserFromLdap($ldapatttibutes) { - $item = Ldap::parseAndMapLdapAttributes($ldapatttibutes); - + $item = self::parseAndMapLdapAttributes($ldapatttibutes); // Create user from LDAP data - if (!empty($item["username"])) { + if (! empty($item['username'])) { $user = new User; - $user->first_name = $item["firstname"]; - $user->last_name = $item["lastname"]; - $user->username = $item["username"]; - $user->email = $item["email"]; + $user->first_name = $item['firstname']; + $user->last_name = $item['lastname']; + $user->username = $item['username']; + $user->email = $item['email']; - if (Setting::getSettings()->ldap_pw_sync=='1') { - $user->password = bcrypt(Input::get("password")); + if (Setting::getSettings()->ldap_pw_sync == '1') { + $user->password = bcrypt(Input::get('password')); } else { - $pass = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 25); + $pass = substr(str_shuffle('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'), 0, 25); $user->password = bcrypt($pass); } @@ -229,12 +221,11 @@ class Ldap extends Model return $user; } else { LOG::debug('Could not create user.'.$user->getErrors()); - throw new Exception("Could not create user: ".$user->getErrors()); + throw new Exception('Could not create user: '.$user->getErrors()); } } return false; - } /** @@ -246,11 +237,10 @@ class Ldap extends Model * @param $base_dn * @return array|bool */ - static function findLdapUsers($base_dn = null) + public static function findLdapUsers($base_dn = null) { - - $ldapconn = Ldap::connectToLdap(); - $ldap_bind = Ldap::bindAdminToLdap($ldapconn); + $ldapconn = self::connectToLdap(); + $ldap_bind = self::bindAdminToLdap($ldapconn); // Default to global base DN if nothing else is provided. if (is_null($base_dn)) { $base_dn = Setting::getSettings()->ldap_basedn; @@ -260,33 +250,32 @@ class Ldap extends Model // Set up LDAP pagination for very large databases $page_size = 500; $cookie = ''; - $result_set = array(); + $result_set = []; $global_count = 0; // Perform the search do { // Paginate (non-critical, if not supported by server) - if (!$ldap_paging = @ldap_control_paged_result($ldapconn, $page_size, false, $cookie)) { + if (! $ldap_paging = @ldap_control_paged_result($ldapconn, $page_size, false, $cookie)) { throw new Exception('Problem with your LDAP connection. Try checking the Use TLS setting in Admin > Settings. '); } if ($filter != '' && substr($filter, 0, 1) != '(') { // wrap parens around NON-EMPTY filters that DON'T have them, for back-compatibility with AdLdap2-based filters $filter = "($filter)"; } elseif ($filter == '') { - $filter = "(cn=*)"; + $filter = '(cn=*)'; } - $search_results = ldap_search($ldapconn, $base_dn, $filter); - if (!$search_results) { + if (! $search_results) { return redirect()->route('users.index')->with('error', trans('admin/users/message.error.ldap_could_not_search').ldap_error($ldapconn)); // FIXME this is never called in any routed context - only from the Artisan command. So this redirect will never work. } // Get results from page $results = ldap_get_entries($ldapconn, $search_results); - if (!$results) { + if (! $results) { return redirect()->route('users.index')->with('error', trans('admin/users/message.error.ldap_could_not_get_entries').ldap_error($ldapconn)); // FIXME this is never called in any routed context - only from the Artisan command. So this redirect will never work. } @@ -295,17 +284,13 @@ class Ldap extends Model $result_set = array_merge($result_set, $results); @ldap_control_paged_result_response($ldapconn, $search_results, $cookie); - } while ($cookie !== null && $cookie != ''); - // Clean up after search $result_set['count'] = $global_count; $results = $result_set; @ldap_control_paged_result($ldapconn, 0); return $results; - - } } diff --git a/app/Models/License.php b/app/Models/License.php index 8f0fbdfaab..21af9549cb 100755 --- a/app/Models/License.php +++ b/app/Models/License.php @@ -1,10 +1,12 @@ 'datetime', + 'expiration_date' => 'datetime', + 'termination_date' => 'datetime', 'seats' => 'integer', 'category_id' => 'integer', 'company_id' => 'integer', ]; - protected $rules = array( + protected $rules = [ 'name' => 'required|string|min:3|max:255', 'seats' => 'required|min:1|max:999|integer', 'license_email' => 'email|nullable|max:120', @@ -51,13 +48,13 @@ class License extends Depreciable 'notes' => 'string|nullable', 'category_id' => 'required|exists:categories,id', 'company_id' => 'integer|nullable', - ); + ]; - /** - * The attributes that are mass assignable. - * - * @var array - */ + /** + * The attributes that are mass assignable. + * + * @var array + */ protected $fillable = [ 'company_id', 'depreciation_id', @@ -82,26 +79,26 @@ class License extends Depreciable ]; use Searchable; - + /** * The attributes that should be included when searching the model. - * + * * @var array */ protected $searchableAttributes = [ - 'name', - 'serial', - 'notes', - 'order_number', - 'purchase_order', - 'purchase_cost', + 'name', + 'serial', + 'notes', + 'order_number', + 'purchase_order', + 'purchase_cost', 'purchase_date', 'expiration_date', ]; /** * The relations and their attributes that should be included when searching the model. - * + * * @var array */ protected $searchableRelations = [ @@ -123,12 +120,14 @@ class License extends Depreciable // We need to listen for created for the initial setup so that we have a license ID. static::created(function ($license) { $newSeatCount = $license->getAttributes()['seats']; + return static::adjustSeatCount($license, $oldSeatCount = 0, $newSeatCount); }); // However, we listen for updating to be able to prevent the edit if we cannot delete enough seats. static::updating(function ($license) { $newSeatCount = $license->getAttributes()['seats']; $oldSeatCount = isset($license->getOriginal()['seats']) ? $license->getOriginal()['seats'] : 0; + return static::adjustSeatCount($license, $oldSeatCount, $newSeatCount); }); } @@ -143,7 +142,7 @@ class License extends Depreciable public static function adjustSeatCount($license, $oldSeats, $newSeats) { // If the seats haven't changed, continue on happily. - if ($oldSeats==$newSeats) { + if ($oldSeats == $newSeats) { return true; } // On Create, we just make one for each of the seats. @@ -153,24 +152,26 @@ class License extends Depreciable // Need to delete seats... lets see if if we have enough. $seatsAvailableForDelete = $license->licenseseats->reject(function ($seat) { - return (!! $seat->assigned_to) || (!! $seat->asset_id); + return ((bool) $seat->assigned_to) || ((bool) $seat->asset_id); }); if ($change > $seatsAvailableForDelete->count()) { Session::flash('error', trans('admin/licenses/message.assoc_users')); + return false; } - for ($i=1; $i <= $change; $i++) { + for ($i = 1; $i <= $change; $i++) { $seatsAvailableForDelete->pop()->delete(); } // Log Deletion of seats. $logAction = new Actionlog; - $logAction->item_type = License::class; + $logAction->item_type = self::class; $logAction->item_id = $license->id; $logAction->user_id = Auth::id() ?: 1; // We don't have an id while running the importer from CLI. $logAction->note = "deleted ${change} seats"; - $logAction->target_id = null; + $logAction->target_id = null; $logAction->logaction('delete seats'); + return true; } // Else we're adding seats. @@ -183,13 +184,14 @@ class License extends Depreciable if ($license->id) { //Log the addition of license to the log. $logAction = new Actionlog(); - $logAction->item_type = License::class; + $logAction->item_type = self::class; $logAction->item_id = $license->id; $logAction->user_id = Auth::id() ?: 1; // Importer. $logAction->note = "added ${change} seats"; - $logAction->target_id = null; + $logAction->target_id = null; $logAction->logaction('add seats'); } + return true; } @@ -226,7 +228,6 @@ class License extends Depreciable */ public function setExpirationDateAttribute($value) { - if ($value == '' || $value == '0000-00-00') { $value = null; } else { @@ -261,7 +262,7 @@ class License extends Depreciable */ public function company() { - return $this->belongsTo('\App\Models\Company', 'company_id'); + return $this->belongsTo(\App\Models\Company::class, 'company_id'); } /** @@ -273,7 +274,7 @@ class License extends Depreciable */ public function category() { - return $this->belongsTo('\App\Models\Category', 'category_id'); + return $this->belongsTo(\App\Models\Category::class, 'category_id'); } /** @@ -285,7 +286,7 @@ class License extends Depreciable */ public function manufacturer() { - return $this->belongsTo('\App\Models\Manufacturer', 'manufacturer_id'); + return $this->belongsTo(\App\Models\Manufacturer::class, 'manufacturer_id'); } /** @@ -293,7 +294,7 @@ class License extends Depreciable * * @author A. Gianotto * @since [v2.0] - * @return boolean + * @return bool */ public function checkin_email() { @@ -305,7 +306,7 @@ class License extends Depreciable * * @author A. Gianotto * @since [v4.0] - * @return boolean + * @return bool */ public function requireAcceptance() { @@ -342,7 +343,7 @@ class License extends Depreciable */ public function assignedusers() { - return $this->belongsToMany('\App\Models\User', 'license_seats', 'assigned_to', 'license_id'); + return $this->belongsToMany(\App\Models\User::class, 'license_seats', 'assigned_to', 'license_id'); } /** @@ -354,8 +355,8 @@ class License extends Depreciable */ public function assetlog() { - return $this->hasMany('\App\Models\Actionlog', 'item_id') - ->where('item_type', '=', License::class) + return $this->hasMany(\App\Models\Actionlog::class, 'item_id') + ->where('item_type', '=', self::class) ->orderBy('created_at', 'desc'); } @@ -368,14 +369,13 @@ class License extends Depreciable */ public function uploads() { - return $this->hasMany('\App\Models\Actionlog', 'item_id') - ->where('item_type', '=', License::class) + return $this->hasMany(\App\Models\Actionlog::class, 'item_id') + ->where('item_type', '=', self::class) ->where('action_type', '=', 'uploaded') ->whereNotNull('filename') ->orderBy('created_at', 'desc'); } - /** * Establishes the license -> admin user relationship * @@ -385,7 +385,7 @@ class License extends Depreciable */ public function adminuser() { - return $this->belongsTo('\App\Models\User', 'user_id'); + return $this->belongsTo(\App\Models\User::class, 'user_id'); } /** @@ -403,7 +403,6 @@ class License extends Depreciable ->count(); } - /** * Return the number of seats for this asset * @@ -538,8 +537,9 @@ class License extends Depreciable public function remaincount() { $total = $this->licenseSeatsCount; - $taken = $this->assigned_seats_count; - $diff = ($total - $taken); + $taken = $this->assigned_seats_count; + $diff = ($total - $taken); + return $diff; } @@ -552,9 +552,10 @@ class License extends Depreciable */ public function totalcount() { - $avail = $this->availSeatsCount; - $taken = $this->assignedcount(); - $diff = ($avail + $taken); + $avail = $this->availSeatsCount; + $taken = $this->assignedcount(); + $diff = ($avail + $taken); + return $diff; } @@ -567,7 +568,7 @@ class License extends Depreciable */ public function licenseseats() { - return $this->hasMany('\App\Models\LicenseSeat'); + return $this->hasMany(\App\Models\LicenseSeat::class); } /** @@ -579,10 +580,9 @@ class License extends Depreciable */ public function supplier() { - return $this->belongsTo('\App\Models\Supplier', 'supplier_id'); + return $this->belongsTo(\App\Models\Supplier::class, 'supplier_id'); } - /** * Gets the next available free seat - used by * the API to populate next_seat @@ -603,7 +603,6 @@ class License extends Depreciable ->first(); } - /** * Establishes the license -> free seats relationship * @@ -613,7 +612,7 @@ class License extends Depreciable */ public function freeSeats() { - return $this->hasMany('\App\Models\LicenseSeat')->whereNull('assigned_to')->whereNull('deleted_at')->whereNull('asset_id'); + return $this->hasMany(\App\Models\LicenseSeat::class)->whereNull('assigned_to')->whereNull('deleted_at')->whereNull('asset_id'); } /** @@ -627,14 +626,12 @@ class License extends Depreciable */ public static function getExpiringLicenses($days = 60) { - - return License::whereNotNull('expiration_date') + return self::whereNotNull('expiration_date') ->whereNull('deleted_at') ->whereRaw(DB::raw('DATE_SUB(`expiration_date`,INTERVAL '.$days.' DAY) <= DATE(NOW()) ')) - ->where('expiration_date', '>', date("Y-m-d")) + ->where('expiration_date', '>', date('Y-m-d')) ->orderBy('expiration_date', 'ASC') ->get(); - } /** diff --git a/app/Models/LicenseSeat.php b/app/Models/LicenseSeat.php index 40a53adf86..2207edd02c 100755 --- a/app/Models/LicenseSeat.php +++ b/app/Models/LicenseSeat.php @@ -1,4 +1,5 @@ * @since [v4.0] - * @return boolean + * @return bool */ public function requireAcceptance() { return $this->license->category->require_acceptance; } - public function getEula() { + public function getEula() + { return $this->license->getEula(); } - + /** * Establishes the seat -> license relationship * @@ -62,7 +63,7 @@ class LicenseSeat extends SnipeModel implements ICompanyableChild */ public function license() { - return $this->belongsTo('\App\Models\License', 'license_id'); + return $this->belongsTo(\App\Models\License::class, 'license_id'); } /** @@ -74,7 +75,7 @@ class LicenseSeat extends SnipeModel implements ICompanyableChild */ public function user() { - return $this->belongsTo('\App\Models\User', 'assigned_to')->withTrashed(); + return $this->belongsTo(\App\Models\User::class, 'assigned_to')->withTrashed(); } /** @@ -86,7 +87,7 @@ class LicenseSeat extends SnipeModel implements ICompanyableChild */ public function asset() { - return $this->belongsTo('\App\Models\Asset', 'asset_id')->withTrashed(); + return $this->belongsTo(\App\Models\Asset::class, 'asset_id')->withTrashed(); } /** @@ -101,13 +102,11 @@ class LicenseSeat extends SnipeModel implements ICompanyableChild { if (($this->user) && ($this->user->location)) { return $this->user->location; - } elseif (($this->asset) && ($this->asset->location)) { return $this->asset->location; } return false; - } /** @@ -120,12 +119,8 @@ class LicenseSeat extends SnipeModel implements ICompanyableChild */ public function scopeOrderDepartments($query, $order) { - return $query->leftJoin('users as license_seat_users', 'license_seats.assigned_to', '=', 'license_seat_users.id') - ->leftJoin('departments as license_user_dept', 'license_user_dept.id', '=', 'license_seat_users.department_id') + return $query->leftJoin('users as license_seat_users', 'license_seats.assigned_to', '=', 'license_seat_users.id') + ->leftJoin('departments as license_user_dept', 'license_user_dept.id', '=', 'license_seat_users.department_id') ->orderBy('license_user_dept.name', $order); } - - - - } diff --git a/app/Models/Location.php b/app/Models/Location.php index 1f48f96e77..a85c8905e0 100755 --- a/app/Models/Location.php +++ b/app/Models/Location.php @@ -1,4 +1,5 @@ 'required|min:2|max:255|unique_undeleted', 'city' => 'min:2|max:255|nullable', 'country' => 'min:2|max:255|nullable', @@ -28,8 +32,8 @@ class Location extends SnipeModel 'address2' => 'max:80|nullable', 'zip' => 'min:3|max:10|nullable', 'manager_id' => 'exists:users,id|nullable', - 'parent_id' => 'non_circular:locations,id' - ); + 'parent_id' => 'non_circular:locations,id', + ]; protected $casts = [ 'parent_id' => 'integer', @@ -37,17 +41,16 @@ class Location extends SnipeModel ]; /** - * Whether the model should inject it's identifier to the unique - * validation rules before attempting validation. If this property - * is not set in the model it will default to true. - * - * @var boolean - */ + * Whether the model should inject it's identifier to the unique + * validation rules before attempting validation. If this property + * is not set in the model it will default to true. + * + * @var bool + */ protected $injectUniqueIdentifier = true; use ValidatingTrait; use UniqueUndeletedTrait; - /** * The attributes that are mass assignable. * @@ -70,41 +73,41 @@ class Location extends SnipeModel protected $hidden = ['user_id']; use Searchable; - + /** * The attributes that should be included when searching the model. - * + * * @var array */ protected $searchableAttributes = ['name', 'address', 'city', 'state', 'zip', 'created_at', 'ldap_ou']; /** * The relations and their attributes that should be included when searching the model. - * + * * @var array */ protected $searchableRelations = [ - 'parent' => ['name'] + 'parent' => ['name'], ]; public function isDeletable() { return Gate::allows('delete', $this) - && ($this->assignedAssets()->count()===0) - && ($this->assets()->count()===0) - && ($this->users()->count()===0); + && ($this->assignedAssets()->count() === 0) + && ($this->assets()->count() === 0) + && ($this->users()->count() === 0); } public function users() { - return $this->hasMany('\App\Models\User', 'location_id'); + return $this->hasMany(\App\Models\User::class, 'location_id'); } public function assets() { - return $this->hasMany('\App\Models\Asset', 'location_id') + return $this->hasMany(\App\Models\Asset::class, 'location_id') ->whereHas('assetstatus', function ($query) { - $query->where('status_labels.deployable', '=', 1) + $query->where('status_labels.deployable', '=', 1) ->orWhere('status_labels.pending', '=', 1) ->orWhere('status_labels.archived', '=', 0); }); @@ -117,35 +120,36 @@ class Location extends SnipeModel definitely was setting fire to the query-planner. So don't do that. It is arguable that we should have a '...->whereNull('assigned_to') - bit in there, but that isn't always correct either (in the case + bit in there, but that isn't always correct either (in the case where a user has no location, for example). In all likelyhood, we need to denorm an "effective_location" column into Assets to make this slightly less miserable. */ - return $this->hasMany('\App\Models\Asset', 'rtd_location_id'); + return $this->hasMany(\App\Models\Asset::class, 'rtd_location_id'); } public function parent() { - return $this->belongsTo('\App\Models\Location', 'parent_id','id') + return $this->belongsTo(self::class, 'parent_id', 'id') ->with('parent'); } public function manager() { - return $this->belongsTo('\App\Models\User', 'manager_id'); + return $this->belongsTo(\App\Models\User::class, 'manager_id'); } - public function children() { - return $this->hasMany('\App\Models\Location','parent_id') + public function children() + { + return $this->hasMany(self::class, 'parent_id') ->with('children'); } // I don't think we need this anymore since we de-normed location_id in assets? public function assignedAssets() { - return $this->morphMany('App\Models\Asset', 'assigned', 'assigned_type', 'assigned_to')->withTrashed(); + return $this->morphMany(\App\Models\Asset::class, 'assigned', 'assigned_type', 'assigned_to')->withTrashed(); } public function setLdapOuAttribute($ldap_ou) @@ -153,7 +157,6 @@ class Location extends SnipeModel return $this->attributes['ldap_ou'] = empty($ldap_ou) ? null : $ldap_ou; } - /** * Query builder scope to order on parent * @@ -162,42 +165,38 @@ class Location extends SnipeModel * * @return Illuminate\Database\Query\Builder Modified query builder */ + public static function indenter($locations_with_children, $parent_id = null, $prefix = '') + { + $results = []; - public static function indenter($locations_with_children, $parent_id = null, $prefix = '') { - $results = Array(); - - - if (!array_key_exists($parent_id, $locations_with_children)) { + if (! array_key_exists($parent_id, $locations_with_children)) { return []; } - foreach ($locations_with_children[$parent_id] as $location) { $location->use_text = $prefix.' '.$location->name; $location->use_image = ($location->image) ? url('/').'/uploads/locations/'.$location->image : null; $results[] = $location; //now append the children. (if we have any) if (array_key_exists($location->id, $locations_with_children)) { - $results = array_merge($results, Location::indenter($locations_with_children, $location->id,$prefix.'--')); + $results = array_merge($results, self::indenter($locations_with_children, $location->id, $prefix.'--')); } } + return $results; } - - - /** - * Query builder scope to order on parent - * - * @param Illuminate\Database\Query\Builder $query Query builder instance - * @param text $order Order - * - * @return Illuminate\Database\Query\Builder Modified query builder - */ + * Query builder scope to order on parent + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ public function scopeOrderParent($query, $order) { - // Left join here, or it will only return results with parents + // Left join here, or it will only return results with parents return $query->leftJoin('locations as parent_loc', 'locations.parent_id', '=', 'parent_loc.id')->orderBy('parent_loc.name', $order); } diff --git a/app/Models/Loggable.php b/app/Models/Loggable.php index 501b5057ca..3c44009aab 100644 --- a/app/Models/Loggable.php +++ b/app/Models/Loggable.php @@ -2,19 +2,17 @@ namespace App\Models; +use App\Models\Setting; use App\Notifications\AuditNotification; use Illuminate\Support\Facades\Auth; -use App\Models\Setting; trait Loggable { - /** * @author Daniel Meltzer * @since [v3.4] * @return \App\Models\Actionlog */ - public function log() { return $this->morphMany(Actionlog::class, 'item'); @@ -33,20 +31,21 @@ trait Loggable $log->user_id = Auth::user()->id; } - if (!isset($target)) { + if (! isset($target)) { throw new \Exception('All checkout logs require a target.'); + return; } - if (!isset($target->id)) { + if (! isset($target->id)) { throw new \Exception('That target seems invalid (no target ID available).'); + return; } $log->target_type = get_class($target); $log->target_id = $target->id; - // Figure out what the target is if ($log->target_type == Location::class) { $log->location_id = $target->id; @@ -59,7 +58,7 @@ trait Loggable $log->note = $note; $log->action_date = $action_date; - if (!$log->action_date) { + if (! $log->action_date) { $log->action_date = date('Y-m-d H:i:s'); } @@ -69,8 +68,8 @@ trait Loggable } /** - * Helper method to determine the log item type - */ + * Helper method to determine the log item type + */ private function determineLogItemType($log) { // We need to special case licenses because of license_seat vs license. So much for clean polymorphism : @@ -84,6 +83,7 @@ trait Loggable return $log; } + /** * @author Daniel Meltzer * @since [v3.4] @@ -100,7 +100,6 @@ trait Loggable $log->item_type = License::class; $log->item_id = $this->license_id; } else { - $log->item_type = static::class; $log->item_id = $this->id; @@ -109,17 +108,15 @@ trait Loggable $asset->increment('checkin_counter', 1); } } - } - $log->location_id = null; $log->note = $note; if (Auth::user()) { $log->user_id = Auth::user()->id; } - + $log->logaction('checkin from'); // $params = [ @@ -158,7 +155,6 @@ trait Loggable return $log; } - /** * @author A. Gianotto * @since [v4.0] @@ -186,15 +182,13 @@ trait Loggable 'filename' => $log->filename, 'admin' => $log->user, 'location' => ($location) ? $location->name : '', - 'note' => $note + 'note' => $note, ]; Setting::getSettings()->notify(new AuditNotification($params)); return $log; } - - /** * @author Daniel Meltzer * @since [v3.5] @@ -219,6 +213,7 @@ trait Loggable $log->user_id = $user_id; $log->logaction('create'); $log->save(); + return $log; } @@ -239,9 +234,9 @@ trait Loggable } $log->user_id = Auth::user()->id; $log->note = $note; - $log->target_id = null; - $log->created_at = date("Y-m-d H:i:s"); - $log->filename = $filename; + $log->target_id = null; + $log->created_at = date('Y-m-d H:i:s'); + $log->filename = $filename; $log->logaction('uploaded'); return $log; diff --git a/app/Models/Manufacturer.php b/app/Models/Manufacturer.php index 085bed2d3f..5f01c3c273 100755 --- a/app/Models/Manufacturer.php +++ b/app/Models/Manufacturer.php @@ -1,37 +1,41 @@ 'required|min:2|max:255|unique:manufacturers,name,NULL,id,deleted_at,NULL', 'url' => 'url|nullable', 'support_url' => 'url|nullable', - 'support_email' => 'email|nullable' - ); + 'support_email' => 'email|nullable', + ]; protected $hidden = ['user_id']; /** - * Whether the model should inject it's identifier to the unique - * validation rules before attempting validation. If this property - * is not set in the model it will default to true. - * - * @var boolean - */ + * Whether the model should inject it's identifier to the unique + * validation rules before attempting validation. If this property + * is not set in the model it will default to true. + * + * @var bool + */ protected $injectUniqueIdentifier = true; use ValidatingTrait; @@ -65,38 +69,37 @@ class Manufacturer extends SnipeModel */ protected $searchableRelations = []; - public function isDeletable() { - return (Gate::allows('delete', $this) - && ($this->assets()->count() === 0) + return Gate::allows('delete', $this) + && ($this->assets()->count() === 0) && ($this->licenses()->count() === 0) && ($this->consumables()->count() === 0) - && ($this->accessories()->count() === 0)); + && ($this->accessories()->count() === 0); } public function assets() { - return $this->hasManyThrough('\App\Models\Asset', '\App\Models\AssetModel', 'manufacturer_id', 'model_id'); + return $this->hasManyThrough(\App\Models\Asset::class, \App\Models\AssetModel::class, 'manufacturer_id', 'model_id'); } public function models() { - return $this->hasMany('\App\Models\AssetModel', 'manufacturer_id'); + return $this->hasMany(\App\Models\AssetModel::class, 'manufacturer_id'); } public function licenses() { - return $this->hasMany('\App\Models\License', 'manufacturer_id'); + return $this->hasMany(\App\Models\License::class, 'manufacturer_id'); } public function accessories() { - return $this->hasMany('\App\Models\Accessory', 'manufacturer_id'); + return $this->hasMany(\App\Models\Accessory::class, 'manufacturer_id'); } public function consumables() { - return $this->hasMany('\App\Models\Consumable', 'manufacturer_id'); + return $this->hasMany(\App\Models\Consumable::class, 'manufacturer_id'); } } diff --git a/app/Models/PredefinedKit.php b/app/Models/PredefinedKit.php index 317cf3cd6a..1bf6cb098b 100644 --- a/app/Models/PredefinedKit.php +++ b/app/Models/PredefinedKit.php @@ -1,4 +1,5 @@ ] * @version v1.0 */ class PredefinedKit extends SnipeModel { - protected $presenter = 'App\Presenters\PredefinedKitPresenter'; + protected $presenter = \App\Presenters\PredefinedKitPresenter::class; use Presentable; protected $table = 'kits'; /** * Category validation rules */ - public $rules = array( - 'name' => 'required|min:1|max:255|unique' - ); + public $rules = [ + 'name' => 'required|min:1|max:255|unique', + ]; use ValidatingTrait; public $modelRules = [ 'model_id' => 'required|exists:models,id', 'quantity' => 'required|integer|min:1', - 'pivot_id' => 'integer|exists:kits_models,id' + 'pivot_id' => 'integer|exists:kits_models,id', ]; /** @@ -39,7 +40,7 @@ class PredefinedKit extends SnipeModel * @param int $model_id * @param bool $new = true if append a new element to kit */ - public function makeModelRules($model_id, $new=false) + public function makeModelRules($model_id, $new = false) { return $this->_makeRuleHelper('models', 'kits_models', 'model_id', $model_id, $new); } @@ -50,7 +51,7 @@ class PredefinedKit extends SnipeModel * @param int $license_id * @param bool $new = true if append a new element to kit */ - public function makeLicenseRules($license_id, $new=false) + public function makeLicenseRules($license_id, $new = false) { return $this->_makeRuleHelper('licenses', 'kits_licenses', 'license_id', $license_id, $new); } @@ -61,7 +62,7 @@ class PredefinedKit extends SnipeModel * @param int $accessoriy_id * @param bool $new = true if append a new element to kit */ - public function makeAccessoryRules($accessory_id, $new=false) + public function makeAccessoryRules($accessory_id, $new = false) { return $this->_makeRuleHelper('accessories', 'kits_accessories', 'accessory_id', $accessory_id, $new); } @@ -72,7 +73,7 @@ class PredefinedKit extends SnipeModel * @param int $consumable_id * @param bool $new = true if append a new element to kit */ - public function makeConsumableRules($consumable_id, $new=false) + public function makeConsumableRules($consumable_id, $new = false) { return $this->_makeRuleHelper('consumables', 'kits_consumables', 'consumable_id', $consumable_id, $new); } @@ -96,14 +97,14 @@ class PredefinedKit extends SnipeModel $pivot_elem_key => [ 'required', "exists:$table,id", - Rule::unique($pivot_table)->whereNot($pivot_elem_key, $element_id)->where('kit_id', $this->id) + Rule::unique($pivot_table)->whereNot($pivot_elem_key, $element_id)->where('kit_id', $this->id), ], - 'quantity' => 'required|integer|min:1' + 'quantity' => 'required|integer|min:1', ]; - if (!$new) { + if (! $new) { $rule['pivot_id'] = "integer|exists:$pivot_table,id"; - } + return $rule; } @@ -113,38 +114,37 @@ class PredefinedKit extends SnipeModel * @var array */ protected $fillable = [ - 'name' + 'name', ]; use Searchable; /** * The attributes that should be included when searching the kit. - * + * * @var array */ protected $searchableAttributes = ['name']; /** * The relations and their attributes that should be included when searching the kit. - * + * * @var array */ protected $searchableRelations = []; - /** * Establishes the kits -> models relationship * @return \Illuminate\Database\Eloquent\Relations\Relation */ public function models() { - return $this->belongsToMany('\App\Models\AssetModel', 'kits_models', 'kit_id', 'model_id')->withPivot('id', 'quantity'); + return $this->belongsToMany(\App\Models\AssetModel::class, 'kits_models', 'kit_id', 'model_id')->withPivot('id', 'quantity'); } public function assets() { - return $this->hasManyThrough('\App\Models\Asset', '\App\Models\AssetModel', 'country_id', 'user_id'); + return $this->hasManyThrough(\App\Models\Asset::class, \App\Models\AssetModel::class, 'country_id', 'user_id'); } /** @@ -153,7 +153,7 @@ class PredefinedKit extends SnipeModel */ public function licenses() { - return $this->belongsToMany('\App\Models\License', 'kits_licenses', 'kit_id', 'license_id')->withPivot('id', 'quantity'); + return $this->belongsToMany(\App\Models\License::class, 'kits_licenses', 'kit_id', 'license_id')->withPivot('id', 'quantity'); } /** @@ -162,7 +162,7 @@ class PredefinedKit extends SnipeModel */ public function consumables() { - return $this->belongsToMany('\App\Models\Consumable', 'kits_consumables', 'kit_id', 'consumable_id')->withPivot('id', 'quantity'); + return $this->belongsToMany(\App\Models\Consumable::class, 'kits_consumables', 'kit_id', 'consumable_id')->withPivot('id', 'quantity'); } /** @@ -171,7 +171,7 @@ class PredefinedKit extends SnipeModel */ public function accessories() { - return $this->belongsToMany('\App\Models\Accessory', 'kits_accessories', 'kit_id', 'accessory_id')->withPivot('id', 'quantity'); + return $this->belongsToMany(\App\Models\Accessory::class, 'kits_accessories', 'kit_id', 'accessory_id')->withPivot('id', 'quantity'); } /** @@ -179,5 +179,4 @@ class PredefinedKit extends SnipeModel * BEGIN QUERY SCOPES * ----------------------------------------------- **/ - } diff --git a/app/Models/Recipients/AdminRecipient.php b/app/Models/Recipients/AdminRecipient.php index a5311bbcda..0a15557caf 100644 --- a/app/Models/Recipients/AdminRecipient.php +++ b/app/Models/Recipients/AdminRecipient.php @@ -1,14 +1,14 @@ email = $settings->admin_cc_email; } - } diff --git a/app/Models/Requestable.php b/app/Models/Requestable.php index 5fc3f5450f..3983254e41 100644 --- a/app/Models/Requestable.php +++ b/app/Models/Requestable.php @@ -9,7 +9,6 @@ use Illuminate\Support\Facades\Auth; // $asset->whereRequestedBy($user) trait Requestable { - public function requests() { return $this->morphMany(CheckoutRequest::class, 'requestable'); @@ -17,7 +16,7 @@ trait Requestable public function isRequestedBy(User $user) { - return $this->requests->where('canceled_at', NULL)->where('user_id', $user->id)->first(); + return $this->requests->where('canceled_at', null)->where('user_id', $user->id)->first(); } public function scopeRequestedBy($query, User $user) diff --git a/app/Models/Setting.php b/app/Models/Setting.php index 150e290c7c..91e349f9fd 100755 --- a/app/Models/Setting.php +++ b/app/Models/Setting.php @@ -2,6 +2,7 @@ namespace App\Models; +use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Notifications\Notifiable; use Illuminate\Support\Collection; @@ -15,6 +16,7 @@ use Watson\Validating\ValidatingTrait; */ class Setting extends Model { + use HasFactory; use Notifiable, ValidatingTrait; /** @@ -96,7 +98,7 @@ class Setting extends Model * * @return \App\Models\Setting|null */ - public static function getSettings(): ?Setting + public static function getSettings(): ?self { return Cache::rememberForever(self::APP_SETTINGS_KEY, function () { // Need for setup as no tables exist @@ -106,7 +108,7 @@ class Setting extends Model return null; } }); - } + } /** * Check to see if setup process is complete. @@ -116,17 +118,16 @@ class Setting extends Model */ public static function setupCompleted(): bool { - try { - $usercount = User::withTrashed()->count(); - $settingsCount = self::count(); - return $usercount > 0 && $settingsCount > 0; - } catch (\Throwable $th) { - \Log::debug('User table and settings table DO NOT exist or DO NOT have records'); - // Catch the error if the tables dont exit - return false; - } - + try { + $usercount = User::withTrashed()->count(); + $settingsCount = self::count(); + return $usercount > 0 && $settingsCount > 0; + } catch (\Throwable $th) { + \Log::debug('User table and settings table DO NOT exist or DO NOT have records'); + // Catch the error if the tables dont exit + return false; + } } /** @@ -187,9 +188,9 @@ class Setting extends Model * Escapes the custom CSS, and then un-escapes the greater-than symbol * so it can work with direct descendant characters for bootstrap * menu overrides like:. - * + * * .skin-blue .sidebar-menu>li.active>a, .skin-blue .sidebar-menu>li:hover>a - * + * * Important: Do not remove the e() escaping here, as we output raw in the blade. * * @return string escaped CSS @@ -210,14 +211,14 @@ class Setting extends Model } /** - * Converts bytes into human readable file size. - * - * @param string $bytes + * Converts bytes into human readable file size. * - * @return string human readable file size (2,87 Мб) + * @param string $bytes * - * @author Mogilev Arseny - */ + * @return string human readable file size (2,87 Мб) + * + * @author Mogilev Arseny + */ public static function fileSizeConvert($bytes): string { $bytes = floatval($bytes); @@ -244,15 +245,15 @@ class Setting extends Model ], ]; - foreach ($arBytes as $arItem) { + foreach ($arBytes as $arItem) { if ($bytes >= $arItem['VALUE']) { $result = $bytes / $arItem['VALUE']; $result = round($result, 2).$arItem['UNIT']; - break; - } + break; } + } - return $result; + return $result; } /** @@ -307,8 +308,6 @@ class Setting extends Model return 'required|min:'.$settings->pwd_secure_min.$security_rules; } - - /** * Get the specific LDAP settings * @@ -342,8 +341,60 @@ class Setting extends Model 'is_ad', 'ad_domain', 'ad_append_domain', + 'ldap_client_tls_key', + 'ldap_client_tls_cert' ])->first()->getAttributes(); return collect($ldapSettings); } + + /** + * Return the filename for the client-side SSL cert + * + * @var string + */ + public static function get_client_side_cert_path() + { + return storage_path().'/ldap_client_tls.cert'; + } + + /** + * Return the filename for the client-side SSL key + * + * @var string + */ + public static function get_client_side_key_path() + { + return storage_path().'/ldap_client_tls.key'; + } + + public function update_client_side_cert_files() + { + /** + * I'm not sure if it makes sense to have a cert but no key + * nor vice versa, but for now I'm just leaving it like this. + * + * Also, we could easily set this up with an event handler and + * self::saved() or something like that but there's literally only + * one place where we will do that, so I'll just explicitly call + * this method at that spot instead. It'll be easier to debug and understand. + */ + if ($this->ldap_client_tls_cert) { + file_put_contents(self::get_client_side_cert_path(), $this->ldap_client_tls_cert); + } else { + if (file_exists(self::get_client_side_cert_path())) { + unlink(self::get_client_side_cert_path()); + } + } + + if ($this->ldap_client_tls_key) { + file_put_contents(self::get_client_side_key_path(), $this->ldap_client_tls_key); + } else { + if (file_exists(self::get_client_side_key_path())) { + unlink(self::get_client_side_key_path()); + } + } + } + + } diff --git a/app/Models/SnipeModel.php b/app/Models/SnipeModel.php index 2911be1c38..e5a039a4e1 100644 --- a/app/Models/SnipeModel.php +++ b/app/Models/SnipeModel.php @@ -14,7 +14,6 @@ class SnipeModel extends Model $value = null; } $this->attributes['purchase_date'] = $value; - return; } /** @@ -22,13 +21,12 @@ class SnipeModel extends Model */ public function setPurchaseCostAttribute($value) { - $value = Helper::ParseFloat($value); + $value = Helper::ParseFloat($value); if ($value == '0.0') { $value = null; } $this->attributes['purchase_cost'] = $value; - return; } public function setLocationIdAttribute($value) @@ -37,7 +35,6 @@ class SnipeModel extends Model $value = null; } $this->attributes['location_id'] = $value; - return; } public function setCategoryIdAttribute($value) @@ -47,7 +44,6 @@ class SnipeModel extends Model } $this->attributes['category_id'] = $value; // dd($this->attributes); - return; } public function setSupplierIdAttribute($value) @@ -56,7 +52,6 @@ class SnipeModel extends Model $value = null; } $this->attributes['supplier_id'] = $value; - return; } public function setDepreciationIdAttribute($value) @@ -65,7 +60,6 @@ class SnipeModel extends Model $value = null; } $this->attributes['depreciation_id'] = $value; - return; } public function setManufacturerIdAttribute($value) @@ -74,7 +68,6 @@ class SnipeModel extends Model $value = null; } $this->attributes['manufacturer_id'] = $value; - return; } public function setMinAmtAttribute($value) @@ -83,7 +76,6 @@ class SnipeModel extends Model $value = null; } $this->attributes['min_amt'] = $value; - return; } public function setParentIdAttribute($value) @@ -92,79 +84,70 @@ class SnipeModel extends Model $value = null; } $this->attributes['parent_id'] = $value; - return; } public function setFieldSetIdAttribute($value) { - if($value == '') { + if ($value == '') { $value = null; } $this->attributes['fieldset_id'] = $value; - return; } public function setCompanyIdAttribute($value) { - if($value == '') { + if ($value == '') { $value = null; } $this->attributes['company_id'] = $value; - return; } public function setWarrantyMonthsAttribute($value) { - if($value == '') { + if ($value == '') { $value = null; } $this->attributes['warranty_months'] = $value; - return; } public function setRtdLocationIdAttribute($value) { - if($value == '') { + if ($value == '') { $value = null; } $this->attributes['rtd_location_id'] = $value; - return; } public function setDepartmentIdAttribute($value) { - if($value == '') { + if ($value == '') { $value = null; } $this->attributes['department_id'] = $value; - return; } public function setManagerIdAttribute($value) { - if($value == '') { + if ($value == '') { $value = null; } $this->attributes['manager_id'] = $value; - return; } public function setModelIdAttribute($value) { - if($value == '') { + if ($value == '') { $value = null; } $this->attributes['model_id'] = $value; - return; } public function setStatusIdAttribute($value) { - if($value == '') { + if ($value == '') { $value = null; } $this->attributes['status_id'] = $value; - return; } // diff --git a/app/Models/Statuslabel.php b/app/Models/Statuslabel.php index cd4672b841..da856b4b7f 100755 --- a/app/Models/Statuslabel.php +++ b/app/Models/Statuslabel.php @@ -1,30 +1,32 @@ 'required|string|unique_undeleted', 'notes' => 'string|nullable', 'deployable' => 'required', 'pending' => 'required', 'archived' => 'required', - ); + ]; protected $fillable = [ 'archived', @@ -35,22 +37,21 @@ class Statuslabel extends SnipeModel ]; use Searchable; - + /** * The attributes that should be included when searching the model. - * + * * @var array */ - protected $searchableAttributes = ['name']; + protected $searchableAttributes = ['name', 'notes']; /** * The relations and their attributes that should be included when searching the model. - * + * * @var array */ protected $searchableRelations = []; - /** * Establishes the status label -> assets relationship * @@ -60,7 +61,7 @@ class Statuslabel extends SnipeModel */ public function assets() { - return $this->hasMany('\App\Models\Asset', 'status_id'); + return $this->hasMany(\App\Models\Asset::class, 'status_id'); } /** @@ -72,17 +73,15 @@ class Statuslabel extends SnipeModel */ public function getStatuslabelType() { - - if (($this->pending == '1') && ($this->archived == '0') && ($this->deployable == '0')) { + if (($this->pending == '1') && ($this->archived == '0') && ($this->deployable == '0')) { return 'pending'; - } elseif (($this->pending == '0') && ($this->archived == '1') && ($this->deployable == '0')) { + } elseif (($this->pending == '0') && ($this->archived == '1') && ($this->deployable == '0')) { return 'archived'; - } elseif (($this->pending == '0') && ($this->archived == '0') && ($this->deployable == '0')) { + } elseif (($this->pending == '0') && ($this->archived == '0') && ($this->deployable == '0')) { return 'undeployable'; } return 'deployable'; - } /** @@ -130,7 +129,6 @@ class Statuslabel extends SnipeModel */ public static function getStatuslabelTypesForDB($type) { - $statustype['pending'] = 0; $statustype['deployable'] = 0; $statustype['archived'] = 0; @@ -139,12 +137,10 @@ class Statuslabel extends SnipeModel $statustype['pending'] = 1; $statustype['deployable'] = 0; $statustype['archived'] = 0; - } elseif ($type == 'deployable') { $statustype['pending'] = 0; $statustype['deployable'] = 1; $statustype['archived'] = 0; - } elseif ($type == 'archived') { $statustype['pending'] = 0; $statustype['deployable'] = 0; diff --git a/app/Models/Supplier.php b/app/Models/Supplier.php index 230a713cda..a96fdacdb6 100755 --- a/app/Models/Supplier.php +++ b/app/Models/Supplier.php @@ -1,18 +1,21 @@ 'required|min:1|max:255|unique_undeleted', 'address' => 'max:50|nullable', 'address2' => 'max:50|nullable', @@ -26,43 +29,40 @@ class Supplier extends SnipeModel 'email' => 'email|max:150|nullable', 'zip' => 'max:10|nullable', 'url' => 'sometimes|nullable|string|max:250', - ); + ]; /** - * Whether the model should inject it's identifier to the unique - * validation rules before attempting validation. If this property - * is not set in the model it will default to true. - * - * @var boolean - */ + * Whether the model should inject it's identifier to the unique + * validation rules before attempting validation. If this property + * is not set in the model it will default to true. + * + * @var bool + */ protected $injectUniqueIdentifier = true; use ValidatingTrait; use UniqueUndeletedTrait; - use Searchable; - + /** * The attributes that should be included when searching the model. - * + * * @var array */ protected $searchableAttributes = ['name']; /** * The relations and their attributes that should be included when searching the model. - * + * * @var array */ protected $searchableRelations = []; - /** * The attributes that are mass assignable. * * @var array */ - protected $fillable = ['name','address','address2','city','state','country','zip','phone','fax','email','contact','url','notes']; - + protected $fillable = ['name', 'address', 'address2', 'city', 'state', 'country', 'zip', 'phone', 'fax', 'email', 'contact', 'url', 'notes']; /** * Eager load counts @@ -106,7 +106,7 @@ class Supplier extends SnipeModel */ public function assets() { - return $this->hasMany('\App\Models\Asset', 'supplier_id'); + return $this->hasMany(\App\Models\Asset::class, 'supplier_id'); } /** @@ -118,7 +118,7 @@ class Supplier extends SnipeModel */ public function accessories() { - return $this->hasMany('\App\Models\Accessory', 'supplier_id'); + return $this->hasMany(\App\Models\Accessory::class, 'supplier_id'); } /** @@ -130,7 +130,7 @@ class Supplier extends SnipeModel */ public function asset_maintenances() { - return $this->hasMany('\App\Models\AssetMaintenance', 'supplier_id'); + return $this->hasMany(\App\Models\AssetMaintenance::class, 'supplier_id'); } /** @@ -158,7 +158,7 @@ class Supplier extends SnipeModel */ public function licenses() { - return $this->hasMany('\App\Models\License', 'supplier_id'); + return $this->hasMany(\App\Models\License::class, 'supplier_id'); } /** @@ -184,9 +184,10 @@ class Supplier extends SnipeModel */ public function addhttp($url) { - if (!preg_match("~^(?:f|ht)tps?://~i", $url)) { - $url = "http://" . $url; + if (! preg_match('~^(?:f|ht)tps?://~i', $url)) { + $url = 'http://'.$url; } + return $url; } } diff --git a/app/Models/Traits/Acceptable.php b/app/Models/Traits/Acceptable.php index 4da3575182..b0ddd665a6 100644 --- a/app/Models/Traits/Acceptable.php +++ b/app/Models/Traits/Acceptable.php @@ -9,20 +9,25 @@ use App\Models\User; * * @author Till Deeke */ -trait Acceptable { +trait Acceptable +{ /** * Run after the checkout acceptance was accepted by the user - * + * * @param User $acceptedBy * @param string $signature */ - public function acceptedCheckout(User $acceptedBy, $signature) {} + public function acceptedCheckout(User $acceptedBy, $signature) + { + } /** * Run after the checkout acceptance was declined by the user - * + * * @param User $acceptedBy * @param string $signature - */ - public function declinedCheckout(User $declinedBy, $signature) {} + */ + public function declinedCheckout(User $declinedBy, $signature) + { + } } diff --git a/app/Models/Traits/Searchable.php b/app/Models/Traits/Searchable.php index e43081e557..3661c66226 100644 --- a/app/Models/Traits/Searchable.php +++ b/app/Models/Traits/Searchable.php @@ -7,16 +7,16 @@ use App\Models\CustomField; use Illuminate\Database\Eloquent\Builder; /** - * This trait allows for cleaner searching of models, + * This trait allows for cleaner searching of models, * moving from complex queries to an easier declarative syntax. * * @author Till Deeke */ -trait Searchable { - +trait Searchable +{ /** * Performs a search on the model, using the provided search terms - * + * * @param \Illuminate\Database\Eloquent\Builder $query The query to start the search on * @param string $search * @return \Illuminate\Database\Eloquent\Builder A query with added "where" clauses @@ -27,13 +27,13 @@ trait Searchable { /** * Search the attributes of this model - */ + */ $query = $this->searchAttributes($query, $terms); /** * Search through the custom fields of the model */ - $query = $this->searchCustomFields($query, $terms); + $query = $this->searchCustomFields($query, $terms); /** * Search through the relations of the model @@ -53,32 +53,32 @@ trait Searchable { * @param string $search The search term * @return array An array of search terms */ - private function prepeareSearchTerms($search) { - return explode(' OR ', $search); - } + private function prepeareSearchTerms($search) + { + return explode(' OR ', $search); + } /** * Searches the models attributes for the search terms - * + * * @param Illuminate\Database\Eloquent\Builder $query * @param array $terms * @return Illuminate\Database\Eloquent\Builder */ - private function searchAttributes(Builder $query, array $terms) { - + private function searchAttributes(Builder $query, array $terms) + { $table = $this->getTable(); $firstConditionAdded = false; - foreach($this->getSearchableAttributes() as $column) { - - foreach($terms as $term) { + foreach ($this->getSearchableAttributes() as $column) { + foreach ($terms as $term) { /** * Making sure to only search in date columns if the search term consists of characters that can make up a MySQL timestamp! * * @see https://github.com/snipe/snipe-it/issues/4590 */ - if (!preg_match('/^[0-9 :-]++$/', $term) && in_array($column, $this->getDates())) { + if (! preg_match('/^[0-9 :-]++$/', $term) && in_array($column, $this->getDates())) { continue; } @@ -88,29 +88,30 @@ trait Searchable { * * @todo This does the job, but is inelegant and fragile */ - if (!$firstConditionAdded) { - $query = $query->where($table . '.' . $column, 'LIKE', '%'.$term.'%'); + if (! $firstConditionAdded) { + $query = $query->where($table.'.'.$column, 'LIKE', '%'.$term.'%'); $firstConditionAdded = true; continue; } - - $query = $query->orWhere($table . '.' . $column, 'LIKE', '%'.$term.'%'); + + $query = $query->orWhere($table.'.'.$column, 'LIKE', '%'.$term.'%'); } } - return $query; + return $query; } /** * Searches the models custom fields for the search terms - * - * @param Illuminate\Database\Eloquent\Builder $query + * + * @param Illuminate\Database\Eloquent\Builder $query * @param array $terms * @return Illuminate\Database\Eloquent\Builder */ - private function searchCustomFields(Builder $query, array $terms) { - + private function searchCustomFields(Builder $query, array $terms) + { + /** * If we are searching on something other that an asset, skip custom fields. */ @@ -121,29 +122,27 @@ trait Searchable { $customFields = CustomField::all(); foreach ($customFields as $field) { - foreach($terms as $term) { - $query->orWhere($this->getTable() . '.'. $field->db_column_name(), 'LIKE', '%'.$term.'%'); + foreach ($terms as $term) { + $query->orWhere($this->getTable().'.'.$field->db_column_name(), 'LIKE', '%'.$term.'%'); } } - return $query; - } + return $query; + } /** * Searches the models relations for the search terms - * + * * @param Illuminate\Database\Eloquent\Builder $query * @param array $terms * @return Illuminate\Database\Eloquent\Builder */ - private function searchRelations(Builder $query, array $terms) { - - foreach($this->getSearchableRelations() as $relation => $columns) { - - $query = $query->orWhereHas($relation, function($query) use ($relation, $columns, $terms) { - + private function searchRelations(Builder $query, array $terms) + { + foreach ($this->getSearchableRelations() as $relation => $columns) { + $query = $query->orWhereHas($relation, function ($query) use ($relation, $columns, $terms) { $table = $this->getRelationTable($relation); - + /** * We need to form the query properly, starting with a "where", * otherwise the generated nested select is wrong. @@ -152,72 +151,75 @@ trait Searchable { */ $firstConditionAdded = false; - foreach($columns as $column) { - foreach($terms as $term) { - if (!$firstConditionAdded) { - $query->where($table . '.' . $column, 'LIKE', '%'.$term.'%'); + foreach ($columns as $column) { + foreach ($terms as $term) { + if (! $firstConditionAdded) { + $query->where($table.'.'.$column, 'LIKE', '%'.$term.'%'); $firstConditionAdded = true; continue; } - $query->orWhere($table . '.' . $column, 'LIKE', '%'.$term.'%'); + $query->orWhere($table.'.'.$column, 'LIKE', '%'.$term.'%'); } } }); + } - } - - return $query; + return $query; } /** * Run additional, advanced searches that can't be done using the attributes or relations. * * This is a noop in this trait, but can be overridden in the implementing model, to allow more advanced searches - * + * * @param Illuminate\Database\Eloquent\Builder $query * @param array $terms The search terms * @return Illuminate\Database\Eloquent\Builder * * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ - public function advancedTextSearch(Builder $query, array $terms) { + public function advancedTextSearch(Builder $query, array $terms) + { return $query; - } + } /** * Get the searchable attributes, if defined. Otherwise it returns an empty array - * + * * @return array The attributes to search in */ - private function getSearchableAttributes() { + private function getSearchableAttributes() + { return isset($this->searchableAttributes) ? $this->searchableAttributes : []; } /** * Get the searchable relations, if defined. Otherwise it returns an empty array - * + * * @return array The relations to search in - */ - private function getSearchableRelations() { + */ + private function getSearchableRelations() + { return isset($this->searchableRelations) ? $this->searchableRelations : []; } /** * Get the table name of a relation. * - * This method loops over a relation name, + * This method loops over a relation name, * getting the table name of the last relation in the series. - * So "category" would get the table name for the Category model, + * So "category" would get the table name for the Category model, * "model.manufacturer" would get the tablename for the Manufacturer model. - * + * * @param string $relation * @return string The table name */ - private function getRelationTable($relation) { + private function getRelationTable($relation) + { $related = $this; - foreach(explode('.', $relation) as $relationName) { + foreach (explode('.', $relation) as $relationName) { $related = $related->{$relationName}()->getRelated(); } @@ -249,6 +251,6 @@ trait Searchable { return implode('_', $parts->toArray()); } - return $related->getTable(); + return $related->getTable(); } } diff --git a/app/Models/User.php b/app/Models/User.php index 8f86811c81..492dece3ff 100755 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -1,4 +1,5 @@ 'exists:locations,id|nullable', ]; - /** * The attributes that should be included when searching the model. * @@ -96,7 +98,7 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo 'notes', 'phone', 'jobtitle', - 'employee_num' + 'employee_num', ]; /** @@ -109,21 +111,19 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo 'department' => ['name'], 'groups' => ['name'], 'company' => ['name'], - 'manager' => ['first_name', 'last_name', 'username'] + 'manager' => ['first_name', 'last_name', 'username'], ]; - /** * Internally check the user permission for the given section * - * @return boolean + * @return bool */ protected function checkPermissionSection($section) { $user_groups = $this->groups; + if (($this->permissions == '') && (count($user_groups) == 0)) { - - if (($this->permissions=='') && (count($user_groups) == 0)) { return false; } @@ -131,18 +131,18 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo $is_user_section_permissions_set = ($user_permissions != '') && array_key_exists($section, $user_permissions); //If the user is explicitly granted, return true - if ($is_user_section_permissions_set && ($user_permissions[$section]=='1')) { + if ($is_user_section_permissions_set && ($user_permissions[$section] == '1')) { return true; } // If the user is explicitly denied, return false - if ($is_user_section_permissions_set && ($user_permissions[$section]=='-1')) { + if ($is_user_section_permissions_set && ($user_permissions[$section] == '-1')) { return false; } // Loop through the groups to see if any of them grant this permission foreach ($user_groups as $user_group) { $group_permissions = (array) json_decode($user_group->permissions, true); - if (((array_key_exists($section, $group_permissions)) && ($group_permissions[$section]=='1'))) { + if (((array_key_exists($section, $group_permissions)) && ($group_permissions[$section] == '1'))) { return true; } } @@ -158,13 +158,14 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo * * @author A. Gianotto * @since [v1.0] - * @return boolean + * @return bool */ public function hasAccess($section) { if ($this->isSuperUser()) { return true; } + return $this->checkPermissionSection($section); } @@ -173,7 +174,7 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo * * @author A. Gianotto * @since [v1.0] - * @return boolean + * @return bool */ public function isSuperUser() { @@ -190,7 +191,7 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo */ public function company() { - return $this->belongsTo('\App\Models\Company', 'company_id'); + return $this->belongsTo(\App\Models\Company::class, 'company_id'); } /** @@ -202,7 +203,7 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo */ public function department() { - return $this->belongsTo('\App\Models\Department', 'department_id'); + return $this->belongsTo(\App\Models\Department::class, 'department_id'); } /** @@ -210,11 +211,11 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo * * @author A. Gianotto * @since [v1.0] - * @return boolean + * @return bool */ public function isActivated() { - return $this->activated ==1; + return $this->activated == 1; } /** @@ -226,7 +227,7 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo */ public function getFullNameAttribute() { - return $this->first_name . " " . $this->last_name; + return $this->first_name.' '.$this->last_name; } /** @@ -240,7 +241,7 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo */ public function getCompleteNameAttribute() { - return $this->last_name . ", " . $this->first_name . " (" . $this->username . ")"; + return $this->last_name.', '.$this->first_name.' ('.$this->username.')'; } /** @@ -253,10 +254,10 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo // At this point the endpoint is the same for everything. // In the future this may want to be adapted for individual notifications. $this->endpoint = \App\Models\Setting::getSettings()->slack_endpoint; + return $this->endpoint; } - /** * Establishes the user -> assets relationship * @@ -266,7 +267,7 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo */ public function assets() { - return $this->morphMany('App\Models\Asset', 'assigned', 'assigned_type', 'assigned_to')->withTrashed(); + return $this->morphMany(\App\Models\Asset::class, 'assigned', 'assigned_type', 'assigned_to')->withTrashed(); } /** @@ -281,7 +282,7 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo */ public function assetmaintenances() { - return $this->hasMany('\App\Models\AssetMaintenance', 'user_id')->withTrashed(); + return $this->hasMany(\App\Models\AssetMaintenance::class, 'user_id')->withTrashed(); } /** @@ -293,7 +294,7 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo */ public function accessories() { - return $this->belongsToMany('\App\Models\Accessory', 'accessories_users', 'assigned_to', 'accessory_id') + return $this->belongsToMany(\App\Models\Accessory::class, 'accessories_users', 'assigned_to', 'accessory_id') ->withPivot('id', 'created_at', 'note')->withTrashed(); } @@ -306,7 +307,7 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo */ public function consumables() { - return $this->belongsToMany('\App\Models\Consumable', 'consumables_users', 'assigned_to', 'consumable_id')->withPivot('id')->withTrashed(); + return $this->belongsToMany(\App\Models\Consumable::class, 'consumables_users', 'assigned_to', 'consumable_id')->withPivot('id')->withTrashed(); } /** @@ -318,7 +319,7 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo */ public function licenses() { - return $this->belongsToMany('\App\Models\License', 'license_seats', 'assigned_to', 'license_id')->withPivot('id'); + return $this->belongsToMany(\App\Models\License::class, 'license_seats', 'assigned_to', 'license_id')->withPivot('id'); } /** @@ -330,10 +331,9 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo */ public function userlog() { - return $this->hasMany('\App\Models\Actionlog', 'target_id')->where('target_type', '=', 'App\Models\User')->orderBy('created_at', 'DESC')->withTrashed(); + return $this->hasMany(\App\Models\Actionlog::class, 'target_id')->where('target_type', '=', self::class)->orderBy('created_at', 'DESC')->withTrashed(); } - /** * Establishes the user -> location relationship * @@ -345,13 +345,11 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo * @since [v4.0] * @return \Illuminate\Database\Eloquent\Relations\Relation */ - public function userloc() { - return $this->belongsTo('\App\Models\Location', 'location_id')->withTrashed(); + return $this->belongsTo(\App\Models\Location::class, 'location_id')->withTrashed(); } - /** * Establishes the user -> location relationship * @@ -361,7 +359,7 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo */ public function location() { - return $this->belongsTo('\App\Models\Location', 'location_id')->withTrashed(); + return $this->belongsTo(\App\Models\Location::class, 'location_id')->withTrashed(); } /** @@ -373,7 +371,7 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo */ public function manager() { - return $this->belongsTo('\App\Models\User', 'manager_id')->withTrashed(); + return $this->belongsTo(self::class, 'manager_id')->withTrashed(); } /** @@ -385,7 +383,7 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo */ public function managedLocations() { - return $this->hasMany('\App\Models\Location', 'manager_id'); + return $this->hasMany(\App\Models\Location::class, 'manager_id'); } /** @@ -397,7 +395,7 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo */ public function groups() { - return $this->belongsToMany('\App\Models\Group', 'users_groups'); + return $this->belongsToMany(\App\Models\Group::class, 'users_groups'); } /** @@ -409,7 +407,7 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo */ public function assetlog() { - return $this->hasMany('\App\Models\Asset', 'id')->withTrashed(); + return $this->hasMany(\App\Models\Asset::class, 'id')->withTrashed(); } /** @@ -423,8 +421,8 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo */ public function uploads() { - return $this->hasMany('\App\Models\Actionlog', 'item_id') - ->where('item_type', User::class) + return $this->hasMany(\App\Models\Actionlog::class, 'item_id') + ->where('item_type', self::class) ->where('action_type', '=', 'uploaded') ->whereNotNull('filename') ->orderBy('created_at', 'desc'); @@ -485,7 +483,8 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo */ public static function generateEmailFromFullName($name) { - $username = User::generateFormattedNameFromFullName($name, Setting::getSettings()->email_format); + $username = self::generateFormattedNameFromFullName($name, Setting::getSettings()->email_format); + return $username['username'].'@'.Setting::getSettings()->email_domain; } @@ -496,40 +495,30 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo if (strpos($users_name, ' ') === false) { $first_name = $users_name; $last_name = ''; - $username = $users_name; - + $username = $users_name; } else { - - list($first_name, $last_name) = explode(" ", $users_name, 2); + list($first_name, $last_name) = explode(' ', $users_name, 2); // Assume filastname by default $username = str_slug(substr($first_name, 0, 1).$last_name); - if ($format=='firstname.lastname') { - $username = str_slug($first_name) . '.' . str_slug($last_name); - - } elseif ($format=='lastnamefirstinitial') { + if ($format == 'firstname.lastname') { + $username = str_slug($first_name).'.'.str_slug($last_name); + } elseif ($format == 'lastnamefirstinitial') { $username = str_slug($last_name.substr($first_name, 0, 1)); - - } elseif ($format=='firstintial.lastname') { + } elseif ($format == 'firstintial.lastname') { $username = substr($first_name, 0, 1).'.'.str_slug($last_name); - - } elseif ($format=='firstname_lastname') { + } elseif ($format == 'firstname_lastname') { $username = str_slug($first_name).'_'.str_slug($last_name); - - } elseif ($format=='firstname') { + } elseif ($format == 'firstname') { $username = str_slug($first_name); - } - elseif ($format=='firstinitial.lastname') { - $username = str_slug(substr($first_name, 0, 1). '.' . str_slug($last_name)); - } - elseif ($format=='lastname_firstinitial') { + } elseif ($format == 'firstinitial.lastname') { + $username = str_slug(substr($first_name, 0, 1).'.'.str_slug($last_name)); + } elseif ($format == 'lastname_firstinitial') { $username = str_slug($last_name).'_'.str_slug(substr($first_name, 0, 1)); - } - elseif ($format=='firstnamelastname') { - $username = str_slug($first_name) . str_slug($last_name); - } - elseif ($format=='firstnamelastinitial') { + } elseif ($format == 'firstnamelastname') { + $username = str_slug($first_name).str_slug($last_name); + } elseif ($format == 'firstnamelastinitial') { $username = str_slug(($first_name.substr($last_name, 0, 1))); } } @@ -537,9 +526,8 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo $user['first_name'] = $first_name; $user['last_name'] = $last_name; $user['username'] = strtolower($username); + return $user; - - } /** @@ -554,21 +542,19 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo * * @return bool */ - public function two_factor_active () { + public function two_factor_active() + { // If the 2FA is optional and the user has opted in - if ((Setting::getSettings()->two_factor_enabled =='1') && ($this->two_factor_optin =='1')) - { + if ((Setting::getSettings()->two_factor_enabled == '1') && ($this->two_factor_optin == '1')) { return true; } // If the 2FA is required for everyone so is implicitly active - elseif (Setting::getSettings()->two_factor_enabled =='2') - { + elseif (Setting::getSettings()->two_factor_enabled == '2') { return true; } return false; - } /** @@ -584,20 +570,19 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo * * @return bool */ - public function two_factor_active_and_enrolled () { + public function two_factor_active_and_enrolled() + { // If the 2FA is optional and the user has opted in and is enrolled - if ((Setting::getSettings()->two_factor_enabled =='1') && ($this->two_factor_optin =='1') && ($this->two_factor_enrolled =='1')) - { + if ((Setting::getSettings()->two_factor_enabled == '1') && ($this->two_factor_optin == '1') && ($this->two_factor_enrolled == '1')) { return true; } // If the 2FA is required for everyone and the user has enrolled - elseif ((Setting::getSettings()->two_factor_enabled =='2') && ($this->two_factor_enrolled)) - { + elseif ((Setting::getSettings()->two_factor_enabled == '2') && ($this->two_factor_enrolled)) { return true; } - return false; + return false; } @@ -615,16 +600,16 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo * @param array $terms The search terms * @return \Illuminate\Database\Query\Builder */ - public function scopeSimpleNameSearch($query, $search) { - + public function scopeSimpleNameSearch($query, $search) + { $query = $query->where('first_name', 'LIKE', '%'.$search.'%') ->orWhere('last_name', 'LIKE', '%'.$search.'%') - ->orWhereRaw('CONCAT('.DB::getTablePrefix().'users.first_name," ",'.DB::getTablePrefix().'users.last_name) LIKE ?', ["%$search%", "%$search%"]); + ->orWhereRaw('CONCAT('.DB::getTablePrefix().'users.first_name," ",'.DB::getTablePrefix().'users.last_name) LIKE ?', ["%$search%"]); + return $query; } - /** * Run additional, advanced searches. * @@ -635,7 +620,7 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo public function advancedTextSearch(Builder $query, array $terms) { foreach($terms as $term) { - $query = $query->orWhereRaw('CONCAT('.DB::getTablePrefix().'users.first_name," ",'.DB::getTablePrefix().'users.last_name) LIKE ?', ["%$term%", "%$term%"]); + $query = $query->orWhereRaw('CONCAT('.DB::getTablePrefix().'users.first_name," ",'.DB::getTablePrefix().'users.last_name) LIKE ?', ["%$term%"]); } return $query; @@ -648,13 +633,13 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo * @param int $id * @return \Illuminate\Database\Query\Builder */ - public function scopeByGroup($query, $id) { + public function scopeByGroup($query, $id) + { return $query->whereHas('groups', function ($query) use ($id) { $query->where('permission_groups.id', '=', $id); }); } - /** * Query builder scope to order on manager * @@ -682,7 +667,6 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo return $query->leftJoin('locations as locations_users', 'users.location_id', '=', 'locations_users.id')->orderBy('locations_users.name', $order); } - /** * Query builder scope to order on department * @@ -709,9 +693,8 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo return $query->leftJoin('companies as companies_user', 'users.company_id', '=', 'companies_user.id')->orderBy('companies_user.name', $order); } - public function preferredLocale(){ + public function preferredLocale() + { return $this->locale; } - - } diff --git a/app/Notifications/AuditNotification.php b/app/Notifications/AuditNotification.php index 900650e975..84f1753767 100644 --- a/app/Notifications/AuditNotification.php +++ b/app/Notifications/AuditNotification.php @@ -43,15 +43,14 @@ class AuditNotification extends Notification public function toSlack() { - return (new SlackMessage) ->success() - ->content(class_basename(get_class($this->params['item'])) . " Audited") + ->content(class_basename(get_class($this->params['item'])).' Audited') ->attachment(function ($attachment) { $item = $this->params['item']; $admin_user = $this->params['admin']; $fields = [ - 'By' => '<'.$admin_user->present()->viewUrl().'|'.$admin_user->present()->fullName().'>' + 'By' => '<'.$admin_user->present()->viewUrl().'|'.$admin_user->present()->fullName().'>', ]; array_key_exists('note', $this->params) && $fields['Notes'] = $this->params['note']; array_key_exists('location', $this->params) && $fields['Location'] = $this->params['location']; diff --git a/app/Notifications/CheckinAccessoryNotification.php b/app/Notifications/CheckinAccessoryNotification.php index ba7c3b2011..f9abba59f9 100644 --- a/app/Notifications/CheckinAccessoryNotification.php +++ b/app/Notifications/CheckinAccessoryNotification.php @@ -21,10 +21,10 @@ class CheckinAccessoryNotification extends Notification */ public function __construct(Accessory $accessory, $checkedOutTo, User $checkedInby, $note) { - $this->item = $accessory; - $this->target = $checkedOutTo; - $this->admin = $checkedInby; - $this->note = $note; + $this->item = $accessory; + $this->target = $checkedOutTo; + $this->admin = $checkedInby; + $this->note = $note; $this->settings = Setting::getSettings(); \Log::debug('Constructor for notification fired'); } @@ -43,16 +43,14 @@ class CheckinAccessoryNotification extends Notification $notifyBy[] = 'slack'; } - if (Setting::getSettings()->slack_endpoint!='') { + if (Setting::getSettings()->slack_endpoint != '') { $notifyBy[] = 'slack'; } - /** * Only send notifications to users that have email addresses */ if ($this->target instanceof User && $this->target->email != '') { - \Log::debug('The target is a user'); /** @@ -63,16 +61,12 @@ class CheckinAccessoryNotification extends Notification $notifyBy[] = 'mail'; } - - - - /** * Send an email if the asset requires acceptance, * so the user can accept or decline the asset */ if ($this->item->requireAcceptance()) { - \Log::debug('This accessory requires acceptance'); + \Log::debug('This accessory requires acceptance'); } /** @@ -88,7 +82,6 @@ class CheckinAccessoryNotification extends Notification if ($this->item->checkin_email()) { \Log::debug('This accessory has a checkin_email()'); } - } \Log::debug('checkin_email on this category is '.$this->item->checkin_email()); @@ -98,12 +91,11 @@ class CheckinAccessoryNotification extends Notification public function toSlack() { - $target = $this->target; $admin = $this->admin; $item = $this->item; $note = $this->note; - $botname = ($this->settings->slack_botname) ? $this->settings->slack_botname : 'Snipe-Bot' ; + $botname = ($this->settings->slack_botname) ? $this->settings->slack_botname : 'Snipe-Bot'; $fields = [ 'To' => '<'.$target->present()->viewUrl().'|'.$target->present()->fullName().'>', @@ -119,6 +111,7 @@ class CheckinAccessoryNotification extends Notification ->content($note); }); } + /** * Get the mail representation of the notification. * @@ -128,6 +121,7 @@ class CheckinAccessoryNotification extends Notification public function toMail() { \Log::debug('to email called'); + return (new MailMessage)->markdown('notifications.markdown.checkin-accessory', [ 'item' => $this->item, @@ -136,6 +130,5 @@ class CheckinAccessoryNotification extends Notification 'target' => $this->target, ]) ->subject(trans('mail.Accessory_Checkin_Notification')); - } } diff --git a/app/Notifications/CheckinAssetNotification.php b/app/Notifications/CheckinAssetNotification.php index e0f1e66f3a..fc2537704c 100644 --- a/app/Notifications/CheckinAssetNotification.php +++ b/app/Notifications/CheckinAssetNotification.php @@ -14,7 +14,6 @@ class CheckinAssetNotification extends Notification { use Queueable; - /** * Create a new notification instance. * @@ -23,15 +22,15 @@ class CheckinAssetNotification extends Notification public function __construct(Asset $asset, $checkedOutTo, User $checkedInBy, $note) { $this->target = $checkedOutTo; - $this->item = $asset; - $this->admin = $checkedInBy; - $this->note = $note; + $this->item = $asset; + $this->admin = $checkedInBy; + $this->note = $note; $this->settings = Setting::getSettings(); $this->expected_checkin = ''; if ($this->item->expected_checkin) { - $this->expected_checkin = \App\Helpers\Helper::getFormattedDateObject($this->item->expected_checkin, 'date', + $this->expected_checkin = Helper::getFormattedDateObject($this->item->expected_checkin, 'date', false); } } @@ -43,10 +42,9 @@ class CheckinAssetNotification extends Notification */ public function via() { - $notifyBy = []; - if (Setting::getSettings()->slack_endpoint!='') { + if (Setting::getSettings()->slack_endpoint != '') { \Log::debug('use slack'); $notifyBy[] = 'slack'; } @@ -55,8 +53,7 @@ class CheckinAssetNotification extends Notification * Only send checkin notifications to users if the category * has the corresponding checkbox checked. */ - if ($this->item->checkin_email() && $this->target instanceof User && $this->target->email != '') - { + if ($this->item->checkin_email() && $this->target instanceof User && $this->target->email != '') { \Log::debug('use email'); $notifyBy[] = 'mail'; } @@ -66,11 +63,10 @@ class CheckinAssetNotification extends Notification public function toSlack() { - $admin = $this->admin; $item = $this->item; $note = $this->note; - $botname = ($this->settings->slack_botname!='') ? $this->settings->slack_botname : 'Snipe-Bot' ; + $botname = ($this->settings->slack_botname != '') ? $this->settings->slack_botname : 'Snipe-Bot'; $fields = [ trans('general.administrator') => '<'.$admin->present()->viewUrl().'|'.$admin->present()->fullName().'>', @@ -86,8 +82,6 @@ class CheckinAssetNotification extends Notification ->fields($fields) ->content($note); }); - - } /** @@ -115,8 +109,6 @@ class CheckinAssetNotification extends Notification ]) ->subject(trans('mail.Asset_Checkin_Notification')); - return $message; } - } diff --git a/app/Notifications/CheckinLicenseSeatNotification.php b/app/Notifications/CheckinLicenseSeatNotification.php index a3bfb039e2..faeafecb1b 100644 --- a/app/Notifications/CheckinLicenseSeatNotification.php +++ b/app/Notifications/CheckinLicenseSeatNotification.php @@ -41,7 +41,7 @@ class CheckinLicenseSeatNotification extends Notification { $notifyBy = []; - if (Setting::getSettings()->slack_endpoint!='') { + if (Setting::getSettings()->slack_endpoint != '') { $notifyBy[] = 'slack'; } @@ -49,8 +49,7 @@ class CheckinLicenseSeatNotification extends Notification * Only send checkin notifications to users if the category * has the corresponding checkbox checked. */ - if ($this->item->checkin_email() && $this->target instanceof User && $this->target->email != '') - { + if ($this->item->checkin_email() && $this->target instanceof User && $this->target->email != '') { $notifyBy[] = 'mail'; } @@ -59,13 +58,11 @@ class CheckinLicenseSeatNotification extends Notification public function toSlack() { - $target = $this->target; $admin = $this->admin; $item = $this->item; $note = $this->note; - $botname = ($this->settings->slack_botname) ? $this->settings->slack_botname : 'Snipe-Bot' ; - + $botname = ($this->settings->slack_botname) ? $this->settings->slack_botname : 'Snipe-Bot'; if ($admin) { $fields = [ @@ -79,9 +76,6 @@ class CheckinLicenseSeatNotification extends Notification ]; } - - - return (new SlackMessage) ->content(':arrow_down: :floppy_disk: '.trans('mail.License_Checkin_Notification')) ->from($botname) @@ -91,6 +85,7 @@ class CheckinLicenseSeatNotification extends Notification ->content($note); }); } + /** * Get the mail representation of the notification. * @@ -107,7 +102,5 @@ class CheckinLicenseSeatNotification extends Notification 'target' => $this->target, ]) ->subject(trans('mail.License_Checkin_Notification')); - } - } diff --git a/app/Notifications/CheckoutAccessoryNotification.php b/app/Notifications/CheckoutAccessoryNotification.php index 2c2001253d..5882fdf275 100644 --- a/app/Notifications/CheckoutAccessoryNotification.php +++ b/app/Notifications/CheckoutAccessoryNotification.php @@ -19,7 +19,6 @@ class CheckoutAccessoryNotification extends Notification */ public function __construct(Accessory $accessory, $checkedOutTo, User $checkedOutBy, $acceptance, $note) { - $this->item = $accessory; $this->admin = $checkedOutBy; $this->note = $note; @@ -27,7 +26,6 @@ class CheckoutAccessoryNotification extends Notification $this->acceptance = $acceptance; $this->settings = Setting::getSettings(); - } /** @@ -37,14 +35,12 @@ class CheckoutAccessoryNotification extends Notification */ public function via() { - $notifyBy = []; - if (Setting::getSettings()->slack_endpoint!='') { + if (Setting::getSettings()->slack_endpoint != '') { $notifyBy[] = 'slack'; } - /** * Only send notifications to users that have email addresses */ @@ -71,7 +67,6 @@ class CheckoutAccessoryNotification extends Notification if ($this->item->checkin_email()) { $notifyBy[1] = 'mail'; } - } return $notifyBy; @@ -83,7 +78,7 @@ class CheckoutAccessoryNotification extends Notification $admin = $this->admin; $item = $this->item; $note = $this->note; - $botname = ($this->settings->slack_botname) ? $this->settings->slack_botname : 'Snipe-Bot' ; + $botname = ($this->settings->slack_botname) ? $this->settings->slack_botname : 'Snipe-Bot'; $fields = [ 'To' => '<'.$target->present()->viewUrl().'|'.$target->present()->fullName().'>', @@ -99,6 +94,7 @@ class CheckoutAccessoryNotification extends Notification ->content($note); }); } + /** * Get the mail representation of the notification. * @@ -107,7 +103,7 @@ class CheckoutAccessoryNotification extends Notification public function toMail() { \Log::debug($this->item->getImageUrl()); - $eula = $this->item->getEula(); + $eula = $this->item->getEula(); $req_accept = $this->item->requireAcceptance(); $accept_url = is_null($this->acceptance) ? null : route('account.accept.item', $this->acceptance); @@ -123,6 +119,5 @@ class CheckoutAccessoryNotification extends Notification 'accept_url' => $accept_url, ]) ->subject(trans('mail.Confirm_accessory_delivery')); - } } diff --git a/app/Notifications/CheckoutAssetNotification.php b/app/Notifications/CheckoutAssetNotification.php index ff759f68ef..44708220aa 100644 --- a/app/Notifications/CheckoutAssetNotification.php +++ b/app/Notifications/CheckoutAssetNotification.php @@ -2,6 +2,7 @@ namespace App\Notifications; +use App\Helpers\Helper; use App\Models\Asset; use App\Models\Setting; use App\Models\User; @@ -21,7 +22,6 @@ class CheckoutAssetNotification extends Notification */ public function __construct(Asset $asset, $checkedOutTo, User $checkedOutBy, $acceptance, $note) { - $this->item = $asset; $this->admin = $checkedOutBy; $this->note = $note; @@ -34,16 +34,14 @@ class CheckoutAssetNotification extends Notification $this->expected_checkin = ''; if ($this->item->last_checkout) { - $this->last_checkout = \App\Helpers\Helper::getFormattedDateObject($this->item->last_checkout, 'date', + $this->last_checkout = Helper::getFormattedDateObject($this->item->last_checkout, 'date', false); } if ($this->item->expected_checkin) { - $this->expected_checkin = \App\Helpers\Helper::getFormattedDateObject($this->item->expected_checkin, 'date', + $this->expected_checkin = Helper::getFormattedDateObject($this->item->expected_checkin, 'date', false); } - - } /** @@ -53,10 +51,9 @@ class CheckoutAssetNotification extends Notification */ public function via() { - $notifyBy = []; - if (Setting::getSettings()->slack_endpoint!='') { + if (Setting::getSettings()->slack_endpoint != '') { \Log::debug('use slack'); $notifyBy[] = 'slack'; } @@ -87,7 +84,6 @@ class CheckoutAssetNotification extends Notification if ($this->item->checkin_email()) { $notifyBy[1] = 'mail'; } - } return $notifyBy; @@ -95,19 +91,18 @@ class CheckoutAssetNotification extends Notification public function toSlack() { - $target = $this->target; $admin = $this->admin; $item = $this->item; $note = $this->note; - $botname = ($this->settings->slack_botname) ? $this->settings->slack_botname : 'Snipe-Bot' ; + $botname = ($this->settings->slack_botname) ? $this->settings->slack_botname : 'Snipe-Bot'; $fields = [ 'To' => '<'.$target->present()->viewUrl().'|'.$target->present()->fullName().'>', 'By' => '<'.$admin->present()->viewUrl().'|'.$admin->present()->fullName().'>', ]; - if (($this->expected_checkin) && ($this->expected_checkin!='')) { + if (($this->expected_checkin) && ($this->expected_checkin != '')) { $fields['Expected Checkin'] = $this->expected_checkin; } @@ -120,6 +115,7 @@ class CheckoutAssetNotification extends Notification ->content($note); }); } + /** * Get the mail representation of the notification. * @@ -128,8 +124,7 @@ class CheckoutAssetNotification extends Notification */ public function toMail() { - - $eula = method_exists($this->item, 'getEula') ? $this->item->getEula() : ''; + $eula = method_exists($this->item, 'getEula') ? $this->item->getEula() : ''; $req_accept = method_exists($this->item, 'requireAcceptance') ? $this->item->requireAcceptance() : 0; $fields = []; @@ -156,9 +151,6 @@ class CheckoutAssetNotification extends Notification ]) ->subject(trans('mail.Confirm_asset_delivery')); - return $message; - } - } diff --git a/app/Notifications/CheckoutConsumableNotification.php b/app/Notifications/CheckoutConsumableNotification.php index edf970789d..bfebe2c7d5 100644 --- a/app/Notifications/CheckoutConsumableNotification.php +++ b/app/Notifications/CheckoutConsumableNotification.php @@ -25,7 +25,6 @@ class CheckoutConsumableNotification extends Notification */ public function __construct(Consumable $consumable, $checkedOutTo, User $checkedOutBy, $acceptance, $note) { - $this->item = $consumable; $this->admin = $checkedOutBy; $this->note = $note; @@ -33,7 +32,6 @@ class CheckoutConsumableNotification extends Notification $this->acceptance = $acceptance; $this->settings = Setting::getSettings(); - } /** @@ -45,7 +43,7 @@ class CheckoutConsumableNotification extends Notification { $notifyBy = []; - if (Setting::getSettings()->slack_endpoint!='') { + if (Setting::getSettings()->slack_endpoint != '') { $notifyBy[] = 'slack'; } @@ -72,12 +70,9 @@ class CheckoutConsumableNotification extends Notification /** * Send an email if an email should be sent at checkin/checkout */ - if ((method_exists($this->item, 'checkin_email')) && ($this->item->checkin_email())) { - $notifyBy[1] = 'mail'; } - } return $notifyBy; @@ -89,7 +84,7 @@ class CheckoutConsumableNotification extends Notification $admin = $this->admin; $item = $this->item; $note = $this->note; - $botname = ($this->settings->slack_botname) ? $this->settings->slack_botname : 'Snipe-Bot' ; + $botname = ($this->settings->slack_botname) ? $this->settings->slack_botname : 'Snipe-Bot'; $fields = [ 'To' => '<'.$target->present()->viewUrl().'|'.$target->present()->fullName().'>', @@ -105,6 +100,7 @@ class CheckoutConsumableNotification extends Notification ->content($note); }); } + /** * Get the mail representation of the notification. * @@ -112,9 +108,8 @@ class CheckoutConsumableNotification extends Notification */ public function toMail() { - \Log::debug($this->item->getImageUrl()); - $eula = $this->item->getEula(); + $eula = $this->item->getEula(); $req_accept = $this->item->requireAcceptance(); $accept_url = is_null($this->acceptance) ? null : route('account.accept.item', $this->acceptance); @@ -130,7 +125,5 @@ class CheckoutConsumableNotification extends Notification 'accept_url' => $accept_url, ]) ->subject(trans('mail.Confirm_consumable_delivery')); - } - } diff --git a/app/Notifications/CheckoutLicenseSeatNotification.php b/app/Notifications/CheckoutLicenseSeatNotification.php index 3ec2c1f9ae..50d8313c09 100644 --- a/app/Notifications/CheckoutLicenseSeatNotification.php +++ b/app/Notifications/CheckoutLicenseSeatNotification.php @@ -43,7 +43,7 @@ class CheckoutLicenseSeatNotification extends Notification { $notifyBy = []; - if (Setting::getSettings()->slack_endpoint!='') { + if (Setting::getSettings()->slack_endpoint != '') { $notifyBy[] = 'slack'; } @@ -73,7 +73,6 @@ class CheckoutLicenseSeatNotification extends Notification if ($this->item->checkin_email()) { $notifyBy[1] = 'mail'; } - } return $notifyBy; @@ -85,7 +84,7 @@ class CheckoutLicenseSeatNotification extends Notification $admin = $this->admin; $item = $this->item; $note = $this->note; - $botname = ($this->settings->slack_botname) ? $this->settings->slack_botname : 'Snipe-Bot' ; + $botname = ($this->settings->slack_botname) ? $this->settings->slack_botname : 'Snipe-Bot'; $fields = [ 'To' => '<'.$target->present()->viewUrl().'|'.$target->present()->fullName().'>', @@ -101,6 +100,7 @@ class CheckoutLicenseSeatNotification extends Notification ->content($note); }); } + /** * Get the mail representation of the notification. * @@ -108,8 +108,7 @@ class CheckoutLicenseSeatNotification extends Notification */ public function toMail() { - - $eula = method_exists($this->item, 'getEula') ? $this->item->getEula() : ''; + $eula = method_exists($this->item, 'getEula') ? $this->item->getEula() : ''; $req_accept = method_exists($this->item, 'requireAcceptance') ? $this->item->requireAcceptance() : 0; $accept_url = is_null($this->acceptance) ? null : route('account.accept.item', $this->acceptance); @@ -125,7 +124,5 @@ class CheckoutLicenseSeatNotification extends Notification 'accept_url' => $accept_url, ]) ->subject(trans('mail.Confirm_license_delivery')); - } - } diff --git a/app/Notifications/ExpectedCheckinAdminNotification.php b/app/Notifications/ExpectedCheckinAdminNotification.php index 7f29a915f5..67c709f98d 100644 --- a/app/Notifications/ExpectedCheckinAdminNotification.php +++ b/app/Notifications/ExpectedCheckinAdminNotification.php @@ -32,7 +32,8 @@ class ExpectedCheckinAdminNotification extends Notification public function via() { $notifyBy = []; - $notifyBy[]='mail'; + $notifyBy[] = 'mail'; + return $notifyBy; } @@ -43,7 +44,6 @@ class ExpectedCheckinAdminNotification extends Notification */ public function toMail() { - $message = (new MailMessage)->markdown('notifications.markdown.report-expected-checkins', [ 'assets' => $this->assets, @@ -51,8 +51,5 @@ class ExpectedCheckinAdminNotification extends Notification ->subject(trans('mail.Expected_Checkin_Report')); return $message; - - } - } diff --git a/app/Notifications/ExpectedCheckinNotification.php b/app/Notifications/ExpectedCheckinNotification.php index dadd920cf0..6248b72779 100644 --- a/app/Notifications/ExpectedCheckinNotification.php +++ b/app/Notifications/ExpectedCheckinNotification.php @@ -35,7 +35,8 @@ class ExpectedCheckinNotification extends Notification $notifyBy = []; $item = $this->params['item']; - $notifyBy[]='mail'; + $notifyBy[] = 'mail'; + return $notifyBy; } @@ -46,18 +47,15 @@ class ExpectedCheckinNotification extends Notification */ public function toMail() { - $message = (new MailMessage)->markdown('notifications.markdown.expected-checkin', [ 'date' => Helper::getFormattedDateObject($this->params->expected_checkin, 'date', false), 'asset' => $this->params->present()->name(), 'serial' => $this->params->serial, - 'asset_tag' => $this->params->asset_tag + 'asset_tag' => $this->params->asset_tag, ]) ->subject(trans('mail.Expected_Checkin_Notification', ['name' => $this->params->present()->name()])); return $message; - } - } diff --git a/app/Notifications/ExpiringAssetsNotification.php b/app/Notifications/ExpiringAssetsNotification.php index 47d5509259..076db149fb 100644 --- a/app/Notifications/ExpiringAssetsNotification.php +++ b/app/Notifications/ExpiringAssetsNotification.php @@ -33,7 +33,8 @@ class ExpiringAssetsNotification extends Notification public function via() { $notifyBy = []; - $notifyBy[]='mail'; + $notifyBy[] = 'mail'; + return $notifyBy; } @@ -45,7 +46,6 @@ class ExpiringAssetsNotification extends Notification */ public function toMail() { - $message = (new MailMessage)->markdown('notifications.markdown.report-expiring-assets', [ 'assets' => $this->assets, @@ -54,8 +54,5 @@ class ExpiringAssetsNotification extends Notification ->subject(trans('mail.Expiring_Assets_Report')); return $message; - - } - } diff --git a/app/Notifications/ExpiringLicenseNotification.php b/app/Notifications/ExpiringLicenseNotification.php index 5ca1e93cf6..4be549e452 100644 --- a/app/Notifications/ExpiringLicenseNotification.php +++ b/app/Notifications/ExpiringLicenseNotification.php @@ -34,7 +34,8 @@ class ExpiringLicenseNotification extends Notification public function via() { $notifyBy = []; - $notifyBy[]='mail'; + $notifyBy[] = 'mail'; + return $notifyBy; } @@ -46,7 +47,6 @@ class ExpiringLicenseNotification extends Notification */ public function toMail() { - $message = (new MailMessage)->markdown('notifications.markdown.report-expiring-licenses', [ 'licenses' => $this->licenses, @@ -55,8 +55,5 @@ class ExpiringLicenseNotification extends Notification ->subject(trans('mail.Expiring_Licenses_Report')); return $message; - - } - } diff --git a/app/Notifications/FirstAdminNotification.php b/app/Notifications/FirstAdminNotification.php index 153aff4aec..71637b5e80 100644 --- a/app/Notifications/FirstAdminNotification.php +++ b/app/Notifications/FirstAdminNotification.php @@ -10,7 +10,7 @@ class FirstAdminNotification extends Notification { use Queueable; - private $_data = array(); + private $_data = []; /** * Create a new notification instance. @@ -45,8 +45,7 @@ class FirstAdminNotification extends Notification public function toMail() { return (new MailMessage) - ->subject(trans('mail.welcome', ['name' => $this->_data['first_name'] . ' ' . $this->_data['last_name'] ])) + ->subject(trans('mail.welcome', ['name' => $this->_data['first_name'].' '.$this->_data['last_name']])) ->markdown('notifications.FirstAdmin', $this->_data); } - } diff --git a/app/Notifications/RequestAssetCancelation.php b/app/Notifications/RequestAssetCancelation.php index d50aea3529..ea76056af3 100644 --- a/app/Notifications/RequestAssetCancelation.php +++ b/app/Notifications/RequestAssetCancelation.php @@ -55,15 +55,13 @@ class RequestAssetCancelation extends Notification */ public function via() { - $notifyBy = []; - if (Setting::getSettings()->slack_endpoint!='') { + if (Setting::getSettings()->slack_endpoint != '') { \Log::debug('use slack'); $notifyBy[] = 'slack'; } - $notifyBy[] = 'mail'; return $notifyBy; @@ -75,19 +73,19 @@ class RequestAssetCancelation extends Notification $item = $this->item; $note = $this->note; $qty = $this->item_quantity; - $botname = ($this->settings->slack_botname) ? $this->settings->slack_botname : 'Snipe-Bot' ; + $botname = ($this->settings->slack_botname) ? $this->settings->slack_botname : 'Snipe-Bot'; $fields = [ 'QTY' => $qty, 'Canceled By' => '<'.$target->present()->viewUrl().'|'.$target->present()->fullName().'>', ]; - if (($this->expected_checkin) && ($this->expected_checkin!='')) { + if (($this->expected_checkin) && ($this->expected_checkin != '')) { $fields['Expected Checkin'] = $this->expected_checkin; } return (new SlackMessage) - ->content( trans('mail.a_user_canceled')) + ->content(trans('mail.a_user_canceled')) ->from($botname) ->attachment(function ($attachment) use ($item, $note, $fields) { $attachment->title(htmlspecialchars_decode($item->present()->name), $item->present()->viewUrl()) @@ -95,6 +93,7 @@ class RequestAssetCancelation extends Notification ->content($note); }); } + /** * Get the mail representation of the notification. * @@ -103,7 +102,6 @@ class RequestAssetCancelation extends Notification */ public function toMail() { - $fields = []; // Check if the item has custom fields associated with it @@ -125,8 +123,6 @@ class RequestAssetCancelation extends Notification ]) ->subject(trans('Item Request Canceled')); - return $message; } - } diff --git a/app/Notifications/RequestAssetNotification.php b/app/Notifications/RequestAssetNotification.php index b78f5eeb93..22a8f3d464 100644 --- a/app/Notifications/RequestAssetNotification.php +++ b/app/Notifications/RequestAssetNotification.php @@ -46,8 +46,6 @@ class RequestAssetNotification extends Notification $this->expected_checkin = Helper::getFormattedDateObject($this->item->expected_checkin, 'date', false); } - - } /** @@ -58,10 +56,9 @@ class RequestAssetNotification extends Notification */ public function via() { - $notifyBy = []; - if (Setting::getSettings()->slack_endpoint!='') { + if (Setting::getSettings()->slack_endpoint != '') { $notifyBy[] = 'slack'; } @@ -76,7 +73,7 @@ class RequestAssetNotification extends Notification $qty = $this->item_quantity; $item = $this->item; $note = $this->note; - $botname = ($this->settings->slack_botname) ? $this->settings->slack_botname : 'Snipe-Bot' ; + $botname = ($this->settings->slack_botname) ? $this->settings->slack_botname : 'Snipe-Bot'; $fields = [ 'QTY' => $qty, @@ -92,6 +89,7 @@ class RequestAssetNotification extends Notification ->content($note); }); } + /** * Get the mail representation of the notification. * @@ -99,7 +97,6 @@ class RequestAssetNotification extends Notification */ public function toMail() { - $fields = []; // Check if the item has custom fields associated with it @@ -121,8 +118,6 @@ class RequestAssetNotification extends Notification ]) ->subject(trans('mail.Item_Requested')); - return $message; } - } diff --git a/app/Notifications/SendUpcomingAuditNotification.php b/app/Notifications/SendUpcomingAuditNotification.php index a6863ea8e3..a883220f2f 100644 --- a/app/Notifications/SendUpcomingAuditNotification.php +++ b/app/Notifications/SendUpcomingAuditNotification.php @@ -4,9 +4,9 @@ namespace App\Notifications; use App\Models\Setting; use Illuminate\Bus\Queueable; -use Illuminate\Notifications\Notification; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Notifications\Messages\MailMessage; +use Illuminate\Notifications\Notification; class SendUpcomingAuditNotification extends Notification { diff --git a/app/Notifications/WelcomeNotification.php b/app/Notifications/WelcomeNotification.php index 9a98a97734..3d2657b944 100644 --- a/app/Notifications/WelcomeNotification.php +++ b/app/Notifications/WelcomeNotification.php @@ -10,7 +10,7 @@ class WelcomeNotification extends Notification { use Queueable; - private $_data = array(); + private $_data = []; /** * Create a new notification instance. @@ -45,7 +45,7 @@ class WelcomeNotification extends Notification public function toMail() { return (new MailMessage) - ->subject(trans('mail.welcome', ['name' => $this->_data['first_name'] . ' ' . $this->_data['last_name'] ])) + ->subject(trans('mail.welcome', ['name' => $this->_data['first_name'].' '.$this->_data['last_name']])) ->markdown('notifications.Welcome', $this->_data); } } diff --git a/app/Observers/AccessoryObserver.php b/app/Observers/AccessoryObserver.php index 1dd3e40437..f97d166b17 100644 --- a/app/Observers/AccessoryObserver.php +++ b/app/Observers/AccessoryObserver.php @@ -16,16 +16,14 @@ class AccessoryObserver */ public function updated(Accessory $accessory) { - $logAction = new Actionlog(); $logAction->item_type = Accessory::class; $logAction->item_id = $accessory->id; - $logAction->created_at = date("Y-m-d H:i:s"); + $logAction->created_at = date('Y-m-d H:i:s'); $logAction->user_id = Auth::id(); $logAction->logaction('update'); } - /** * Listen to the Accessory created event when * a new accessory is created. @@ -38,10 +36,9 @@ class AccessoryObserver $logAction = new Actionlog(); $logAction->item_type = Accessory::class; $logAction->item_id = $accessory->id; - $logAction->created_at = date("Y-m-d H:i:s"); + $logAction->created_at = date('Y-m-d H:i:s'); $logAction->user_id = Auth::id(); $logAction->logaction('create'); - } /** @@ -55,7 +52,7 @@ class AccessoryObserver $logAction = new Actionlog(); $logAction->item_type = Accessory::class; $logAction->item_id = $accessory->id; - $logAction->created_at = date("Y-m-d H:i:s"); + $logAction->created_at = date('Y-m-d H:i:s'); $logAction->user_id = Auth::id(); $logAction->logaction('delete'); } diff --git a/app/Observers/AssetObserver.php b/app/Observers/AssetObserver.php index 164792a3a9..85e33ee045 100644 --- a/app/Observers/AssetObserver.php +++ b/app/Observers/AssetObserver.php @@ -22,8 +22,7 @@ class AssetObserver // (Those other actions already create log entries.) if (($asset->getAttributes()['assigned_to'] == $asset->getOriginal()['assigned_to']) && ($asset->getAttributes()['next_audit_date'] == $asset->getOriginal()['next_audit_date']) - && ($asset->getAttributes()['last_checkout'] == $asset->getOriginal()['last_checkout'])) - { + && ($asset->getAttributes()['last_checkout'] == $asset->getOriginal()['last_checkout'])) { $changed = []; foreach ($asset->getOriginal() as $key => $value) { @@ -33,22 +32,18 @@ class AssetObserver } } - $logAction = new Actionlog(); $logAction->item_type = Asset::class; $logAction->item_id = $asset->id; - $logAction->created_at = date("Y-m-d H:i:s"); + $logAction->created_at = date('Y-m-d H:i:s'); $logAction->user_id = Auth::id(); $logAction->log_meta = json_encode($changed); $logAction->logaction('update'); - - } - + } } - /** - * Listen to the Asset created event, and increment + * Listen to the Asset created event, and increment * the next_auto_tag_base value in the settings table when i * a new asset is created. * @@ -65,10 +60,9 @@ class AssetObserver $logAction = new Actionlog(); $logAction->item_type = Asset::class; $logAction->item_id = $asset->id; - $logAction->created_at = date("Y-m-d H:i:s"); + $logAction->created_at = date('Y-m-d H:i:s'); $logAction->user_id = Auth::id(); $logAction->logaction('create'); - } /** @@ -82,7 +76,7 @@ class AssetObserver $logAction = new Actionlog(); $logAction->item_type = Asset::class; $logAction->item_id = $asset->id; - $logAction->created_at = date("Y-m-d H:i:s"); + $logAction->created_at = date('Y-m-d H:i:s'); $logAction->user_id = Auth::id(); $logAction->logaction('delete'); } diff --git a/app/Observers/ComponentObserver.php b/app/Observers/ComponentObserver.php index 3cb0aeda6c..57792022bb 100644 --- a/app/Observers/ComponentObserver.php +++ b/app/Observers/ComponentObserver.php @@ -16,16 +16,14 @@ class ComponentObserver */ public function updated(Component $component) { - $logAction = new Actionlog(); $logAction->item_type = Component::class; $logAction->item_id = $component->id; - $logAction->created_at = date("Y-m-d H:i:s"); + $logAction->created_at = date('Y-m-d H:i:s'); $logAction->user_id = Auth::id(); $logAction->logaction('update'); } - /** * Listen to the Component created event when * a new component is created. @@ -38,10 +36,9 @@ class ComponentObserver $logAction = new Actionlog(); $logAction->item_type = Component::class; $logAction->item_id = $component->id; - $logAction->created_at = date("Y-m-d H:i:s"); + $logAction->created_at = date('Y-m-d H:i:s'); $logAction->user_id = Auth::id(); $logAction->logaction('create'); - } /** @@ -55,7 +52,7 @@ class ComponentObserver $logAction = new Actionlog(); $logAction->item_type = Component::class; $logAction->item_id = $component->id; - $logAction->created_at = date("Y-m-d H:i:s"); + $logAction->created_at = date('Y-m-d H:i:s'); $logAction->user_id = Auth::id(); $logAction->logaction('delete'); } diff --git a/app/Observers/ConsumableObserver.php b/app/Observers/ConsumableObserver.php index 22c94f2688..b945196e20 100644 --- a/app/Observers/ConsumableObserver.php +++ b/app/Observers/ConsumableObserver.php @@ -16,16 +16,14 @@ class ConsumableObserver */ public function updated(Consumable $consumable) { - $logAction = new Actionlog(); $logAction->item_type = Consumable::class; $logAction->item_id = $consumable->id; - $logAction->created_at = date("Y-m-d H:i:s"); + $logAction->created_at = date('Y-m-d H:i:s'); $logAction->user_id = Auth::id(); $logAction->logaction('update'); } - /** * Listen to the Consumable created event when * a new consumable is created. @@ -35,14 +33,12 @@ class ConsumableObserver */ public function created(Consumable $consumable) { - $logAction = new Actionlog(); $logAction->item_type = Consumable::class; $logAction->item_id = $consumable->id; - $logAction->created_at = date("Y-m-d H:i:s"); + $logAction->created_at = date('Y-m-d H:i:s'); $logAction->user_id = Auth::id(); $logAction->logaction('create'); - } /** @@ -56,7 +52,7 @@ class ConsumableObserver $logAction = new Actionlog(); $logAction->item_type = Consumable::class; $logAction->item_id = $consumable->id; - $logAction->created_at = date("Y-m-d H:i:s"); + $logAction->created_at = date('Y-m-d H:i:s'); $logAction->user_id = Auth::id(); $logAction->logaction('delete'); } diff --git a/app/Observers/LicenseObserver.php b/app/Observers/LicenseObserver.php index 5f0132f208..1478aba113 100644 --- a/app/Observers/LicenseObserver.php +++ b/app/Observers/LicenseObserver.php @@ -16,16 +16,14 @@ class LicenseObserver */ public function updated(License $license) { - $logAction = new Actionlog(); $logAction->item_type = License::class; $logAction->item_id = $license->id; - $logAction->created_at = date("Y-m-d H:i:s"); + $logAction->created_at = date('Y-m-d H:i:s'); $logAction->user_id = Auth::id(); $logAction->logaction('update'); } - /** * Listen to the License created event when * a new license is created. @@ -35,14 +33,12 @@ class LicenseObserver */ public function created(License $license) { - $logAction = new Actionlog(); $logAction->item_type = License::class; $logAction->item_id = $license->id; - $logAction->created_at = date("Y-m-d H:i:s"); + $logAction->created_at = date('Y-m-d H:i:s'); $logAction->user_id = Auth::id(); $logAction->logaction('create'); - } /** @@ -56,7 +52,7 @@ class LicenseObserver $logAction = new Actionlog(); $logAction->item_type = License::class; $logAction->item_id = $license->id; - $logAction->created_at = date("Y-m-d H:i:s"); + $logAction->created_at = date('Y-m-d H:i:s'); $logAction->user_id = Auth::id(); $logAction->logaction('delete'); } diff --git a/app/Observers/SettingObserver.php b/app/Observers/SettingObserver.php index eea0240017..aeb682a03a 100644 --- a/app/Observers/SettingObserver.php +++ b/app/Observers/SettingObserver.php @@ -18,6 +18,5 @@ class SettingObserver { Cache::forget(Setting::APP_SETTINGS_KEY); Cache::forget(Setting::SETUP_CHECK_KEY); - } } diff --git a/app/Policies/CheckoutablePermissionsPolicy.php b/app/Policies/CheckoutablePermissionsPolicy.php index d1c39ae314..bcd0e0f39a 100644 --- a/app/Policies/CheckoutablePermissionsPolicy.php +++ b/app/Policies/CheckoutablePermissionsPolicy.php @@ -1,12 +1,12 @@ hasAccess($this->columnName().'.checkout'); } - /** + /** * Determine whether the user can checkin the accessory. * * @param \App\User $user @@ -28,7 +28,7 @@ abstract class CheckoutablePermissionsPolicy extends SnipePermissionsPolicy return $user->hasAccess($this->columnName().'.checkin'); } - /** + /** * Determine whether the user can manage the accessory. * * @param \App\User $user diff --git a/app/Policies/CustomFieldsetPolicy.php b/app/Policies/CustomFieldsetPolicy.php index 0d95cbafe5..a6c06a7007 100644 --- a/app/Policies/CustomFieldsetPolicy.php +++ b/app/Policies/CustomFieldsetPolicy.php @@ -8,11 +8,11 @@ class CustomFieldsetPolicy extends SnipePermissionsPolicy { /** * Proxy the authorization for custom fieldsets down to custom fields. - * This allows us to use the existing permissions in use and have more + * This allows us to use the existing permissions in use and have more * semantically correct authorization checks for custom fieldsets. * * See: https://github.com/snipe/snipe-it/pull/5795 */ return 'customfields'; - } + } } diff --git a/app/Policies/LicensePolicy.php b/app/Policies/LicensePolicy.php index 9d1ec815c6..7a92b5b7de 100644 --- a/app/Policies/LicensePolicy.php +++ b/app/Policies/LicensePolicy.php @@ -13,25 +13,26 @@ class LicensePolicy extends CheckoutablePermissionsPolicy } /** - * Determine whether the user can view license keys. - * This gets a little tricky, UX/logic-wise. If a user has the ability - * to create a license (which requires a product key), shouldn't they - * have the ability to see the product key as well? - * - * Example: I create the license, realize I need to change - * something (maybe I got the product key wrong), and now I can never - * see/edit that product key. - * - * @see https://github.com/snipe/snipe-it/issues/6956 - * @param \App\Models\User $user - * @param \App\Models\License $license - * @return mixed - */ + * Determine whether the user can view license keys. + * This gets a little tricky, UX/logic-wise. If a user has the ability + * to create a license (which requires a product key), shouldn't they + * have the ability to see the product key as well? + * + * Example: I create the license, realize I need to change + * something (maybe I got the product key wrong), and now I can never + * see/edit that product key. + * + * @see https://github.com/snipe/snipe-it/issues/6956 + * @param \App\Models\User $user + * @param \App\Models\License $license + * @return mixed + */ public function viewKeys(User $user, License $license = null) { if ($user->hasAccess('licenses.keys') || $user->hasAccess('licenses.create') || $user->hasAccess('licenses.edit')) { return true; } + return false; } diff --git a/app/Policies/SnipePermissionsPolicy.php b/app/Policies/SnipePermissionsPolicy.php index 435828fd14..f6f6e4db82 100644 --- a/app/Policies/SnipePermissionsPolicy.php +++ b/app/Policies/SnipePermissionsPolicy.php @@ -1,4 +1,5 @@ hasAccess($this->columnName().'.view'); } + /** * Determine whether the user can view the accessory. * @@ -93,12 +93,13 @@ abstract class SnipePermissionsPolicy { $itemConditional = true; if ($item) { - $itemConditional = empty($item->deleted_at); + $itemConditional = empty($item->deleted_at); } + return $itemConditional && $user->hasAccess($this->columnName().'.delete'); } - /** + /** * Determine whether the user can manage the accessory. * * @param \App\Models\User $user @@ -108,6 +109,4 @@ abstract class SnipePermissionsPolicy { return $user->hasAccess($this->columnName().'.edit'); } - - } diff --git a/app/Presenters/AccessoryPresenter.php b/app/Presenters/AccessoryPresenter.php index bf7074ad55..5eb58f4bc1 100644 --- a/app/Presenters/AccessoryPresenter.php +++ b/app/Presenters/AccessoryPresenter.php @@ -1,9 +1,9 @@ "id", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.id'), - "visible" => false - ],[ - "field" => "image", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('admin/hardware/table.image'), - "visible" => true, - "formatter" => "imageFormatter" + 'field' => 'id', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.id'), + 'visible' => false, ], [ - "field" => "company", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('admin/companies/table.title'), - "visible" => false, - "formatter" => "companiesLinkObjFormatter" + 'field' => 'image', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('admin/hardware/table.image'), + 'visible' => true, + 'formatter' => 'imageFormatter', ], [ - "field" => "name", - "searchable" => true, - "sortable" => true, - "title" => trans('general.name'), - "formatter" => "accessoriesLinkFormatter" + 'field' => 'company', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('admin/companies/table.title'), + 'visible' => false, + 'formatter' => 'companiesLinkObjFormatter', ], [ - "field" => "category", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/accessories/general.accessory_category'), - "formatter" => "categoriesLinkObjFormatter" + 'field' => 'name', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.name'), + 'formatter' => 'accessoriesLinkFormatter', ], [ - "field" => "model_number", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/models/table.modelnumber'), - "formatter" => "accessoriesLinkFormatter" + 'field' => 'category', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/accessories/general.accessory_category'), + 'formatter' => 'categoriesLinkObjFormatter', ], [ - "field" => "manufacturer", - "searchable" => true, - "sortable" => true, - "title" => trans('general.manufacturer'), - "formatter" => "manufacturersLinkObjFormatter", + 'field' => 'model_number', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/models/table.modelnumber'), + 'formatter' => 'accessoriesLinkFormatter', ], [ - "field" => "supplier", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('general.supplier'), - "visible" => false, - "formatter" => "suppliersLinkObjFormatter" + 'field' => 'manufacturer', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.manufacturer'), + 'formatter' => 'manufacturersLinkObjFormatter', ], [ - "field" => "location", - "searchable" => true, - "sortable" => true, - "title" => trans('general.location'), - "formatter" => "locationsLinkObjFormatter", + 'field' => 'supplier', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.supplier'), + 'visible' => false, + 'formatter' => 'suppliersLinkObjFormatter', ], [ - "field" => "qty", - "searchable" => false, - "sortable" => false, - "title" => trans('admin/accessories/general.total'), + 'field' => 'location', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.location'), + 'formatter' => 'locationsLinkObjFormatter', + ], [ + 'field' => 'qty', + 'searchable' => false, + 'sortable' => false, + 'title' => trans('admin/accessories/general.total'), ], [ - "field" => "min_qty", - "searchable" => false, - "sortable" => true, - "title" => trans('general.min_amt'), + 'field' => 'min_qty', + 'searchable' => false, + 'sortable' => true, + 'title' => trans('general.min_amt'), ], [ - "field" => "remaining_qty", - "searchable" => false, - "sortable" => false, - "title" => trans('admin/accessories/general.remaining'), + 'field' => 'remaining_qty', + 'searchable' => false, + 'sortable' => false, + 'title' => trans('admin/accessories/general.remaining'), ], [ - "field" => "purchase_date", - "searchable" => true, - "sortable" => true, - "visible" => false, - "title" => trans('general.purchase_date'), - "formatter" => "dateDisplayFormatter" + 'field' => 'purchase_date', + 'searchable' => true, + 'sortable' => true, + 'visible' => false, + 'title' => trans('general.purchase_date'), + 'formatter' => 'dateDisplayFormatter', ], [ - "field" => "purchase_cost", - "searchable" => true, - "sortable" => true, - "title" => trans('general.purchase_cost'), - "footerFormatter" => 'sumFormatter', + 'field' => 'purchase_cost', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.purchase_cost'), + 'footerFormatter' => 'sumFormatter', ], [ - "field" => "order_number", - "searchable" => true, - "sortable" => true, - "visible" => false, - "title" => trans('general.order_number'), - ],[ - "field" => "change", - "searchable" => false, - "sortable" => false, - "visible" => true, - "title" => trans('general.change'), - "formatter" => "accessoriesInOutFormatter", + 'field' => 'order_number', + 'searchable' => true, + 'sortable' => true, + 'visible' => false, + 'title' => trans('general.order_number'), ], [ - "field" => "actions", - "searchable" => false, - "sortable" => false, - "switchable" => false, - "title" => trans('table.actions'), - "formatter" => "accessoriesActionsFormatter", - ] + 'field' => 'change', + 'searchable' => false, + 'sortable' => false, + 'visible' => true, + 'title' => trans('general.change'), + 'formatter' => 'accessoriesInOutFormatter', + ], [ + 'field' => 'actions', + 'searchable' => false, + 'sortable' => false, + 'switchable' => false, + 'title' => trans('table.actions'), + 'formatter' => 'accessoriesActionsFormatter', + ], ]; return json_encode($layout); } - /** * Pregenerated link to this accessories view page. * @return string diff --git a/app/Presenters/ActionlogPresenter.php b/app/Presenters/ActionlogPresenter.php index 79ab28269e..617cdb6a2a 100644 --- a/app/Presenters/ActionlogPresenter.php +++ b/app/Presenters/ActionlogPresenter.php @@ -4,26 +4,25 @@ namespace App\Presenters; /** * Class CompanyPresenter - * @package App\Presenters */ class ActionlogPresenter extends Presenter { - public function admin() { if ($user = $this->model->user) { - if(empty($user->deleted_at)) { + if (empty($user->deleted_at)) { return $user->present()->nameUrl(); } // The user was deleted - return ''.$user->getFullNameAttribute()." (deleted)"; + return ''.$user->getFullNameAttribute().' (deleted)'; } + return ''; } public function item() { - if($this->action_type=='uploaded') { + if ($this->action_type == 'uploaded') { return (string) link_to_route('show/userfile', $this->model->filename, [$this->model->item->id, $this->model->id]); } if ($item = $this->model->item) { @@ -33,63 +32,62 @@ class ActionlogPresenter extends Presenter // The item was deleted return ''.$item->name.' (deleted)'; } + return ''; } - public function icon() { - $itemicon = 'fa fa-paperclip'; + $itemicon = 'fas fa-paperclip'; - if ($this->itemType() == "asset") { - $itemicon = 'fa fa-barcode'; - } elseif ($this->itemType() == "accessory") { - $itemicon = 'fa fa-keyboard-o'; - } elseif ($this->itemType()=="consumable") { - $itemicon = 'fa fa-tint'; - } elseif ($this->itemType()=="license") { - $itemicon = 'fa fa-floppy-o'; - } elseif ($this->itemType()=="component") { - $itemicon = 'fa fa-hdd-o'; - } + if ($this->itemType() == 'asset') { + return 'fas fa-barcode'; + } elseif ($this->itemType() == 'accessory') { + return 'far fa-keyboard'; + } elseif ($this->itemType() == 'consumable') { + return 'fas fa-tint'; + } elseif ($this->itemType() == 'license') { + return 'far fa-save'; + } elseif ($this->itemType() == 'component') { + return 'far fa-hdd'; + } - return $itemicon; } - - public function actionType() { + public function actionType() + { return mb_strtolower(trans('general.'.str_replace(' ', '_', $this->action_type))); } - - public function target() { $target = null; // Target is messy. // On an upload, the target is the item we are uploading to, stored as the "item" in the log. - if ($this->action_type=='uploaded') { + if ($this->action_type == 'uploaded') { $target = $this->model->item; - } elseif (($this->action_type=='accepted') || ($this->action_type=='declined')) { - // If we are logging an accept/reject, the target is not stored directly, - // so we access it through who the item is assigned to. - // FIXME: On a reject it's not assigned to anyone. + } elseif (($this->action_type == 'accepted') || ($this->action_type == 'declined')) { + // If we are logging an accept/reject, the target is not stored directly, + // so we access it through who the item is assigned to. + // FIXME: On a reject it's not assigned to anyone. $target = $this->model->item->assignedTo; - } elseif ($this->action_type=='requested') { + } elseif ($this->action_type == 'requested') { if ($this->model->user) { $target = $this->model->user; } } elseif ($this->model->target) { - // Otherwise, we'll just take the target of the log. + // Otherwise, we'll just take the target of the log. $target = $this->model->target; } - if($target) { + if ($target) { if (empty($target->deleted_at)) { return $target->present()->nameUrl(); } + return ''.$target->present()->name().''; } + return ''; } } diff --git a/app/Presenters/AssetAuditPresenter.php b/app/Presenters/AssetAuditPresenter.php index bfc917eea5..ab43f45e10 100644 --- a/app/Presenters/AssetAuditPresenter.php +++ b/app/Presenters/AssetAuditPresenter.php @@ -1,4 +1,5 @@ "id", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.id'), - "visible" => false + 'field' => 'id', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.id'), + 'visible' => false, ], [ - "field" => "company", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('general.company'), - "visible" => false, - "formatter" => 'assetCompanyObjFilterFormatter' + 'field' => 'company', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.company'), + 'visible' => false, + 'formatter' => 'assetCompanyObjFilterFormatter', ], [ - "field" => "name", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/hardware/form.name'), - "visible" => true, - "formatter" => "hardwareLinkFormatter" + 'field' => 'name', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/hardware/form.name'), + 'visible' => true, + 'formatter' => 'hardwareLinkFormatter', ], [ - "field" => "image", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('admin/hardware/table.image'), - "visible" => false, - "formatter" => "imageFormatter" + 'field' => 'image', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('admin/hardware/table.image'), + 'visible' => false, + 'formatter' => 'imageFormatter', ], [ - "field" => "asset_tag", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/hardware/table.asset_tag'), - "visible" => true, - "formatter" => "hardwareLinkFormatter" + 'field' => 'asset_tag', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/hardware/table.asset_tag'), + 'visible' => true, + 'formatter' => 'hardwareLinkFormatter', ], [ - "field" => "serial", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/hardware/form.serial'), - "visible" => true, - "formatter" => "hardwareLinkFormatter" + 'field' => 'serial', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/hardware/form.serial'), + 'visible' => true, + 'formatter' => 'hardwareLinkFormatter', ], [ - "field" => "model", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/hardware/form.model'), - "visible" => true, - "formatter" => "modelsLinkObjFormatter" + 'field' => 'model', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/hardware/form.model'), + 'visible' => true, + 'formatter' => 'modelsLinkObjFormatter', ], [ - "field" => "model_number", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/models/table.modelnumber'), - "visible" => false + 'field' => 'model_number', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/models/table.modelnumber'), + 'visible' => false, ], [ - "field" => "category", - "searchable" => true, - "sortable" => true, - "title" => trans('general.category'), - "visible" => false, - "formatter" => "categoriesLinkObjFormatter" + 'field' => 'category', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.category'), + 'visible' => false, + 'formatter' => 'categoriesLinkObjFormatter', ], [ - "field" => "status_label", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/hardware/table.status'), - "visible" => true, - "formatter" => "statuslabelsLinkObjFormatter" + 'field' => 'status_label', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/hardware/table.status'), + 'visible' => true, + 'formatter' => 'statuslabelsLinkObjFormatter', ], [ - "field" => "assigned_to", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/hardware/form.checkedout_to'), - "visible" => true, - "formatter" => "polymorphicItemFormatter" + 'field' => 'assigned_to', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/hardware/form.checkedout_to'), + 'visible' => true, + 'formatter' => 'polymorphicItemFormatter', ], [ - "field" => "location", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/hardware/table.location'), - "visible" => true, - "formatter" => "deployedLocationFormatter" + 'field' => 'location', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/hardware/table.location'), + 'visible' => true, + 'formatter' => 'deployedLocationFormatter', ], [ - "field" => "rtd_location", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/hardware/form.default_location'), - "visible" => false, - "formatter" => "deployedLocationFormatter" + 'field' => 'rtd_location', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/hardware/form.default_location'), + 'visible' => false, + 'formatter' => 'deployedLocationFormatter', ], [ - "field" => "manufacturer", - "searchable" => true, - "sortable" => true, - "title" => trans('general.manufacturer'), - "visible" => false, - "formatter" => "manufacturersLinkObjFormatter" + 'field' => 'manufacturer', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.manufacturer'), + 'visible' => false, + 'formatter' => 'manufacturersLinkObjFormatter', ], [ - "field" => "purchase_date", - "searchable" => true, - "sortable" => true, - "visible" => false, - "title" => trans('general.purchase_date'), - "formatter" => "dateDisplayFormatter" + 'field' => 'purchase_date', + 'searchable' => true, + 'sortable' => true, + 'visible' => false, + 'title' => trans('general.purchase_date'), + 'formatter' => 'dateDisplayFormatter', ], [ - "field" => "purchase_cost", - "searchable" => true, - "sortable" => true, - "visible" => false, - "title" => trans('general.purchase_cost'), - "footerFormatter" => 'sumFormatter', + 'field' => 'purchase_cost', + 'searchable' => true, + 'sortable' => true, + 'visible' => false, + 'title' => trans('general.purchase_cost'), + 'footerFormatter' => 'sumFormatter', ], [ - "field" => "order_number", - "searchable" => true, - "sortable" => true, - "visible" => false, - "title" => trans('general.order_number'), - 'formatter' => "orderNumberObjFilterFormatter" + 'field' => 'order_number', + 'searchable' => true, + 'sortable' => true, + 'visible' => false, + 'title' => trans('general.order_number'), + 'formatter' => 'orderNumberObjFilterFormatter', ], [ - "field" => "eol", - "searchable" => false, - "sortable" => false, - "visible" => false, - "title" => trans('general.eol'), - "formatter" => "dateDisplayFormatter" + 'field' => 'eol', + 'searchable' => false, + 'sortable' => false, + 'visible' => false, + 'title' => trans('general.eol'), + 'formatter' => 'dateDisplayFormatter', ], [ - "field" => "warranty_months", - "searchable" => true, - "sortable" => true, - "visible" => false, - "title" => trans('admin/hardware/form.warranty') - ],[ - "field" => "warranty_expires", - "searchable" => false, - "sortable" => false, - "visible" => false, - "title" => trans('admin/hardware/form.warranty_expires'), - "formatter" => "dateDisplayFormatter" - ],[ - "field" => "notes", - "searchable" => true, - "sortable" => true, - "visible" => false, - "title" => trans('general.notes'), + 'field' => 'warranty_months', + 'searchable' => true, + 'sortable' => true, + 'visible' => false, + 'title' => trans('admin/hardware/form.warranty'), + ], [ + 'field' => 'warranty_expires', + 'searchable' => false, + 'sortable' => false, + 'visible' => false, + 'title' => trans('admin/hardware/form.warranty_expires'), + 'formatter' => 'dateDisplayFormatter', + ], [ + 'field' => 'notes', + 'searchable' => true, + 'sortable' => true, + 'visible' => false, + 'title' => trans('general.notes'), ], [ - "field" => "checkout_counter", - "searchable" => false, - "sortable" => true, - "visible" => false, - "title" => trans('general.checkouts_count') - - ],[ - "field" => "checkin_counter", - "searchable" => false, - "sortable" => true, - "visible" => false, - "title" => trans('general.checkins_count') + 'field' => 'checkout_counter', + 'searchable' => false, + 'sortable' => true, + 'visible' => false, + 'title' => trans('general.checkouts_count'), ], [ - "field" => "requests_counter", - "searchable" => false, - "sortable" => true, - "visible" => false, - "title" => trans('general.user_requests_count') + 'field' => 'checkin_counter', + 'searchable' => false, + 'sortable' => true, + 'visible' => false, + 'title' => trans('general.checkins_count'), ], [ - "field" => "created_at", - "searchable" => false, - "sortable" => true, - "visible" => false, - "title" => trans('general.created_at'), - "formatter" => "dateDisplayFormatter" + 'field' => 'requests_counter', + 'searchable' => false, + 'sortable' => true, + 'visible' => false, + 'title' => trans('general.user_requests_count'), + ], [ - "field" => "updated_at", - "searchable" => false, - "sortable" => true, - "visible" => false, - "title" => trans('general.updated_at'), - "formatter" => "dateDisplayFormatter" + 'field' => 'created_at', + 'searchable' => false, + 'sortable' => true, + 'visible' => false, + 'title' => trans('general.created_at'), + 'formatter' => 'dateDisplayFormatter', ], [ - "field" => "last_checkout", - "searchable" => false, - "sortable" => true, - "visible" => false, - "title" => trans('admin/hardware/table.checkout_date'), - "formatter" => "dateDisplayFormatter" + 'field' => 'updated_at', + 'searchable' => false, + 'sortable' => true, + 'visible' => false, + 'title' => trans('general.updated_at'), + 'formatter' => 'dateDisplayFormatter', ], [ - "field" => "expected_checkin", - "searchable" => false, - "sortable" => true, - "visible" => false, - "title" => trans('admin/hardware/form.expected_checkin'), - "formatter" => "dateDisplayFormatter" + 'field' => 'last_checkout', + 'searchable' => false, + 'sortable' => true, + 'visible' => false, + 'title' => trans('admin/hardware/table.checkout_date'), + 'formatter' => 'dateDisplayFormatter', ], [ - "field" => "last_audit_date", - "searchable" => false, - "sortable" => true, - "visible" => true, - "title" => trans('general.last_audit'), - "formatter" => "dateDisplayFormatter" + 'field' => 'expected_checkin', + 'searchable' => false, + 'sortable' => true, + 'visible' => false, + 'title' => trans('admin/hardware/form.expected_checkin'), + 'formatter' => 'dateDisplayFormatter', ], [ - "field" => "next_audit_date", - "searchable" => false, - "sortable" => true, - "visible" => true, - "title" => trans('general.next_audit_date'), - "formatter" => "dateDisplayFormatter" + 'field' => 'last_audit_date', + 'searchable' => false, + 'sortable' => true, + 'visible' => true, + 'title' => trans('general.last_audit'), + 'formatter' => 'dateDisplayFormatter', + ], [ + 'field' => 'next_audit_date', + 'searchable' => false, + 'sortable' => true, + 'visible' => true, + 'title' => trans('general.next_audit_date'), + 'formatter' => 'dateDisplayFormatter', ], ]; @@ -238,36 +237,31 @@ class AssetAuditPresenter extends Presenter // models. We only pass the fieldsets that pertain to each asset (via their model) so that we // don't junk up the REST API with tons of custom fields that don't apply - $fields = CustomField::whereHas('fieldset', function ($query) { + $fields = CustomField::whereHas('fieldset', function ($query) { $query->whereHas('models'); })->get(); foreach ($fields as $field) { $layout[] = [ - "field" => 'custom_fields.'.$field->convertUnicodeDbSlug(), - "searchable" => true, - "sortable" => true, - "visible" => false, - "switchable" => true, - "title" => ($field->field_encrypted=='1') ?' '.e($field->name) : e($field->name), - "formatter" => "customFieldsFormatter" + 'field' => 'custom_fields.'.$field->convertUnicodeDbSlug(), + 'searchable' => true, + 'sortable' => true, + 'visible' => false, + 'switchable' => true, + 'title' => ($field->field_encrypted == '1') ? ' '.e($field->name) : e($field->name), + 'formatter' => 'customFieldsFormatter', ]; - } - $layout[] = [ - "field" => "actions", - "searchable" => false, - "sortable" => false, - "switchable" => false, - "title" => trans('table.actions'), - "formatter" => "hardwareAuditFormatter", + 'field' => 'actions', + 'searchable' => false, + 'sortable' => false, + 'switchable' => false, + 'title' => trans('table.actions'), + 'formatter' => 'hardwareAuditFormatter', ]; return json_encode($layout); } - - - } diff --git a/app/Presenters/AssetMaintenancesPresenter.php b/app/Presenters/AssetMaintenancesPresenter.php index 3d69cd794f..f7a9ff0229 100644 --- a/app/Presenters/AssetMaintenancesPresenter.php +++ b/app/Presenters/AssetMaintenancesPresenter.php @@ -4,11 +4,9 @@ namespace App\Presenters; /** * Class AssetModelPresenter - * @package App\Presenters */ class AssetMaintenancesPresenter extends Presenter { - /** * Json Column Layout for bootstrap table * @return string @@ -17,106 +15,106 @@ class AssetMaintenancesPresenter extends Presenter { $layout = [ [ - "field" => "id", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.id'), - "visible" => false - ],[ - "field" => "company", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('admin/companies/table.title'), - "visible" => false, - "formatter" => "companiesLinkObjFormatter" + 'field' => 'id', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.id'), + 'visible' => false, ], [ - "field" => "asset_name", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/asset_maintenances/table.asset_name'), - "formatter" => "assetNameLinkFormatter" - ],[ - "field" => "asset_tag", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/hardware/table.asset_tag'), - "formatter" => "assetTagLinkFormatter" + 'field' => 'company', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('admin/companies/table.title'), + 'visible' => false, + 'formatter' => 'companiesLinkObjFormatter', ], [ - "field" => "model", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('admin/hardware/form.model'), - "visible" => false, - "formatter" => "modelsLinkObjFormatter" - ],[ - "field" => "supplier", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('general.supplier'), - "visible" => false, - "formatter" => "suppliersLinkObjFormatter" + 'field' => 'asset_name', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/asset_maintenances/table.asset_name'), + 'formatter' => 'assetNameLinkFormatter', ], [ - "field" => "location", - "searchable" => true, - "sortable" => true, - "title" => trans('general.location'), - "formatter" => "locationsLinkObjFormatter", + 'field' => 'asset_tag', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/hardware/table.asset_tag'), + 'formatter' => 'assetTagLinkFormatter', ], [ - "field" => "asset_maintenance_type", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/asset_maintenances/form.asset_maintenance_type'), + 'field' => 'model', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('admin/hardware/form.model'), + 'visible' => false, + 'formatter' => 'modelsLinkObjFormatter', ], [ - "field" => "title", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/asset_maintenances/form.title'), + 'field' => 'supplier', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.supplier'), + 'visible' => false, + 'formatter' => 'suppliersLinkObjFormatter', ], [ - "field" => "start_date", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/asset_maintenances/form.start_date'), - "formatter" => "dateDisplayFormatter" + 'field' => 'location', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.location'), + 'formatter' => 'locationsLinkObjFormatter', ], [ - "field" => "completion_date", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/asset_maintenances/form.completion_date'), - "formatter" => "dateDisplayFormatter" + 'field' => 'asset_maintenance_type', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/asset_maintenances/form.asset_maintenance_type'), ], [ - "field" => "notes", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/asset_maintenances/form.notes') - ],[ - "field" => "is_warranty", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/asset_maintenances/table.is_warranty') + 'field' => 'title', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/asset_maintenances/form.title'), ], [ - "field" => "cost", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/asset_maintenances/form.cost') + 'field' => 'start_date', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/asset_maintenances/form.start_date'), + 'formatter' => 'dateDisplayFormatter', ], [ - "field" => "user_id", - "searchable" => true, - "sortable" => true, - "title" => trans('general.admin'), - "formatter" => "usersLinkObjFormatter" + 'field' => 'completion_date', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/asset_maintenances/form.completion_date'), + 'formatter' => 'dateDisplayFormatter', ], [ - "field" => "actions", - "searchable" => false, - "sortable" => false, - "switchable" => false, - "title" => trans('table.actions'), - "visible" => true, - "formatter" => "maintenancesActionsFormatter", - ] + 'field' => 'notes', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/asset_maintenances/form.notes'), + ], [ + 'field' => 'is_warranty', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/asset_maintenances/table.is_warranty'), + ], [ + 'field' => 'cost', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/asset_maintenances/form.cost'), + ], [ + 'field' => 'user_id', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.admin'), + 'formatter' => 'usersLinkObjFormatter', + ], [ + 'field' => 'actions', + 'searchable' => false, + 'sortable' => false, + 'switchable' => false, + 'title' => trans('table.actions'), + 'visible' => true, + 'formatter' => 'maintenancesActionsFormatter', + ], ]; return json_encode($layout); diff --git a/app/Presenters/AssetModelPresenter.php b/app/Presenters/AssetModelPresenter.php index 65836da9a8..78e0776ac4 100644 --- a/app/Presenters/AssetModelPresenter.php +++ b/app/Presenters/AssetModelPresenter.php @@ -4,150 +4,155 @@ namespace App\Presenters; /** * Class AssetModelPresenter - * @package App\Presenters */ class AssetModelPresenter extends Presenter { - public static function dataTableLayout() { - + public static function dataTableLayout() + { $layout = [ [ - "field" => "checkbox", - "checkbox" => true + 'field' => 'checkbox', + 'checkbox' => true, ], [ - "field" => "id", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.id'), - "visible" => false + 'field' => 'id', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.id'), + 'visible' => false, ], [ - "field" => "company", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('admin/companies/table.title'), - "visible" => false, - "formatter" => "companiesLinkObjFormatter" + 'field' => 'company', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('admin/companies/table.title'), + 'visible' => false, + 'formatter' => 'companiesLinkObjFormatter', ], [ - "field" => "name", - "searchable" => true, - "sortable" => true, - "visible" => true, - "title" => trans('general.name'), - "formatter" => "modelsLinkFormatter" + 'field' => 'name', + 'searchable' => true, + 'sortable' => true, + 'visible' => true, + 'title' => trans('general.name'), + 'formatter' => 'modelsLinkFormatter', ], [ - "field" => "image", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.image'), - "visible" => true, - "formatter" => 'imageFormatter', + 'field' => 'image', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.image'), + 'visible' => true, + 'formatter' => 'imageFormatter', ], [ - "field" => "manufacturer", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.manufacturer'), - "visible" => false, - "formatter" => 'manufacturersLinkObjFormatter', + 'field' => 'manufacturer', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.manufacturer'), + 'visible' => false, + 'formatter' => 'manufacturersLinkObjFormatter', ], [ - "field" => "model_number", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('admin/models/table.modelnumber'), - "visible" => true, + 'field' => 'model_number', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('admin/models/table.modelnumber'), + 'visible' => true, ], [ - "field" => "assets_count", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('admin/models/table.numassets'), - "visible" => true, + 'field' => 'assets_count', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('admin/models/table.numassets'), + 'visible' => true, ], [ - "field" => "depreciation", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.depreciation'), - "visible" => false, - "formatter" => "depreciationsLinkObjFormatter", + 'field' => 'depreciation', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.depreciation'), + 'visible' => false, + 'formatter' => 'depreciationsLinkObjFormatter', ], [ - "field" => "category", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.category'), - "visible" => false, - "formatter" => "categoriesLinkObjFormatter", + 'field' => 'category', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.category'), + 'visible' => false, + 'formatter' => 'categoriesLinkObjFormatter', ], [ - "field" => "eol", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.eol'), - "visible" => true, + 'field' => 'eol', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.eol'), + 'visible' => true, ], [ - "field" => "fieldset", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('admin/models/general.fieldset'), - "visible" => true, - "formatter" => "fieldsetsLinkObjFormatter", + 'field' => 'fieldset', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('admin/models/general.fieldset'), + 'visible' => true, + 'formatter' => 'fieldsetsLinkObjFormatter', ], [ - "field" => "notes", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('general.notes'), - "visible" => false, + 'field' => 'requestable', + 'searchable' => false, + 'sortable' => true, + 'visible' => false, + 'title' => trans('admin/hardware/general.requestable'), + 'formatter' => 'trueFalseFormatter', ], [ - "field" => "created_at", - "searchable" => true, - "sortable" => true, - "visible" => false, - "title" => trans('general.created_at'), - "formatter" => "dateDisplayFormatter" + 'field' => 'notes', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.notes'), + 'visible' => false, ], [ - "field" => "updated_at", - "searchable" => true, - "sortable" => true, - "visible" => false, - "title" => trans('general.updated_at'), - "formatter" => "dateDisplayFormatter" + 'field' => 'created_at', + 'searchable' => true, + 'sortable' => true, + 'visible' => false, + 'title' => trans('general.created_at'), + 'formatter' => 'dateDisplayFormatter', + ], + [ + 'field' => 'updated_at', + 'searchable' => true, + 'sortable' => true, + 'visible' => false, + 'title' => trans('general.updated_at'), + 'formatter' => 'dateDisplayFormatter', ], ]; - $layout[] = [ - "field" => "actions", - "searchable" => false, - "sortable" => false, - "switchable" => false, - "title" => trans('table.actions'), - "formatter" => "modelsActionsFormatter", + 'field' => 'actions', + 'searchable' => false, + 'sortable' => false, + 'switchable' => false, + 'title' => trans('table.actions'), + 'formatter' => 'modelsActionsFormatter', ]; - return json_encode($layout); - } + /** * Formatted note for this model * @return string @@ -159,7 +164,6 @@ class AssetModelPresenter extends Presenter if ($this->model->note) { return $Parsedown->text($this->model->note); } - } public function eolText() @@ -167,6 +171,7 @@ class AssetModelPresenter extends Presenter if ($this->eol) { return $this->eol.' '.trans('general.months'); } + return ''; } @@ -183,8 +188,9 @@ class AssetModelPresenter extends Presenter $name .= $this->name; if ($this->model_number) { - $name .=" (#".$this->model_number.')'; + $name .= ' (#'.$this->model_number.')'; } + return $name; } @@ -203,9 +209,10 @@ class AssetModelPresenter extends Presenter */ public function imageUrl() { - if (!empty($this->image)) { - return ''.$this->name.''; + if (! empty($this->image)) { + return ''.$this->name.''; } + return ''; } @@ -215,9 +222,10 @@ class AssetModelPresenter extends Presenter */ public function imageSrc() { - if (!empty($this->image)) { - return url('/') . '/uploads/models/' . $this->image; + if (! empty($this->image)) { + return url('/').'/uploads/models/'.$this->image; } + return ''; } diff --git a/app/Presenters/AssetPresenter.php b/app/Presenters/AssetPresenter.php index 05cff0dfdc..51303408d6 100644 --- a/app/Presenters/AssetPresenter.php +++ b/app/Presenters/AssetPresenter.php @@ -1,4 +1,5 @@ "checkbox", - "checkbox" => true + 'field' => 'checkbox', + 'checkbox' => true, ], [ - "field" => "id", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.id'), - "visible" => false + 'field' => 'id', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.id'), + 'visible' => false, ], [ - "field" => "company", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('general.company'), - "visible" => false, - "formatter" => 'assetCompanyObjFilterFormatter' + 'field' => 'company', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.company'), + 'visible' => false, + 'formatter' => 'assetCompanyObjFilterFormatter', ], [ - "field" => "name", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/hardware/form.name'), - "visible" => true, - "formatter" => "hardwareLinkFormatter" + 'field' => 'name', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/hardware/form.name'), + 'visible' => true, + 'formatter' => 'hardwareLinkFormatter', ], [ - "field" => "image", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('admin/hardware/table.image'), - "visible" => true, - "formatter" => "imageFormatter" + 'field' => 'image', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('admin/hardware/table.image'), + 'visible' => true, + 'formatter' => 'imageFormatter', ], [ - "field" => "asset_tag", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/hardware/table.asset_tag'), - "visible" => true, - "formatter" => "hardwareLinkFormatter" + 'field' => 'asset_tag', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/hardware/table.asset_tag'), + 'visible' => true, + 'formatter' => 'hardwareLinkFormatter', ], [ - "field" => "serial", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/hardware/form.serial'), - "visible" => true, - "formatter" => "hardwareLinkFormatter" + 'field' => 'serial', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/hardware/form.serial'), + 'visible' => true, + 'formatter' => 'hardwareLinkFormatter', ], [ - "field" => "model", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/hardware/form.model'), - "visible" => true, - "formatter" => "modelsLinkObjFormatter" + 'field' => 'model', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/hardware/form.model'), + 'visible' => true, + 'formatter' => 'modelsLinkObjFormatter', ], [ - "field" => "model_number", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/models/table.modelnumber'), - "visible" => false + 'field' => 'model_number', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/models/table.modelnumber'), + 'visible' => false, ], [ - "field" => "category", - "searchable" => true, - "sortable" => true, - "title" => trans('general.category'), - "visible" => true, - "formatter" => "categoriesLinkObjFormatter" + 'field' => 'category', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.category'), + 'visible' => true, + 'formatter' => 'categoriesLinkObjFormatter', ], [ - "field" => "status_label", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/hardware/table.status'), - "visible" => true, - "formatter" => "statuslabelsLinkObjFormatter" + 'field' => 'status_label', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/hardware/table.status'), + 'visible' => true, + 'formatter' => 'statuslabelsLinkObjFormatter', ], [ - "field" => "assigned_to", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/hardware/form.checkedout_to'), - "visible" => true, - "formatter" => "polymorphicItemFormatter" + 'field' => 'assigned_to', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/hardware/form.checkedout_to'), + 'visible' => true, + 'formatter' => 'polymorphicItemFormatter', ], [ - "field" => "employee_number", - "searchable" => false, - "sortable" => false, - "title" => trans('admin/users/table.employee_num'), - "visible" => false, - "formatter" => "employeeNumFormatter" - ],[ - "field" => "location", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/hardware/table.location'), - "visible" => true, - "formatter" => "deployedLocationFormatter" + 'field' => 'employee_number', + 'searchable' => false, + 'sortable' => false, + 'title' => trans('admin/users/table.employee_num'), + 'visible' => false, + 'formatter' => 'employeeNumFormatter', ], [ - "field" => "rtd_location", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/hardware/form.default_location'), - "visible" => false, - "formatter" => "deployedLocationFormatter" + 'field' => 'location', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/hardware/table.location'), + 'visible' => true, + 'formatter' => 'deployedLocationFormatter', ], [ - "field" => "manufacturer", - "searchable" => true, - "sortable" => true, - "title" => trans('general.manufacturer'), - "visible" => false, - "formatter" => "manufacturersLinkObjFormatter" - ],[ - "field" => "supplier", - "searchable" => true, - "sortable" => true, - "title" => trans('general.supplier'), - "visible" => false, - "formatter" => "suppliersLinkObjFormatter" + 'field' => 'rtd_location', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/hardware/form.default_location'), + 'visible' => false, + 'formatter' => 'deployedLocationFormatter', ], [ - "field" => "purchase_date", - "searchable" => true, - "sortable" => true, - "visible" => false, - "title" => trans('general.purchase_date'), - "formatter" => "dateDisplayFormatter" + 'field' => 'manufacturer', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.manufacturer'), + 'visible' => false, + 'formatter' => 'manufacturersLinkObjFormatter', ], [ - "field" => "purchase_cost", - "searchable" => true, - "sortable" => true, - "title" => trans('general.purchase_cost'), - "formatter" => 'numberWithCommas', - "footerFormatter" => 'sumFormatter', + 'field' => 'supplier', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.supplier'), + 'visible' => false, + 'formatter' => 'suppliersLinkObjFormatter', ], [ - "field" => "order_number", - "searchable" => true, - "sortable" => true, - "visible" => false, - "title" => trans('general.order_number'), - 'formatter' => "orderNumberObjFilterFormatter" + 'field' => 'purchase_date', + 'searchable' => true, + 'sortable' => true, + 'visible' => false, + 'title' => trans('general.purchase_date'), + 'formatter' => 'dateDisplayFormatter', ], [ - "field" => "eol", - "searchable" => false, - "sortable" => false, - "visible" => false, - "title" => trans('general.eol'), - "formatter" => "dateDisplayFormatter" + 'field' => 'purchase_cost', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.purchase_cost'), + 'footerFormatter' => 'sumFormatter', ], [ - "field" => "warranty_months", - "searchable" => true, - "sortable" => true, - "visible" => false, - "title" => trans('admin/hardware/form.warranty') - ],[ - "field" => "warranty_expires", - "searchable" => false, - "sortable" => false, - "visible" => false, - "title" => trans('admin/hardware/form.warranty_expires'), - "formatter" => "dateDisplayFormatter" - ],[ - "field" => "notes", - "searchable" => true, - "sortable" => true, - "visible" => false, - "title" => trans('general.notes'), + 'field' => 'order_number', + 'searchable' => true, + 'sortable' => true, + 'visible' => false, + 'title' => trans('general.order_number'), + 'formatter' => 'orderNumberObjFilterFormatter', + ], [ + 'field' => 'eol', + 'searchable' => false, + 'sortable' => false, + 'visible' => false, + 'title' => trans('general.eol'), + 'formatter' => 'dateDisplayFormatter', + ], [ + 'field' => 'warranty_months', + 'searchable' => true, + 'sortable' => true, + 'visible' => false, + 'title' => trans('admin/hardware/form.warranty'), + ], [ + 'field' => 'warranty_expires', + 'searchable' => false, + 'sortable' => false, + 'visible' => false, + 'title' => trans('admin/hardware/form.warranty_expires'), + 'formatter' => 'dateDisplayFormatter', + ], [ + 'field' => 'notes', + 'searchable' => true, + 'sortable' => true, + 'visible' => false, + 'title' => trans('general.notes'), ], [ - "field" => "checkout_counter", - "searchable" => false, - "sortable" => true, - "visible" => false, - "title" => trans('general.checkouts_count') - - ],[ - "field" => "checkin_counter", - "searchable" => false, - "sortable" => true, - "visible" => false, - "title" => trans('general.checkins_count') + 'field' => 'checkout_counter', + 'searchable' => false, + 'sortable' => true, + 'visible' => false, + 'title' => trans('general.checkouts_count'), ], [ - "field" => "requests_counter", - "searchable" => false, - "sortable" => true, - "visible" => false, - "title" => trans('general.user_requests_count') + 'field' => 'checkin_counter', + 'searchable' => false, + 'sortable' => true, + 'visible' => false, + 'title' => trans('general.checkins_count'), ], [ - "field" => "created_at", - "searchable" => false, - "sortable" => true, - "visible" => false, - "title" => trans('general.created_at'), - "formatter" => "dateDisplayFormatter" + 'field' => 'requests_counter', + 'searchable' => false, + 'sortable' => true, + 'visible' => false, + 'title' => trans('general.user_requests_count'), + ], [ - "field" => "updated_at", - "searchable" => false, - "sortable" => true, - "visible" => false, - "title" => trans('general.updated_at'), - "formatter" => "dateDisplayFormatter" + 'field' => 'created_at', + 'searchable' => false, + 'sortable' => true, + 'visible' => false, + 'title' => trans('general.created_at'), + 'formatter' => 'dateDisplayFormatter', ], [ - "field" => "last_checkout", - "searchable" => false, - "sortable" => true, - "visible" => false, - "title" => trans('admin/hardware/table.checkout_date'), - "formatter" => "dateDisplayFormatter" + 'field' => 'updated_at', + 'searchable' => false, + 'sortable' => true, + 'visible' => false, + 'title' => trans('general.updated_at'), + 'formatter' => 'dateDisplayFormatter', ], [ - "field" => "expected_checkin", - "searchable" => false, - "sortable" => true, - "visible" => false, - "title" => trans('admin/hardware/form.expected_checkin'), - "formatter" => "dateDisplayFormatter" + 'field' => 'last_checkout', + 'searchable' => false, + 'sortable' => true, + 'visible' => false, + 'title' => trans('admin/hardware/table.checkout_date'), + 'formatter' => 'dateDisplayFormatter', ], [ - "field" => "last_audit_date", - "searchable" => false, - "sortable" => true, - "visible" => false, - "title" => trans('general.last_audit'), - "formatter" => "dateDisplayFormatter" + 'field' => 'expected_checkin', + 'searchable' => false, + 'sortable' => true, + 'visible' => false, + 'title' => trans('admin/hardware/form.expected_checkin'), + 'formatter' => 'dateDisplayFormatter', ], [ - "field" => "next_audit_date", - "searchable" => false, - "sortable" => true, - "visible" => false, - "title" => trans('general.next_audit_date'), - "formatter" => "dateDisplayFormatter" + 'field' => 'last_audit_date', + 'searchable' => false, + 'sortable' => true, + 'visible' => false, + 'title' => trans('general.last_audit'), + 'formatter' => 'dateDisplayFormatter', + ], [ + 'field' => 'next_audit_date', + 'searchable' => false, + 'sortable' => true, + 'visible' => false, + 'title' => trans('general.next_audit_date'), + 'formatter' => 'dateDisplayFormatter', ], ]; @@ -255,53 +253,49 @@ class AssetPresenter extends Presenter // models. We only pass the fieldsets that pertain to each asset (via their model) so that we // don't junk up the REST API with tons of custom fields that don't apply - $fields = CustomField::whereHas('fieldset', function ($query) { + $fields = CustomField::whereHas('fieldset', function ($query) { $query->whereHas('models'); })->get(); - // Note: We do not need to e() escape the field names here, as they are already escaped when // they are presented in the blade view. If we escape them here, custom fields with quotes in their // name can break the listings page. - snipe foreach ($fields as $field) { $layout[] = [ - "field" => 'custom_fields.'.$field->convertUnicodeDbSlug(), - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => $field->name, - "formatter"=> 'customFieldsFormatter', - "escape" => true, - "class" => ($field->field_encrypted=='1') ? 'css-padlock' : '', - "visible" => true, + 'field' => 'custom_fields.'.$field->convertUnicodeDbSlug(), + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => $field->name, + 'formatter'=> 'customFieldsFormatter', + 'escape' => true, + 'class' => ($field->field_encrypted == '1') ? 'css-padlock' : '', + 'visible' => true, ]; - } $layout[] = [ - "field" => "checkincheckout", - "searchable" => false, - "sortable" => false, - "switchable" => true, - "title" => trans('general.checkin').'/'.trans('general.checkout'), - "visible" => true, - "formatter" => "hardwareInOutFormatter", + 'field' => 'checkincheckout', + 'searchable' => false, + 'sortable' => false, + 'switchable' => true, + 'title' => trans('general.checkin').'/'.trans('general.checkout'), + 'visible' => true, + 'formatter' => 'hardwareInOutFormatter', ]; $layout[] = [ - "field" => "actions", - "searchable" => false, - "sortable" => false, - "switchable" => false, - "title" => trans('table.actions'), - "formatter" => "hardwareActionsFormatter", + 'field' => 'actions', + 'searchable' => false, + 'sortable' => false, + 'switchable' => false, + 'title' => trans('table.actions'), + 'formatter' => 'hardwareActionsFormatter', ]; return json_encode($layout); } - - /** * Generate html link to this items name. * @return string @@ -316,6 +310,7 @@ class AssetPresenter extends Presenter if ($this->model->model) { return $this->model->model->present()->nameUrl(); } + return ''; } @@ -326,17 +321,18 @@ class AssetPresenter extends Presenter public function imageUrl() { $imagePath = ''; - if ($this->image && !empty($this->image)) { + if ($this->image && ! empty($this->image)) { $imagePath = $this->image; $imageAlt = $this->name; - } elseif ($this->model && !empty($this->model->image)) { + } elseif ($this->model && ! empty($this->model->image)) { $imagePath = $this->model->image; $imageAlt = $this->model->name; } $url = config('app.url'); - if (!empty($imagePath)) { + if (! empty($imagePath)) { $imagePath = ''.$imageAlt.''; } + return $imagePath; } @@ -347,14 +343,15 @@ class AssetPresenter extends Presenter public function imageSrc() { $imagePath = ''; - if ($this->image && !empty($this->image)) { + if ($this->image && ! empty($this->image)) { $imagePath = $this->image; - } elseif ($this->model && !empty($this->model->image)) { + } elseif ($this->model && ! empty($this->model->image)) { $imagePath = $this->model->image; } - if (!empty($imagePath)) { + if (! empty($imagePath)) { return config('app.url').'/uploads/assets/'.$imagePath; } + return $imagePath; } @@ -392,21 +389,22 @@ class AssetPresenter extends Presenter if ($this->model->model) { $str .= ' - '.$this->model->model->name; } + return $str; } + /** * Returns the date this item hits EOL. * @return false|string */ public function eol_date() { - - if (( $this->purchase_date ) && ( $this->model->model ) && ($this->model->model->eol) ) { + if (($this->purchase_date) && ($this->model->model) && ($this->model->model->eol)) { $date = date_create($this->purchase_date); - date_add($date, date_interval_create_from_date_string($this->model->model->eol . ' months')); + date_add($date, date_interval_create_from_date_string($this->model->model->eol.' months')); + return date_format($date, 'Y-m-d'); } - } /** @@ -415,10 +413,9 @@ class AssetPresenter extends Presenter */ public function months_until_eol() { - - $today = date("Y-m-d"); - $d1 = new DateTime($today); - $d2 = new DateTime($this->eol_date()); + $today = date('Y-m-d'); + $d1 = new DateTime($today); + $d2 = new DateTime($this->eol_date()); if ($this->eol_date() > $today) { $interval = $d2->diff($d1); @@ -439,6 +436,7 @@ class AssetPresenter extends Presenter if ($this->model->assigned) { return 'deployed'; } + return $this->model->assetstatus->getStatuslabelType(); } @@ -452,6 +450,7 @@ class AssetPresenter extends Presenter if ($this->model->assigned) { return trans('general.deployed'); } + return $this->model->assetstatus->name; } @@ -469,7 +468,8 @@ class AssetPresenter extends Presenter * (if not deployed:) * Another Status Label */ - public function fullStatusText() { + public function fullStatusText() + { // Make sure the status is valid if ($this->assetstatus) { @@ -478,7 +478,7 @@ class AssetPresenter extends Presenter // If it's assigned and not set to the default "ready to deploy" status if ($this->assetstatus->name != trans('general.ready_to_deploy')) { - return trans('general.deployed'). ' (' . $this->model->assetstatus->name.')'; + return trans('general.deployed').' ('.$this->model->assetstatus->name.')'; } // If it's assigned to the default "ready to deploy" status, just @@ -504,7 +504,8 @@ class AssetPresenter extends Presenter { if (($this->purchase_date) && ($this->warranty_months)) { $date = date_create($this->purchase_date); - date_add($date, date_interval_create_from_date_string($this->warranty_months . ' months')); + date_add($date, date_interval_create_from_date_string($this->warranty_months.' months')); + return date_format($date, 'Y-m-d'); } @@ -522,6 +523,6 @@ class AssetPresenter extends Presenter public function glyph() { - return ''; + return ''; } } diff --git a/app/Presenters/CategoryPresenter.php b/app/Presenters/CategoryPresenter.php index 19507e2771..5a93d12612 100644 --- a/app/Presenters/CategoryPresenter.php +++ b/app/Presenters/CategoryPresenter.php @@ -4,11 +4,9 @@ namespace App\Presenters; /** * Class CategoryPresenter - * @package App\Presenters */ class CategoryPresenter extends Presenter { - /** * Json Column Layout for bootstrap table * @return string @@ -17,44 +15,72 @@ class CategoryPresenter extends Presenter { $layout = [ [ - "field" => "id", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.id'), - "visible" => false + 'field' => 'id', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.id'), + 'visible' => false, ], [ - "field" => "name", - "searchable" => true, - "sortable" => true, - "title" => trans('general.name'), - "visible" => true, - "formatter" => 'categoriesLinkFormatter', + 'field' => 'name', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.name'), + 'visible' => true, + 'formatter' => 'categoriesLinkFormatter', + ], [ + 'field' => 'image', + 'searchable' => false, + 'sortable' => true, + 'title' => trans('general.image'), + 'visible' => true, + 'formatter' => 'imageFormatter', + ], [ + 'field' => 'category_type', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.type'), + 'visible' => true, + ], [ + 'field' => 'item_count', + 'searchable' => false, + 'sortable' => true, + 'title' => trans('general.qty'), + 'visible' => true, + ], [ + 'field' => 'has_eula', + 'searchable' => false, + 'sortable' => false, + 'title' => trans('admin/categories/table.eula_text'), + 'visible' => false, + 'formatter' => 'trueFalseFormatter', + ], [ + 'field' => 'checkin_email', + 'searchable' => false, + 'sortable' => true, + 'class' => 'css-envelope', + 'title' => 'Send Email', + 'visible' => true, + 'formatter' => 'trueFalseFormatter', + ], [ + 'field' => 'require_acceptance', + 'searchable' => false, + 'sortable' => true, + 'title' => trans('admin/categories/table.require_acceptance'), + 'visible' => true, + 'formatter' => 'trueFalseFormatter', + ], [ + 'field' => 'actions', + 'searchable' => false, + 'sortable' => false, + 'switchable' => false, + 'title' => trans('table.actions'), ],[ - "field" => "image", + "field" => "use_default_eula", "searchable" => false, "sortable" => true, - "title" => trans('general.image'), - "visible" => true, - "formatter" => 'imageFormatter', - ],[ - "field" => "category_type", - "searchable" => true, - "sortable" => true, - "title" => trans('general.type'), - "visible" => true - ],[ - "field" => "item_count", - "searchable" => false, - "sortable" => true, - "title" => trans('general.qty'), - "visible" => true - ],[ - "field" => "has_eula", - "searchable" => false, - "sortable" => false, - "title" => trans('admin/categories/table.eula_text'), - "visible" => false, + "title" => trans('admin/categories/general.use_default_eula_column'), + 'visible' => true, "formatter" => 'trueFalseFormatter', ],[ "field" => "checkin_email", @@ -68,40 +94,29 @@ class CategoryPresenter extends Presenter "field" => "require_acceptance", "searchable" => false, "sortable" => true, - "title" => trans('admin/categories/table.require_acceptance'), - "visible" => true, - "formatter" => 'trueFalseFormatter', - ],[ - "field" => "actions", - "searchable" => false, - "sortable" => false, - "switchable" => false, - "title" => trans('table.actions'), - "visible" => true, - "formatter" => "categoriesActionsFormatter", + 'formatter' => 'categoriesActionsFormatter', ], [ - "field" => "created_at", - "searchable" => true, - "sortable" => true, - "visible" => false, - "title" => trans('general.created_at'), - "formatter" => "dateDisplayFormatter" + 'field' => 'created_at', + 'searchable' => true, + 'sortable' => true, + 'visible' => false, + 'title' => trans('general.created_at'), + 'formatter' => 'dateDisplayFormatter', ], [ - "field" => "updated_at", - "searchable" => true, - "sortable" => true, - "visible" => false, - "title" => trans('general.updated_at'), - "formatter" => "dateDisplayFormatter" + 'field' => 'updated_at', + 'searchable' => true, + 'sortable' => true, + 'visible' => false, + 'title' => trans('general.updated_at'), + 'formatter' => 'dateDisplayFormatter', ], ]; return json_encode($layout); } - /** * Link to this categories name * @return string diff --git a/app/Presenters/CompanyPresenter.php b/app/Presenters/CompanyPresenter.php index 9f8e6fb376..a6aaebf7e4 100644 --- a/app/Presenters/CompanyPresenter.php +++ b/app/Presenters/CompanyPresenter.php @@ -4,7 +4,6 @@ namespace App\Presenters; /** * Class CompanyPresenter - * @package App\Presenters */ class CompanyPresenter extends Presenter { @@ -16,95 +15,94 @@ class CompanyPresenter extends Presenter { $layout = [ [ - "field" => "id", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.id'), - "visible" => false - ],[ - "field" => "name", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('admin/companies/table.name'), - "visible" => true, - "formatter" => 'companiesLinkFormatter', - ],[ - "field" => "image", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.image'), - "visible" => true, - "formatter" => 'imageFormatter', - ],[ - "field" => "users_count", - "searchable" => false, - "sortable" => true, - "title" => '', - "visible" => true, - - ],[ - "field" => "assets_count", - "searchable" => false, - "sortable" => true, - "title" => '', - "visible" => true, + 'field' => 'id', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.id'), + 'visible' => false, + ], [ + 'field' => 'name', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('admin/companies/table.name'), + 'visible' => true, + 'formatter' => 'companiesLinkFormatter', + ], [ + 'field' => 'image', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.image'), + 'visible' => true, + 'formatter' => 'imageFormatter', + ], [ + 'field' => 'users_count', + 'searchable' => false, + 'sortable' => true, + 'title' => '', + 'visible' => true, - ],[ - "field" => "licenses_count", - "searchable" => false, - "sortable" => true, - "visible" => true, - "title" => ' ', - ],[ - "field" => "accessories_count", - "searchable" => false, - "sortable" => true, - "visible" => true, - "title" => ' ', - ],[ - "field" => "consumables_count", - "searchable" => false, - "sortable" => true, - "visible" => true, - "title" => ' ', - ],[ - "field" => "components_count", - "searchable" => false, - "sortable" => true, - "visible" => true, - "title" => ' ', - ],[ - "field" => "updated_at", - "searchable" => false, - "sortable" => true, - "visible" => false, - "title" => trans('general.updated_at'), - "formatter" => 'createdAtFormatter', - ],[ - "field" => "created_at", - "searchable" => false, - "sortable" => true, - "visible" => false, - "title" => trans('general.created_at'), - "formatter" => 'createdAtFormatter', - ],[ - "field" => "actions", - "searchable" => false, - "sortable" => false, - "switchable" => false, - "title" => trans('table.actions'), - "visible" => true, - "formatter" => "companiesActionsFormatter", - ] + ], [ + 'field' => 'assets_count', + 'searchable' => false, + 'sortable' => true, + 'title' => '', + 'visible' => true, + + ], [ + 'field' => 'licenses_count', + 'searchable' => false, + 'sortable' => true, + 'visible' => true, + 'title' => ' ', + ], [ + 'field' => 'accessories_count', + 'searchable' => false, + 'sortable' => true, + 'visible' => true, + 'title' => ' ', + ], [ + 'field' => 'consumables_count', + 'searchable' => false, + 'sortable' => true, + 'visible' => true, + 'title' => ' ', + ], [ + 'field' => 'components_count', + 'searchable' => false, + 'sortable' => true, + 'visible' => true, + 'title' => ' ', + ], [ + 'field' => 'updated_at', + 'searchable' => false, + 'sortable' => true, + 'visible' => false, + 'title' => trans('general.updated_at'), + 'formatter' => 'createdAtFormatter', + ], [ + 'field' => 'created_at', + 'searchable' => false, + 'sortable' => true, + 'visible' => false, + 'title' => trans('general.created_at'), + 'formatter' => 'createdAtFormatter', + ], [ + 'field' => 'actions', + 'searchable' => false, + 'sortable' => false, + 'switchable' => false, + 'title' => trans('table.actions'), + 'visible' => true, + 'formatter' => 'companiesActionsFormatter', + ], ]; return json_encode($layout); } - /** * Link to this companies name * @return string diff --git a/app/Presenters/ComponentPresenter.php b/app/Presenters/ComponentPresenter.php index 669b5c651f..7f3dab0aa2 100644 --- a/app/Presenters/ComponentPresenter.php +++ b/app/Presenters/ComponentPresenter.php @@ -4,11 +4,9 @@ namespace App\Presenters; /** * Class ComponentPresenter - * @package App\Presenters */ class ComponentPresenter extends Presenter { - /** * Json Column Layout for bootstrap table * @return string @@ -17,116 +15,115 @@ class ComponentPresenter extends Presenter { $layout = [ [ - "field" => "id", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.id'), - "visible" => false + 'field' => 'id', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.id'), + 'visible' => false, ], [ - "field" => "company", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('general.company'), - "visible" => false, - "formatter" => 'companiesLinkObjFormatter', + 'field' => 'company', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.company'), + 'visible' => false, + 'formatter' => 'companiesLinkObjFormatter', ], [ - "field" => "name", - "searchable" => true, - "sortable" => true, - "title" => trans('general.name'), - "visible" => true, - "formatter" => 'componentsLinkFormatter', + 'field' => 'name', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.name'), + 'visible' => true, + 'formatter' => 'componentsLinkFormatter', ], [ - "field" => "image", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.image'), - "visible" => false, - "formatter" => 'imageFormatter', - ],[ - "field" => "serial", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/hardware/form.serial'), - "formatter" => "componentsLinkFormatter" + 'field' => 'image', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.image'), + 'visible' => false, + 'formatter' => 'imageFormatter', ], [ - "field" => "category", - "searchable" => true, - "sortable" => true, - "title" => trans('general.category'), - "formatter" => "categoriesLinkObjFormatter" + 'field' => 'serial', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/hardware/form.serial'), + 'formatter' => 'componentsLinkFormatter', ], [ - "field" => "qty", - "searchable" => false, - "sortable" => true, - "title" => trans('admin/components/general.total'), - "visible" => true, + 'field' => 'category', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.category'), + 'formatter' => 'categoriesLinkObjFormatter', ], [ - "field" => "remaining", - "searchable" => false, - "sortable" => false, - "title" => trans('admin/components/general.remaining'), - "visible" => true, + 'field' => 'qty', + 'searchable' => false, + 'sortable' => true, + 'title' => trans('admin/components/general.total'), + 'visible' => true, ], [ - "field" => "min_amt", - "searchable" => false, - "sortable" => false, - "title" => trans('general.min_amt'), - "visible" => true, + 'field' => 'remaining', + 'searchable' => false, + 'sortable' => false, + 'title' => trans('admin/components/general.remaining'), + 'visible' => true, ], [ - "field" => "location", - "searchable" => true, - "sortable" => true, - "title" => trans('general.location'), - "formatter" => "locationsLinkObjFormatter" + 'field' => 'min_amt', + 'searchable' => false, + 'sortable' => false, + 'title' => trans('general.min_amt'), + 'visible' => true, ], [ - "field" => "order_number", - "searchable" => true, - "sortable" => true, - "title" => trans('general.order_number'), - "visible" => true, - ],[ - "field" => "purchase_date", - "searchable" => true, - "sortable" => true, - "title" => trans('general.purchase_date'), - "visible" => true, - "formatter" => "dateDisplayFormatter", - ],[ - "field" => "purchase_cost", - "searchable" => true, - "sortable" => true, - "title" => trans('general.purchase_cost'), - "visible" => true, - "footerFormatter" => 'sumFormatter', + 'field' => 'location', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.location'), + 'formatter' => 'locationsLinkObjFormatter', + ], [ + 'field' => 'order_number', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.order_number'), + 'visible' => true, + ], [ + 'field' => 'purchase_date', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.purchase_date'), + 'visible' => true, + 'formatter' => 'dateDisplayFormatter', + ], [ + 'field' => 'purchase_cost', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.purchase_cost'), + 'visible' => true, + 'footerFormatter' => 'sumFormatter', ], ]; $layout[] = [ - "field" => "checkincheckout", - "searchable" => false, - "sortable" => false, - "switchable" => true, - "title" => trans('general.checkin').'/'.trans('general.checkout'), - "visible" => true, - "formatter" => "componentsInOutFormatter", + 'field' => 'checkincheckout', + 'searchable' => false, + 'sortable' => false, + 'switchable' => true, + 'title' => trans('general.checkin').'/'.trans('general.checkout'), + 'visible' => true, + 'formatter' => 'componentsInOutFormatter', ]; $layout[] = [ - "field" => "actions", - "searchable" => false, - "sortable" => false, - "switchable" => false, - "title" => trans('table.actions'), - "formatter" => "componentsActionsFormatter", + 'field' => 'actions', + 'searchable' => false, + 'sortable' => false, + 'switchable' => false, + 'title' => trans('table.actions'), + 'formatter' => 'componentsActionsFormatter', ]; - return json_encode($layout); } @@ -147,6 +144,4 @@ class ComponentPresenter extends Presenter { return route('accessories.show', $this->id); } - - } diff --git a/app/Presenters/ConsumablePresenter.php b/app/Presenters/ConsumablePresenter.php index 334398fabd..c80972955e 100644 --- a/app/Presenters/ConsumablePresenter.php +++ b/app/Presenters/ConsumablePresenter.php @@ -2,14 +2,11 @@ namespace App\Presenters; - /** * Class ComponentPresenter - * @package App\Presenters */ class ConsumablePresenter extends Presenter { - /** * Json Column Layout for bootstrap table * @return string @@ -18,121 +15,121 @@ class ConsumablePresenter extends Presenter { $layout = [ [ - "field" => "id", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.id'), - "visible" => false + 'field' => 'id', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.id'), + 'visible' => false, ], [ - "field" => "company", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('general.company'), - "visible" => false, - "formatter" => 'companiesLinkObjFormatter', + 'field' => 'company', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.company'), + 'visible' => false, + 'formatter' => 'companiesLinkObjFormatter', ], [ - "field" => "name", - "searchable" => true, - "sortable" => true, - "title" => trans('general.name'), - "visible" => true, - "formatter" => 'consumablesLinkFormatter', + 'field' => 'name', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.name'), + 'visible' => true, + 'formatter' => 'consumablesLinkFormatter', ], [ - "field" => "image", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.image'), - "visible" => false, - "formatter" => 'imageFormatter', + 'field' => 'image', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.image'), + 'visible' => false, + 'formatter' => 'imageFormatter', ], [ - "field" => "category", - "searchable" => true, - "sortable" => true, - "title" => trans('general.category'), - "formatter" => "categoriesLinkObjFormatter" - ],[ - "field" => "model_number", - "searchable" => true, - "sortable" => true, - "title" => trans('general.model_no'), - ],[ - "field" => "item_no", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/consumables/general.item_no') + 'field' => 'category', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.category'), + 'formatter' => 'categoriesLinkObjFormatter', ], [ - "field" => "qty", - "searchable" => false, - "sortable" => false, - "title" => trans('admin/components/general.total'), - "visible" => true, + 'field' => 'model_number', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.model_no'), ], [ - "field" => "remaining", - "searchable" => false, - "sortable" => false, - "title" => trans('admin/components/general.remaining'), - "visible" => true, + 'field' => 'item_no', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/consumables/general.item_no'), ], [ - "field" => "min_amt", - "searchable" => false, - "sortable" => false, - "title" => trans('general.min_amt'), - "visible" => true, + 'field' => 'qty', + 'searchable' => false, + 'sortable' => false, + 'title' => trans('admin/components/general.total'), + 'visible' => true, + ], [ + 'field' => 'remaining', + 'searchable' => false, + 'sortable' => false, + 'title' => trans('admin/components/general.remaining'), + 'visible' => true, + ], [ + 'field' => 'min_amt', + 'searchable' => false, + 'sortable' => false, + 'title' => trans('general.min_amt'), + 'visible' => true, ], [ - "field" => "location", - "searchable" => true, - "sortable" => true, - "title" => trans('general.location'), - "formatter" => "locationsLinkObjFormatter" + 'field' => 'location', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.location'), + 'formatter' => 'locationsLinkObjFormatter', ], [ - "field" => "manufacturer", - "searchable" => true, - "sortable" => true, - "title" => trans('general.manufacturer'), - "visible" => false, - "formatter" => "manufacturersLinkObjFormatter" + 'field' => 'manufacturer', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.manufacturer'), + 'visible' => false, + 'formatter' => 'manufacturersLinkObjFormatter', ], [ - "field" => "order_number", - "searchable" => true, - "sortable" => true, - "title" => trans('general.order_number'), - "visible" => true, - ],[ - "field" => "purchase_date", - "searchable" => true, - "sortable" => true, - "title" => trans('general.purchase_date'), - "visible" => true, - "formatter" => "dateDisplayFormatter", - ],[ - "field" => "purchase_cost", - "searchable" => true, - "sortable" => true, - "title" => trans('general.purchase_cost'), - "visible" => true, - "footerFormatter" => 'sumFormatter', - ],[ - "field" => "change", - "searchable" => false, - "sortable" => false, - "visible" => true, - "title" => trans('general.change'), - "formatter" => "consumablesInOutFormatter", + 'field' => 'order_number', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.order_number'), + 'visible' => true, ], [ - "field" => "actions", - "searchable" => false, - "sortable" => false, - "switchable" => false, - "title" => trans('table.actions'), - "visible" => true, - "formatter" => "consumablesActionsFormatter", - ] + 'field' => 'purchase_date', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.purchase_date'), + 'visible' => true, + 'formatter' => 'dateDisplayFormatter', + ], [ + 'field' => 'purchase_cost', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.purchase_cost'), + 'visible' => true, + 'footerFormatter' => 'sumFormatter', + ], [ + 'field' => 'change', + 'searchable' => false, + 'sortable' => false, + 'visible' => true, + 'title' => trans('general.change'), + 'formatter' => 'consumablesInOutFormatter', + ], [ + 'field' => 'actions', + 'searchable' => false, + 'sortable' => false, + 'switchable' => false, + 'title' => trans('table.actions'), + 'visible' => true, + 'formatter' => 'consumablesActionsFormatter', + ], ]; return json_encode($layout); @@ -155,6 +152,4 @@ class ConsumablePresenter extends Presenter { return (string) link_to_route('consumables.show', e($this->name), $this->id); } - - } diff --git a/app/Presenters/DepreciationPresenter.php b/app/Presenters/DepreciationPresenter.php index d6e51ec81c..2a293a46ff 100644 --- a/app/Presenters/DepreciationPresenter.php +++ b/app/Presenters/DepreciationPresenter.php @@ -4,7 +4,6 @@ namespace App\Presenters; /** * Class DepreciationPresenter - * @package App\Presenters */ class DepreciationPresenter extends Presenter { @@ -16,41 +15,47 @@ class DepreciationPresenter extends Presenter { $layout = [ [ - "field" => "id", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.id'), - "visible" => false + 'field' => 'id', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.id'), + 'visible' => false, ], [ - "field" => "name", - "searchable" => true, - "sortable" => true, - "title" => trans('general.name'), - "visible" => true, - "formatter" => 'depreciationsLinkFormatter', + 'field' => 'name', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.name'), + 'visible' => true, + 'formatter' => 'depreciationsLinkFormatter', ], [ - "field" => "months", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/depreciations/table.term'), - "visible" => true, + 'field' => 'months', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/depreciations/table.term'), + 'visible' => true, ], [ - "field" => "actions", + "field" => 'depreciation_min', "searchable" => false, - "sortable" => false, - "switchable" => false, - "title" => trans('table.actions'), + "sortable" => true, + "title" => trans('admin/depreciations/table.depreciation_min'), "visible" => true, - "formatter" => "depreciationsActionsFormatter", - ] + ], + [ + 'field' => 'actions', + 'searchable' => false, + 'sortable' => false, + 'switchable' => false, + 'title' => trans('table.actions'), + 'visible' => true, + 'formatter' => 'depreciationsActionsFormatter', + ], ]; return json_encode($layout); } - } diff --git a/app/Presenters/DepreciationReportPresenter.php b/app/Presenters/DepreciationReportPresenter.php new file mode 100644 index 0000000000..b34174a3e2 --- /dev/null +++ b/app/Presenters/DepreciationReportPresenter.php @@ -0,0 +1,401 @@ + "company", + "searchable" => true, + "sortable" => true, + "switchable" => true, + "title" => trans('general.company'), + "visible" => false, + ], [ + "field" => "category", + "searchable" => true, + "sortable" => true, + "title" => trans('general.category'), + "visible" => true, + ], [ + "field" => "name", + "searchable" => true, + "sortable" => true, + "title" => trans('admin/hardware/form.name'), + "visible" => false, + ], [ + "field" => "asset_tag", + "searchable" => true, + "sortable" => true, + "title" => trans('general.asset_tag'), + "visible" => true, + ],[ + "field" => "model", + "searchable" => true, + "sortable" => true, + "title" => trans('general.asset_model'), + "visible" => true, + ], [ + "field" => "model", + "searchable" => true, + "sortable" => true, + "title" => trans('admin/hardware/form.model'), + "visible" => true, + ], [ + "field" => "model_number", + "searchable" => true, + "sortable" => true, + "title" => trans('admin/models/table.modelnumber'), + "visible" => false + ], [ + "field" => "serial", + "searchable" => true, + "sortable" => true, + "title" => trans('admin/hardware/form.serial'), + "visible" => true, + ], [ + "field" => "depreciation", + "searchable" => true, + "sortable" => true, + "title" => trans('general.depreciation'), + "visible" => true, + ], [ + "field" => "number_of_months", + "searchable" => true, + "sortable" => true, + "title" => trans('admin/depreciations/general.number_of_months'), + "visible" => true, + ], [ + "field" => "status", + "searchable" => true, + "sortable" => true, + "title" => trans('admin/hardware/table.status'), + "visible" => true, + ], [ + "field" => "checked_out_to", + "searchable" => true, + "sortable" => true, + "title" => trans('admin/hardware/table.checkoutto'), + "visible" => false, + ], [ + "field" => "location", + "searchable" => true, + "sortable" => true, + "title" => trans('admin/hardware/table.location'), + "visible" => true, + ], [ + "field" => "manufacturer", + "searchable" => true, + "sortable" => true, + "title" => trans('general.manufacturer'), + "visible" => false, + ],[ + "field" => "supplier", + "searchable" => true, + "sortable" => true, + "title" => trans('general.supplier'), + "visible" => false, + ], [ + "field" => "purchase_date", + "searchable" => true, + "sortable" => true, + "visible" => true, + "title" => trans('general.purchase_date'), + "formatter" => "dateDisplayFormatter" + ], [ + "field" => "currency", + "searchable" => false, + "sortable" => false, + "visible" => false, + "title" => 'Currency', + ], [ + "field" => "purchase_cost", + "searchable" => true, + "sortable" => true, + "visible" => true, + "title" => trans('general.purchase_cost'), + "footerFormatter" => 'sumFormatter', + ], [ + "field" => "order_number", + "searchable" => true, + "sortable" => true, + "visible" => false, + "title" => trans('general.order_number'), + ], [ + "field" => "eol", + "searchable" => false, + "sortable" => false, + "visible" => false, + "title" => trans('general.eol'), + "formatter" => "dateDisplayFormatter" + ], [ + "field" => "book_value", + "searchable" => true, + "sortable" => true, + "visible" => true, + "title" => trans('admin/hardware/table.book_value'), + "footerFormatter" => 'sumFormatter', + ], [ + "field" => "monthly_depreciation", + "searchable" => true, + "sortable" => true, + "visible" => true, + "title" => trans('admin/hardware/table.monthly_depreciation') + ],[ + "field" => "diff", + "searchable" => false, + "sortable" => false, + "visible" => true, + "title" => trans('admin/hardware/table.diff'), + "footerFormatter" => 'sumFormatter', + ],[ + "field" => "warranty_expires", + "searchable" => false, + "sortable" => false, + "visible" => false, + "title" => trans('admin/hardware/form.warranty_expires'), + "formatter" => "dateDisplayFormatter" + ], + ]; + + return json_encode($layout); + } + + + + /** + * Generate html link to this items name. + * @return string + */ + public function nameUrl() + { + return (string) link_to_route('hardware.show', e($this->name), $this->id); + } + + public function modelUrl() + { + if ($this->model->model) { + return $this->model->model->present()->nameUrl(); + } + return ''; + } + + /** + * Generate img tag to this items image. + * @return mixed|string + */ + public function imageUrl() + { + $imagePath = ''; + if ($this->image && !empty($this->image)) { + $imagePath = $this->image; + $imageAlt = $this->name; + } elseif ($this->model && !empty($this->model->image)) { + $imagePath = $this->model->image; + $imageAlt = $this->model->name; + } + $url = config('app.url'); + if (!empty($imagePath)) { + $imagePath = ''.$imageAlt.''; + } + return $imagePath; + } + + /** + * Generate img tag to this items image. + * @return mixed|string + */ + public function imageSrc() + { + $imagePath = ''; + if ($this->image && !empty($this->image)) { + $imagePath = $this->image; + } elseif ($this->model && !empty($this->model->image)) { + $imagePath = $this->model->image; + } + if (!empty($imagePath)) { + return config('app.url').'/uploads/assets/'.$imagePath; + } + return $imagePath; + } + + /** + * Get Displayable Name + * @return string + * + * @todo this should be factored out - it should be subsumed by fullName (below) + * + **/ + public function name() + { + return $this->fullName; + } + + /** + * Helper for notification polymorphism. + * @return mixed + */ + public function fullName() + { + $str = ''; + + // Asset name + if ($this->model->name) { + $str .= $this->model->name; + } + + // Asset tag + if ($this->asset_tag) { + $str .= ' ('.$this->model->asset_tag.')'; + } + + // Asset Model name + if ($this->model->model) { + $str .= ' - '.$this->model->model->name; + } + return $str; + } + /** + * Returns the date this item hits EOL. + * @return false|string + */ + public function eol_date() + { + + if (( $this->purchase_date ) && ( $this->model->model ) && ($this->model->model->eol) ) { + $date = date_create($this->purchase_date); + date_add($date, date_interval_create_from_date_string($this->model->model->eol . ' months')); + return date_format($date, 'Y-m-d'); + } + + } + + /** + * How many months until this asset hits EOL. + * @return null + */ + public function months_until_eol() + { + + $today = date("Y-m-d"); + $d1 = new DateTime($today); + $d2 = new DateTime($this->eol_date()); + + if ($this->eol_date() > $today) { + $interval = $d2->diff($d1); + } else { + $interval = null; + } + + return $interval; + } + + /** + * @return string + * This handles the status label "meta" status of "deployed" if + * it's assigned. Should maybe deprecate. + */ + public function statusMeta() + { + if ($this->model->assigned) { + return 'deployed'; + } + return $this->model->assetstatus->getStatuslabelType(); + } + + /** + * @return string + * This handles the status label "meta" status of "deployed" if + * it's assigned. Should maybe deprecate. + */ + public function statusText() + { + if ($this->model->assigned) { + return trans('general.deployed'); + } + return $this->model->assetstatus->name; + } + + /** + * @return string + * This handles the status label "meta" status of "deployed" if + * it's assigned. Results look like: + * + * (if assigned and the status label is "Ready to Deploy"): + * (Deployed) + * + * (f assigned and status label is not "Ready to Deploy":) + * Deployed (Another Status Label) + * + * (if not deployed:) + * Another Status Label + */ + public function fullStatusText() { + // Make sure the status is valid + if ($this->assetstatus) { + + // If the status is assigned to someone or something... + if ($this->model->assigned) { + + // If it's assigned and not set to the default "ready to deploy" status + if ($this->assetstatus->name != trans('general.ready_to_deploy')) { + return trans('general.deployed'). ' (' . $this->model->assetstatus->name.')'; + } + + // If it's assigned to the default "ready to deploy" status, just + // say it's deployed - otherwise it's confusing to have a status that is + // both "ready to deploy" and deployed at the same time. + return trans('general.deployed'); + } + + // Return just the status name + return $this->model->assetstatus->name; + } + + // This status doesn't seem valid - either data has been manually edited or + // the status label was deleted. + return 'Invalid status'; + } + + /** + * Date the warantee expires. + * @return false|string + */ + public function warrantee_expires() + { + if (($this->purchase_date) && ($this->warranty_months)) { + $date = date_create($this->purchase_date); + date_add($date, date_interval_create_from_date_string($this->warranty_months . ' months')); + return date_format($date, 'Y-m-d'); + } + + return false; + } + + /** + * Url to view this item. + * @return string + */ + public function viewUrl() + { + return route('hardware.show', $this->id); + } + + public function glyph() + { + return ''; + } +} diff --git a/app/Presenters/LicensePresenter.php b/app/Presenters/LicensePresenter.php index be5a600c4f..d050a521d2 100644 --- a/app/Presenters/LicensePresenter.php +++ b/app/Presenters/LicensePresenter.php @@ -4,7 +4,6 @@ namespace App\Presenters; /** * Class LicensePresenter - * @package App\Presenters */ class LicensePresenter extends Presenter { @@ -16,174 +15,172 @@ class LicensePresenter extends Presenter { $layout = [ [ - "field" => "id", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.id'), - "visible" => false + 'field' => 'id', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.id'), + 'visible' => false, ], [ - "field" => "company", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('admin/companies/table.title'), - "visible" => false, - "formatter" => "companiesLinkObjFormatter" + 'field' => 'company', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('admin/companies/table.title'), + 'visible' => false, + 'formatter' => 'companiesLinkObjFormatter', ], [ - "field" => "name", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/licenses/table.title'), - "formatter" => "licensesLinkFormatter" + 'field' => 'name', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/licenses/table.title'), + 'formatter' => 'licensesLinkFormatter', ], [ - "field" => "product_key", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/licenses/form.license_key'), - "formatter" => "licensesLinkFormatter" + 'field' => 'product_key', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/licenses/form.license_key'), + 'formatter' => 'licensesLinkFormatter', ], [ - "field" => "expiration_date", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/licenses/form.expiration'), - 'formatter' => 'dateDisplayFormatter' + 'field' => 'expiration_date', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/licenses/form.expiration'), + 'formatter' => 'dateDisplayFormatter', ], [ - "field" => "license_email", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/licenses/form.to_email') + 'field' => 'license_email', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/licenses/form.to_email'), ], [ - "field" => "license_name", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/licenses/form.to_name'), + 'field' => 'license_name', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/licenses/form.to_name'), ], [ - "field" => "category", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('general.category'), - "visible" => false, - "formatter" => "categoriesLinkObjFormatter" + 'field' => 'category', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.category'), + 'visible' => false, + 'formatter' => 'categoriesLinkObjFormatter', ], [ - "field" => "supplier", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('general.supplier'), - "visible" => false, - "formatter" => "suppliersLinkObjFormatter" + 'field' => 'supplier', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.supplier'), + 'visible' => false, + 'formatter' => 'suppliersLinkObjFormatter', ], [ - "field" => "manufacturer", - "searchable" => true, - "sortable" => true, - "title" => trans('general.manufacturer'), - "formatter" => "manufacturersLinkObjFormatter", + 'field' => 'manufacturer', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.manufacturer'), + 'formatter' => 'manufacturersLinkObjFormatter', ], [ - "field" => "seats", - "searchable" => false, - "sortable" => true, - "title" => trans('admin/accessories/general.total'), + 'field' => 'seats', + 'searchable' => false, + 'sortable' => true, + 'title' => trans('admin/accessories/general.total'), ], [ - "field" => "free_seats_count", - "searchable" => false, - "sortable" => true, - "title" => trans('admin/accessories/general.remaining'), + 'field' => 'free_seats_count', + 'searchable' => false, + 'sortable' => true, + 'title' => trans('admin/accessories/general.remaining'), ], [ - "field" => "purchase_date", - "searchable" => true, - "sortable" => true, - "visible" => false, - "title" => trans('general.purchase_date'), - 'formatter' => 'dateDisplayFormatter' + 'field' => 'purchase_date', + 'searchable' => true, + 'sortable' => true, + 'visible' => false, + 'title' => trans('general.purchase_date'), + 'formatter' => 'dateDisplayFormatter', ], [ - "field" => "termination_date", - "searchable" => true, - "sortable" => true, - "visible" => false, - "title" => trans('admin/licenses/form.termination_date'), - 'formatter' => 'dateDisplayFormatter' + 'field' => 'termination_date', + 'searchable' => true, + 'sortable' => true, + 'visible' => false, + 'title' => trans('admin/licenses/form.termination_date'), + 'formatter' => 'dateDisplayFormatter', ], [ - "field" => "depreciation", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('admin/hardware/form.depreciation'), - "visible" => false, - "formatter" => "depreciationsLinkObjFormatter", + 'field' => 'depreciation', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('admin/hardware/form.depreciation'), + 'visible' => false, + 'formatter' => 'depreciationsLinkObjFormatter', ], [ - "field" => "maintained", - "searchable" => false, - "sortable" => true, - "visible" => false, - "title" => trans('admin/licenses/form.maintained'), - "formatter" => "trueFalseFormatter" + 'field' => 'maintained', + 'searchable' => false, + 'sortable' => true, + 'visible' => false, + 'title' => trans('admin/licenses/form.maintained'), + 'formatter' => 'trueFalseFormatter', ], [ - "field" => "reassignable", - "searchable" => false, - "sortable" => true, - "visible" => false, - "title" => trans('admin/licenses/form.reassignable'), - "formatter" => "trueFalseFormatter" + 'field' => 'reassignable', + 'searchable' => false, + 'sortable' => true, + 'visible' => false, + 'title' => trans('admin/licenses/form.reassignable'), + 'formatter' => 'trueFalseFormatter', ], [ - "field" => "purchase_cost", - "searchable" => true, - "sortable" => true, - "visible" => false, - "title" => trans('general.purchase_cost'), - "footerFormatter" => 'sumFormatter', + 'field' => 'purchase_cost', + 'searchable' => true, + 'sortable' => true, + 'visible' => false, + 'title' => trans('general.purchase_cost'), + 'footerFormatter' => 'sumFormatter', ], [ - "field" => "purchase_order", - "searchable" => true, - "sortable" => true, - "visible" => false, - "title" => trans('admin/licenses/form.purchase_order'), + 'field' => 'purchase_order', + 'searchable' => true, + 'sortable' => true, + 'visible' => false, + 'title' => trans('admin/licenses/form.purchase_order'), ], [ - "field" => "order_number", - "searchable" => true, - "sortable" => true, - "visible" => false, - "title" => trans('general.order_number'), + 'field' => 'order_number', + 'searchable' => true, + 'sortable' => true, + 'visible' => false, + 'title' => trans('general.order_number'), ], [ - "field" => "notes", - "searchable" => true, - "sortable" => true, - "visible" => false, - "title" => trans('general.notes'), - "formatter" => "notesFormatter" - ] + 'field' => 'notes', + 'searchable' => true, + 'sortable' => true, + 'visible' => false, + 'title' => trans('general.notes'), + 'formatter' => 'notesFormatter', + ], ]; $layout[] = [ - "field" => "checkincheckout", - "searchable" => false, - "sortable" => false, - "switchable" => true, - "title" => trans('general.checkin').'/'.trans('general.checkout'), - "visible" => true, - "formatter" => "licensesInOutFormatter", + 'field' => 'checkincheckout', + 'searchable' => false, + 'sortable' => false, + 'switchable' => true, + 'title' => trans('general.checkin').'/'.trans('general.checkout'), + 'visible' => true, + 'formatter' => 'licensesInOutFormatter', ]; $layout[] = [ - "field" => "actions", - "searchable" => false, - "sortable" => false, - "switchable" => false, - "title" => trans('table.actions'), - "formatter" => "licensesActionsFormatter", + 'field' => 'actions', + 'searchable' => false, + 'sortable' => false, + 'switchable' => false, + 'title' => trans('table.actions'), + 'formatter' => 'licensesActionsFormatter', ]; - return json_encode($layout); } - /** * Json Column Layout for bootstrap table * @return string @@ -192,69 +189,68 @@ class LicensePresenter extends Presenter { $layout = [ [ - "field" => "name", - "searchable" => false, - "sortable" => false, - "sorter" => "numericOnly", - "switchable" => true, - "title" => trans('admin/licenses/general.seat'), - "visible" => true, + 'field' => 'name', + 'searchable' => false, + 'sortable' => false, + 'sorter' => 'numericOnly', + 'switchable' => true, + 'title' => trans('admin/licenses/general.seat'), + 'visible' => true, ], [ - "field" => "assigned_user", - "searchable" => false, - "sortable" => false, - "switchable" => true, - "title" => trans('admin/licenses/general.user'), - "visible" => true, - "formatter" => "usersLinkObjFormatter" + 'field' => 'assigned_user', + 'searchable' => false, + 'sortable' => false, + 'switchable' => true, + 'title' => trans('admin/licenses/general.user'), + 'visible' => true, + 'formatter' => 'usersLinkObjFormatter', ], [ - "field" => "department", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.department'), - "visible" => false, - "formatter" => "departmentNameLinkFormatter" + 'field' => 'department', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.department'), + 'visible' => false, + 'formatter' => 'departmentNameLinkFormatter', ], [ - "field" => "assigned_asset", - "searchable" => false, - "sortable" => false, - "switchable" => true, - "title" => trans('admin/licenses/form.asset'), - "visible" => true, - "formatter" => "hardwareLinkObjFormatter" + 'field' => 'assigned_asset', + 'searchable' => false, + 'sortable' => false, + 'switchable' => true, + 'title' => trans('admin/licenses/form.asset'), + 'visible' => true, + 'formatter' => 'hardwareLinkObjFormatter', ], [ - "field" => "location", - "searchable" => false, - "sortable" => false, - "switchable" => true, - "title" => trans('general.location'), - "visible" => true, - "formatter" => "locationsLinkObjFormatter" + 'field' => 'location', + 'searchable' => false, + 'sortable' => false, + 'switchable' => true, + 'title' => trans('general.location'), + 'visible' => true, + 'formatter' => 'locationsLinkObjFormatter', ], [ - "field" => "checkincheckout", - "searchable" => false, - "sortable" => false, - "switchable" => true, - "title" => trans('general.checkin').'/'.trans('general.checkout'), - "visible" => true, - "formatter" => "licenseSeatInOutFormatter" - ] + 'field' => 'checkincheckout', + 'searchable' => false, + 'sortable' => false, + 'switchable' => true, + 'title' => trans('general.checkin').'/'.trans('general.checkout'), + 'visible' => true, + 'formatter' => 'licenseSeatInOutFormatter', + ], ]; return json_encode($layout); } - /** * Link to this licenses Name * @return string */ public function nameUrl() { - return (string)link_to_route('licenses.show', $this->name, $this->id); + return (string) link_to_route('licenses.show', $this->name, $this->id); } /** @@ -266,14 +262,13 @@ class LicensePresenter extends Presenter return $this->name; } - /** * Link to this licenses serial * @return string */ public function serialUrl() { - return (string) link_to('/licenses/'.$this->id, mb_strimwidth($this->serial, 0, 50, "...")); + return (string) link_to('/licenses/'.$this->id, mb_strimwidth($this->serial, 0, 50, '...')); } /** diff --git a/app/Presenters/LicenseSeatPresenter.php b/app/Presenters/LicenseSeatPresenter.php index 03f02cbd72..ed706f95a7 100644 --- a/app/Presenters/LicenseSeatPresenter.php +++ b/app/Presenters/LicenseSeatPresenter.php @@ -4,7 +4,6 @@ namespace App\Presenters; /** * Class LicensePresenter - * @package App\Presenters */ class LicenseSeatPresenter extends Presenter { diff --git a/app/Presenters/LocationPresenter.php b/app/Presenters/LocationPresenter.php index 9a91e2af2a..0836eeb260 100644 --- a/app/Presenters/LocationPresenter.php +++ b/app/Presenters/LocationPresenter.php @@ -4,11 +4,9 @@ namespace App\Presenters; /** * Class LocationPresenter - * @package App\Presenters */ class LocationPresenter extends Presenter { - /** * Json Column Layout for bootstrap table * @return string @@ -18,163 +16,161 @@ class LocationPresenter extends Presenter $layout = [ [ - "field" => "id", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.id'), - "visible" => false + 'field' => 'id', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.id'), + 'visible' => false, ], [ - "field" => "name", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/locations/table.name'), - "visible" => true, - "formatter" => "locationsLinkFormatter" + 'field' => 'name', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/locations/table.name'), + 'visible' => true, + 'formatter' => 'locationsLinkFormatter', ], [ - "field" => "image", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.image'), - "visible" => true, - "formatter" => "imageFormatter" + 'field' => 'image', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.image'), + 'visible' => true, + 'formatter' => 'imageFormatter', ], [ - "field" => "parent", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('admin/locations/table.parent'), - "visible" => true, - "formatter" => "locationsLinkObjFormatter" + 'field' => 'parent', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('admin/locations/table.parent'), + 'visible' => true, + 'formatter' => 'locationsLinkObjFormatter', ], [ - "field" => "assets_count", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('admin/locations/table.assets_rtd'), - "visible" => true, + 'field' => 'assets_count', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('admin/locations/table.assets_rtd'), + 'visible' => true, ], [ - "field" => "assigned_assets_count", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('admin/locations/table.assets_checkedout'), - "visible" => true, + 'field' => 'assigned_assets_count', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('admin/locations/table.assets_checkedout'), + 'visible' => true, ], [ - "field" => "users_count", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.people'), - "visible" => true, + 'field' => 'users_count', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.people'), + 'visible' => true, ], [ - "field" => "currency", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('general.currency'), - "visible" => true, + 'field' => 'currency', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.currency'), + 'visible' => true, ], [ - "field" => "address", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('admin/locations/table.address'), - "visible" => true, + 'field' => 'address', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('admin/locations/table.address'), + 'visible' => true, ], [ - "field" => "city", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('admin/locations/table.city'), - "visible" => true, + 'field' => 'city', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('admin/locations/table.city'), + 'visible' => true, ], [ - "field" => "state", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('admin/locations/table.state'), - "visible" => true, + 'field' => 'state', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('admin/locations/table.state'), + 'visible' => true, ], [ - "field" => "zip", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('admin/locations/table.zip'), - "visible" => false, + 'field' => 'zip', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('admin/locations/table.zip'), + 'visible' => false, ], [ - "field" => "country", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('admin/locations/table.country'), - "visible" => false, + 'field' => 'country', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('admin/locations/table.country'), + 'visible' => false, ], [ - "field" => "ldap_ou", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('admin/locations/table.ldap_ou'), - "visible" => false, + 'field' => 'ldap_ou', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('admin/locations/table.ldap_ou'), + 'visible' => false, ], [ - "field" => "manager", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('admin/users/table.manager'), - "visible" => false, - "formatter" => 'usersLinkObjFormatter' + 'field' => 'manager', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('admin/users/table.manager'), + 'visible' => false, + 'formatter' => 'usersLinkObjFormatter', ], [ - "field" => "created_at", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('general.created_at'), - "visible" => false, - 'formatter' => 'dateDisplayFormatter' + 'field' => 'created_at', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.created_at'), + 'visible' => false, + 'formatter' => 'dateDisplayFormatter', ], [ - "field" => "actions", - "searchable" => false, - "sortable" => false, - "switchable" => false, - "title" => trans('table.actions'), - "visible" => true, - "formatter" => "locationsActionsFormatter", - ] + 'field' => 'actions', + 'searchable' => false, + 'sortable' => false, + 'switchable' => false, + 'title' => trans('table.actions'), + 'visible' => true, + 'formatter' => 'locationsActionsFormatter', + ], ]; return json_encode($layout); } - - /** * Link to this locations name * @return string */ public function nameUrl() { - return (string)link_to_route('locations.show', $this->name, $this->id); + return (string) link_to_route('locations.show', $this->name, $this->id); } /** @@ -197,10 +193,11 @@ class LocationPresenter extends Presenter public function glyph() { - return ''; + return ''; } - - public function fullName() { + + public function fullName() + { return $this->name; } } diff --git a/app/Presenters/ManufacturerPresenter.php b/app/Presenters/ManufacturerPresenter.php index c78da85f00..5b44a76933 100644 --- a/app/Presenters/ManufacturerPresenter.php +++ b/app/Presenters/ManufacturerPresenter.php @@ -4,11 +4,9 @@ namespace App\Presenters; /** * Class ManufacturerPresenter - * @package App\Presenters */ class ManufacturerPresenter extends Presenter { - /** * Json Column Layout for bootstrap table * @return string @@ -18,131 +16,129 @@ class ManufacturerPresenter extends Presenter $layout = [ [ - "field" => "id", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.id'), - "visible" => false + 'field' => 'id', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.id'), + 'visible' => false, ], [ - "field" => "name", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/manufacturers/table.name'), - "visible" => true, - "formatter" => "manufacturersLinkFormatter" + 'field' => 'name', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/manufacturers/table.name'), + 'visible' => true, + 'formatter' => 'manufacturersLinkFormatter', ], [ - "field" => "image", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.image'), - "visible" => true, - "formatter" => "imageFormatter" + 'field' => 'image', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.image'), + 'visible' => true, + 'formatter' => 'imageFormatter', ], [ - "field" => "url", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('admin/manufacturers/table.url'), - "visible" => true, - "formatter" => "linkFormatter" + 'field' => 'url', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('admin/manufacturers/table.url'), + 'visible' => true, + 'formatter' => 'linkFormatter', ], [ - "field" => "support_url", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('admin/manufacturers/table.support_url'), - "visible" => true, - "formatter" => "linkFormatter" + 'field' => 'support_url', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('admin/manufacturers/table.support_url'), + 'visible' => true, + 'formatter' => 'linkFormatter', ], [ - "field" => "support_phone", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('admin/manufacturers/table.support_phone'), - "visible" => true, - "formatter" => "phoneFormatter" + 'field' => 'support_phone', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('admin/manufacturers/table.support_phone'), + 'visible' => true, + 'formatter' => 'phoneFormatter', ], [ - "field" => "support_email", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('admin/manufacturers/table.support_email'), - "visible" => true, - "formatter" => "emailFormatter" + 'field' => 'support_email', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('admin/manufacturers/table.support_email'), + 'visible' => true, + 'formatter' => 'emailFormatter', ], [ - "field" => "assets_count", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => ' ' - .'', - "visible" => true, + 'field' => 'assets_count', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => ' ' + .'', + 'visible' => true, ], [ - "field" => "licenses_count", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => ' ' - .'', - "visible" => true, + 'field' => 'licenses_count', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => ' ' + .'', + 'visible' => true, ], [ - "field" => "consumables_count", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => ' ' - .'', - "visible" => true, + 'field' => 'consumables_count', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => ' ' + .'', + 'visible' => true, ], [ - "field" => "accessories_count", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => ' ' - .'', - "visible" => true, + 'field' => 'accessories_count', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => ' ' + .'', + 'visible' => true, ], [ - "field" => "created_at", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('general.created_at'), - "visible" => false, - 'formatter' => 'dateDisplayFormatter' + 'field' => 'created_at', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.created_at'), + 'visible' => false, + 'formatter' => 'dateDisplayFormatter', ], [ - "field" => "actions", - "searchable" => false, - "sortable" => false, - "switchable" => false, - "title" => trans('table.actions'), - "visible" => true, - "formatter" => "manufacturersActionsFormatter", - ] + 'field' => 'actions', + 'searchable' => false, + 'sortable' => false, + 'switchable' => false, + 'title' => trans('table.actions'), + 'visible' => true, + 'formatter' => 'manufacturersActionsFormatter', + ], ]; return json_encode($layout); } - - /** * Link to this manufacturers name * @return string diff --git a/app/Presenters/PredefinedKitPresenter.php b/app/Presenters/PredefinedKitPresenter.php index dddaff069f..b9fa5b5ae5 100644 --- a/app/Presenters/PredefinedKitPresenter.php +++ b/app/Presenters/PredefinedKitPresenter.php @@ -4,7 +4,6 @@ namespace App\Presenters; /** * Class LicensePresenter - * @package App\Presenters */ class PredefinedKitPresenter extends Presenter { @@ -16,45 +15,43 @@ class PredefinedKitPresenter extends Presenter { $layout = [ [ - "field" => "id", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.id'), - "visible" => false + 'field' => 'id', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.id'), + 'visible' => false, ], [ - "field" => "name", - "searchable" => true, - "sortable" => true, - "title" => 'Name', // TODO: trans - "formatter" => "kitsLinkFormatter" - ] + 'field' => 'name', + 'searchable' => true, + 'sortable' => true, + 'title' => 'Name', // TODO: trans + 'formatter' => 'kitsLinkFormatter', + ], ]; $layout[] = [ - "field" => "checkincheckout", - "searchable" => false, - "sortable" => false, - "switchable" => true, - "title" => trans('general.checkin').'/'.trans('general.checkout'), - "visible" => true, - "formatter" => "kitsInOutFormatter", + 'field' => 'checkincheckout', + 'searchable' => false, + 'sortable' => false, + 'switchable' => true, + 'title' => trans('general.checkin').'/'.trans('general.checkout'), + 'visible' => true, + 'formatter' => 'kitsInOutFormatter', ]; $layout[] = [ - "field" => "actions", - "searchable" => false, - "sortable" => false, - "switchable" => false, - "title" => trans('table.actions'), - "formatter" => "kitsActionsFormatter", + 'field' => 'actions', + 'searchable' => false, + 'sortable' => false, + 'switchable' => false, + 'title' => trans('table.actions'), + 'formatter' => 'kitsActionsFormatter', ]; - return json_encode($layout); } - /** * Json Column Layout for bootstrap table of kit models * @return string @@ -63,215 +60,213 @@ class PredefinedKitPresenter extends Presenter { $layout = [ [ - "field" => "id", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.id'), - "visible" => false + 'field' => 'id', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.id'), + 'visible' => false, ], [ - "field" => "pivot_id", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.id'), - "visible" => false + 'field' => 'pivot_id', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.id'), + 'visible' => false, ], [ - "field" => "owner_id", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.id'), - "visible" => false + 'field' => 'owner_id', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.id'), + 'visible' => false, ], [ - "field" => "name", - "searchable" => true, - "sortable" => true, - "title" => 'Name', // TODO: trans - "formatter" => "modelsLinkFormatter" + 'field' => 'name', + 'searchable' => true, + 'sortable' => true, + 'title' => 'Name', // TODO: trans + 'formatter' => 'modelsLinkFormatter', ], [ - "field" => "quantity", - "searchable" => false, - "sortable" => false, - "title" => 'Quantity', // TODO: trans + 'field' => 'quantity', + 'searchable' => false, + 'sortable' => false, + 'title' => 'Quantity', // TODO: trans ], [ - "field" => "actions", - "searchable" => false, - "sortable" => false, - "switchable" => false, - "title" => trans('table.actions'), - "formatter" => "kits_modelsActionsFormatter", - ] + 'field' => 'actions', + 'searchable' => false, + 'sortable' => false, + 'switchable' => false, + 'title' => trans('table.actions'), + 'formatter' => 'kits_modelsActionsFormatter', + ], ]; return json_encode($layout); } /** - * Json Column Layout for bootstrap table of kit licenses - * @return string - */ + * Json Column Layout for bootstrap table of kit licenses + * @return string + */ public static function dataTableLicenses() { $layout = [ [ - "field" => "id", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.id'), - "visible" => false + 'field' => 'id', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.id'), + 'visible' => false, ], [ - "field" => "pivot_id", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.id'), - "visible" => false + 'field' => 'pivot_id', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.id'), + 'visible' => false, ], [ - "field" => "owner_id", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.id'), - "visible" => false + 'field' => 'owner_id', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.id'), + 'visible' => false, ], [ - "field" => "name", - "searchable" => true, - "sortable" => true, - "title" => 'Name', // TODO: trans - "formatter" => "licensesLinkFormatter" + 'field' => 'name', + 'searchable' => true, + 'sortable' => true, + 'title' => 'Name', // TODO: trans + 'formatter' => 'licensesLinkFormatter', ], [ - "field" => "quantity", - "searchable" => false, - "sortable" => false, - "title" => 'Quantity', // TODO: trans + 'field' => 'quantity', + 'searchable' => false, + 'sortable' => false, + 'title' => 'Quantity', // TODO: trans ], [ - "field" => "actions", - "searchable" => false, - "sortable" => false, - "switchable" => false, - "title" => trans('table.actions'), - "formatter" => "kits_licensesActionsFormatter", - ] + 'field' => 'actions', + 'searchable' => false, + 'sortable' => false, + 'switchable' => false, + 'title' => trans('table.actions'), + 'formatter' => 'kits_licensesActionsFormatter', + ], ]; return json_encode($layout); } /** - * Json Column Layout for bootstrap table of kit accessories - * @return string - */ + * Json Column Layout for bootstrap table of kit accessories + * @return string + */ public static function dataTableAccessories() { $layout = [ [ - "field" => "id", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.id'), - "visible" => false + 'field' => 'id', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.id'), + 'visible' => false, ], [ - "field" => "pivot_id", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.id'), - "visible" => false + 'field' => 'pivot_id', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.id'), + 'visible' => false, ], [ - "field" => "owner_id", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.id'), - "visible" => false + 'field' => 'owner_id', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.id'), + 'visible' => false, ], [ - "field" => "name", - "searchable" => true, - "sortable" => true, - "title" => 'Name', // TODO: trans - "formatter" => "accessoriesLinkFormatter" + 'field' => 'name', + 'searchable' => true, + 'sortable' => true, + 'title' => 'Name', // TODO: trans + 'formatter' => 'accessoriesLinkFormatter', ], [ - "field" => "quantity", - "searchable" => false, - "sortable" => false, - "title" => 'Quantity', // TODO: trans + 'field' => 'quantity', + 'searchable' => false, + 'sortable' => false, + 'title' => 'Quantity', // TODO: trans ], [ - "field" => "actions", - "searchable" => false, - "sortable" => false, - "switchable" => false, - "title" => trans('table.actions'), - "formatter" => "kits_accessoriesActionsFormatter", - ] + 'field' => 'actions', + 'searchable' => false, + 'sortable' => false, + 'switchable' => false, + 'title' => trans('table.actions'), + 'formatter' => 'kits_accessoriesActionsFormatter', + ], ]; return json_encode($layout); } - /** - * Json Column Layout for bootstrap table of kit consumables - * @return string - */ + * Json Column Layout for bootstrap table of kit consumables + * @return string + */ public static function dataTableConsumables() { $layout = [ [ - "field" => "id", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.id'), - "visible" => false + 'field' => 'id', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.id'), + 'visible' => false, ], [ - "field" => "pivot_id", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.id'), - "visible" => false + 'field' => 'pivot_id', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.id'), + 'visible' => false, ], [ - "field" => "owner_id", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.id'), - "visible" => false + 'field' => 'owner_id', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.id'), + 'visible' => false, ], [ - "field" => "name", - "searchable" => true, - "sortable" => true, - "title" => 'Name', // TODO: trans - "formatter" => "consumablesLinkFormatter" + 'field' => 'name', + 'searchable' => true, + 'sortable' => true, + 'title' => 'Name', // TODO: trans + 'formatter' => 'consumablesLinkFormatter', ], [ - "field" => "quantity", - "searchable" => false, - "sortable" => false, - "title" => 'Quantity', // TODO: trans + 'field' => 'quantity', + 'searchable' => false, + 'sortable' => false, + 'title' => 'Quantity', // TODO: trans ], [ - "field" => "actions", - "searchable" => false, - "sortable" => false, - "switchable" => false, - "title" => trans('table.actions'), - "formatter" => "kits_consumablesActionsFormatter", - ] + 'field' => 'actions', + 'searchable' => false, + 'sortable' => false, + 'switchable' => false, + 'title' => trans('table.actions'), + 'formatter' => 'kits_consumablesActionsFormatter', + ], ]; return json_encode($layout); } - /** * Link to this kit Name * @return string */ public function nameUrl() { - return (string)link_to_route('kits.show', $this->name, $this->id); + return (string) link_to_route('kits.show', $this->name, $this->id); } /** diff --git a/app/Presenters/Presentable.php b/app/Presenters/Presentable.php index 19e9526599..15da2ba04f 100644 --- a/app/Presenters/Presentable.php +++ b/app/Presenters/Presentable.php @@ -4,21 +4,18 @@ namespace App\Presenters; trait Presentable { - protected $presenterInterface; public function present() { - - if (!$this->presenter || !class_exists($this->presenter)) { + if (! $this->presenter || ! class_exists($this->presenter)) { throw new \Exception('Presenter class does not exist'); } - if (!isset($this->presenterInterface)) { + if (! isset($this->presenterInterface)) { $this->presenterInterface = new $this->presenter($this); } return $this->presenterInterface; - } } diff --git a/app/Presenters/Presenter.php b/app/Presenters/Presenter.php index c47c2547d9..85fe2338ae 100644 --- a/app/Presenters/Presenter.php +++ b/app/Presenters/Presenter.php @@ -6,7 +6,6 @@ use App\Models\SnipeModel; abstract class Presenter { - /** * @var SnipeModel */ @@ -33,6 +32,7 @@ abstract class Presenter if ($model->category) { return $model->category->present()->nameUrl(); } + return ''; } @@ -41,6 +41,7 @@ abstract class Presenter if ($this->model->location) { return $this->model->location->present()->nameUrl(); } + return ''; } @@ -49,8 +50,10 @@ abstract class Presenter if ($this->model->company) { return $this->model->company->present()->nameUrl(); } + return ''; } + public function manufacturerUrl() { $model = $this->model; @@ -62,6 +65,7 @@ abstract class Presenter if ($model->manufacturer) { return $model->manufacturer->present()->nameUrl(); } + return ''; } diff --git a/app/Presenters/UserPresenter.php b/app/Presenters/UserPresenter.php index 77d24265fe..18099884c3 100644 --- a/app/Presenters/UserPresenter.php +++ b/app/Presenters/UserPresenter.php @@ -10,12 +10,9 @@ use Illuminate\Support\Facades\Storage; /** * Class UserPresenter - * @package App\Presenters */ class UserPresenter extends Presenter { - - /** * Json Column Layout for bootstrap table * @return string @@ -24,152 +21,170 @@ class UserPresenter extends Presenter { $layout = [ [ - "field" => "checkbox", - "checkbox" => true + 'field' => 'checkbox', + 'checkbox' => true, ], [ - "field" => "id", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.id'), - "visible" => false + 'field' => 'id', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.id'), + 'visible' => false, ], [ - "field" => "avatar", - "searchable" => false, - "sortable" => false, - "switchable" => true, - "title" => 'Avatar', - "visible" => false, - "formatter" => "imageFormatter" + 'field' => 'avatar', + 'searchable' => false, + 'sortable' => false, + 'switchable' => true, + 'title' => 'Avatar', + 'visible' => false, + 'formatter' => 'imageFormatter', ], [ - "field" => "company", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('admin/companies/table.title'), - "visible" => false, - "formatter" => "companiesLinkObjFormatter" + 'field' => 'company', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('admin/companies/table.title'), + 'visible' => false, + 'formatter' => 'companiesLinkObjFormatter', ], [ - "field" => "name", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/users/table.name'), - "visible" => true, - "formatter" => "usersLinkFormatter" + 'field' => 'name', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/users/table.name'), + 'visible' => true, + 'formatter' => 'usersLinkFormatter', + ], + + [ + 'field' => 'first_name', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.first_name'), + 'visible' => false, + 'formatter' => 'usersLinkFormatter', + ], + + [ + 'field' => 'last_name', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.last_name'), + 'visible' => false, + 'formatter' => 'usersLinkFormatter', ], [ - "field" => "jobtitle", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('admin/users/table.title'), - "visible" => true, - "formatter" => "usersLinkFormatter" + 'field' => 'jobtitle', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('admin/users/table.title'), + 'visible' => true, + 'formatter' => 'usersLinkFormatter', ], [ - "field" => "email", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('admin/users/table.email'), - "visible" => true, - "formatter" => "emailFormatter" + 'field' => 'email', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('admin/users/table.email'), + 'visible' => true, + 'formatter' => 'emailFormatter', ], [ - "field" => "phone", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('admin/users/table.phone'), - "visible" => true, - "formatter" => "phoneFormatter", + 'field' => 'phone', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('admin/users/table.phone'), + 'visible' => true, + 'formatter' => 'phoneFormatter', ], [ - "field" => "address", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('general.address'), - "visible" => false, + 'field' => 'address', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.address'), + 'visible' => false, ], [ - "field" => "city", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('general.city'), - "visible" => false, + 'field' => 'city', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.city'), + 'visible' => false, ], [ - "field" => "state", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('general.state'), - "visible" => false, + 'field' => 'state', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.state'), + 'visible' => false, ], [ - "field" => "country", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('general.country'), - "visible" => false, + 'field' => 'country', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.country'), + 'visible' => false, ], [ - "field" => "zip", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('general.zip'), - "visible" => false, + 'field' => 'zip', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.zip'), + 'visible' => false, ], [ - "field" => "username", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('admin/users/table.username'), - "visible" => true, - "formatter" => "usersLinkFormatter" + 'field' => 'username', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('admin/users/table.username'), + 'visible' => true, + 'formatter' => 'usersLinkFormatter', ], [ - "field" => "employee_num", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('admin/users/table.employee_num'), - "visible" => false + 'field' => 'employee_num', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('admin/users/table.employee_num'), + 'visible' => false, ], [ - "field" => "department", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('general.department'), - "visible" => true, - "formatter" => "departmentsLinkObjFormatter" + 'field' => 'department', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.department'), + 'visible' => true, + 'formatter' => 'departmentsLinkObjFormatter', ], [ - "field" => "location", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('admin/users/table.location'), - "visible" => true, - "formatter" => "locationsLinkObjFormatter" + 'field' => 'location', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('admin/users/table.location'), + 'visible' => true, + 'formatter' => 'locationsLinkObjFormatter', ], [ - "field" => "manager", - "searchable" => true, - "sortable" => true, - "title" => trans('admin/users/table.manager'), - "visible" => true, - "formatter" => "usersLinkObjFormatter" + 'field' => 'manager', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('admin/users/table.manager'), + 'visible' => true, + 'formatter' => 'usersLinkObjFormatter', ], [ 'field' => 'assets_count', @@ -182,126 +197,127 @@ class UserPresenter extends Presenter 'visible' => true, ], [ - "field" => "licenses_count", - "searchable" => false, - "sortable" => true, - "switchable" => true, + 'field' => 'licenses_count', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, 'class' => 'css-license', - "title" => 'License', - "visible" => true, + 'title' => 'License', + 'visible' => true, ], [ - "field" => "consumables_count", - "searchable" => false, - "sortable" => true, - "switchable" => true, + 'field' => 'consumables_count', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, 'class' => 'css-consumable', - "title" => 'Consumables', - "visible" => true, + 'title' => 'Consumables', + 'visible' => true, ], [ - "field" => "accessories_count", - "searchable" => false, - "sortable" => true, - "switchable" => true, + 'field' => 'accessories_count', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, 'class' => 'css-accessory', - "title" => 'Accessories', - "visible" => true, + 'title' => 'Accessories', + 'visible' => true, ], [ - "field" => "notes", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('general.notes'), - "visible" => true, + 'field' => 'notes', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.notes'), + 'visible' => true, ], [ - "field" => "groups", - "searchable" => false, - "sortable" => false, - "switchable" => true, - "title" => trans('general.groups'), - "visible" => true, - 'formatter' => 'groupsFormatter' + 'field' => 'groups', + 'searchable' => false, + 'sortable' => false, + 'switchable' => true, + 'title' => trans('general.groups'), + 'visible' => true, + 'formatter' => 'groupsFormatter', ], [ - "field" => "ldap_import", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('admin/settings/general.ldap_enabled'), - "visible" => false, - 'formatter' => 'trueFalseFormatter' + 'field' => 'ldap_import', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('admin/settings/general.ldap_enabled'), + 'visible' => false, + 'formatter' => 'trueFalseFormatter', ], [ - "field" => "two_factor_enrolled", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('admin/users/general.two_factor_enrolled'), - "visible" => false, - 'formatter' => 'trueFalseFormatter' + 'field' => 'two_factor_enrolled', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('admin/users/general.two_factor_enrolled'), + 'visible' => false, + 'formatter' => 'trueFalseFormatter', ], [ - "field" => "two_factor_activated", - "searchable" => false, - "sortable" => false, - "switchable" => true, - "title" => trans('admin/users/general.two_factor_active'), - "visible" => false, - 'formatter' => 'trueFalseFormatter' + 'field' => 'two_factor_activated', + 'searchable' => false, + 'sortable' => false, + 'switchable' => true, + 'title' => trans('admin/users/general.two_factor_active'), + 'visible' => false, + 'formatter' => 'trueFalseFormatter', ], [ - "field" => "activated", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.login_enabled'), - "visible" => true, - 'formatter' => 'trueFalseFormatter' + 'field' => 'activated', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.login_enabled'), + 'visible' => true, + 'formatter' => 'trueFalseFormatter', ], [ - "field" => "created_at", - "searchable" => true, - "sortable" => true, - "switchable" => true, - "title" => trans('general.created_at'), - "visible" => false, - 'formatter' => 'dateDisplayFormatter' + 'field' => 'created_at', + 'searchable' => true, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.created_at'), + 'visible' => false, + 'formatter' => 'dateDisplayFormatter', ], [ - "field" => "last_login", - "searchable" => false, - "sortable" => true, - "switchable" => true, - "title" => trans('general.last_login'), - "visible" => false, - 'formatter' => 'dateDisplayFormatter' + 'field' => 'last_login', + 'searchable' => false, + 'sortable' => true, + 'switchable' => true, + 'title' => trans('general.last_login'), + 'visible' => false, + 'formatter' => 'dateDisplayFormatter', ], [ - "field" => "actions", - "searchable" => false, - "sortable" => false, - "switchable" => false, - "title" => trans('table.actions'), - "visible" => true, - "formatter" => "usersActionsFormatter", - ] + 'field' => 'actions', + 'searchable' => false, + 'sortable' => false, + 'switchable' => false, + 'title' => trans('table.actions'), + 'visible' => true, + 'formatter' => 'usersActionsFormatter', + ], ]; return json_encode($layout); } - public function emailLink() { if ($this->email) { return ''.$this->email.'' - .''; + .''; } + return ''; } + /** * Returns the user full name, it simply concatenates * the user first and last name. @@ -322,6 +338,7 @@ class UserPresenter extends Presenter { return $this->fullName(); } + /** * Returns the user Gravatar image url. * @@ -329,25 +346,24 @@ class UserPresenter extends Presenter */ public function gravatar() { - - if ($this->avatar) { return Storage::disk('public')->url('avatars/'.e($this->avatar)); } - if (Setting::getSettings()->load_remote=='1') { - if ($this->model->gravatar!='') { + if (Setting::getSettings()->load_remote == '1') { + if ($this->model->gravatar != '') { $gravatar = md5(strtolower(trim($this->model->gravatar))); - return "//gravatar.com/avatar/".$gravatar; - } elseif ($this->email!='') { + + return '//gravatar.com/avatar/'.$gravatar; + } elseif ($this->email != '') { $gravatar = md5(strtolower(trim($this->email))); - return "//gravatar.com/avatar/".$gravatar; + + return '//gravatar.com/avatar/'.$gravatar; } } // Set a fun, gender-neutral default icon return url('/').'/img/default-sm.png'; - } /** @@ -370,6 +386,6 @@ class UserPresenter extends Presenter public function glyph() { - return ''; + return ''; } } diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index c2651c3aef..bb5643a920 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -1,6 +1,6 @@ app->environment('production')) && (config('logging.channels.rollbar.access_token'))) { + if (($this->app->environment('production')) && (config('logging.channels.rollbar.access_token'))) { $this->app->register(\Rollbar\Laravel\RollbarServiceProvider::class); } - } } diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php index b24df173c3..31a328abfe 100644 --- a/app/Providers/AuthServiceProvider.php +++ b/app/Providers/AuthServiceProvider.php @@ -80,14 +80,12 @@ class AuthServiceProvider extends ServiceProvider */ public function boot() { - $this->commands([ \Laravel\Passport\Console\InstallCommand::class, \Laravel\Passport\Console\ClientCommand::class, \Laravel\Passport\Console\KeysCommand::class, ]); - $this->registerPolicies(); Passport::routes(); Passport::tokensExpireIn(Carbon::now()->addYears(config('passport.expiration_years'))); @@ -95,7 +93,6 @@ class AuthServiceProvider extends ServiceProvider Passport::personalAccessTokensExpireIn(Carbon::now()->addYears(config('passport.expiration_years'))); Passport::withCookieSerialization(); - // -------------------------------- // BEFORE ANYTHING ELSE // -------------------------------- @@ -117,42 +114,40 @@ class AuthServiceProvider extends ServiceProvider } }); - // Can the user import CSVs? Gate::define('import', function ($user) { - if ($user->hasAccess('import') ) { + if ($user->hasAccess('import')) { return true; } }); - - # ----------------------------------------- - # Reports - # ----------------------------------------- + // ----------------------------------------- + // Reports + // ----------------------------------------- Gate::define('reports.view', function ($user) { if ($user->hasAccess('reports.view')) { return true; } }); - # ----------------------------------------- - # Self - # ----------------------------------------- + // ----------------------------------------- + // Self + // ----------------------------------------- Gate::define('self.two_factor', function ($user) { if (($user->hasAccess('self.two_factor')) || ($user->hasAccess('admin'))) { return true; } }); - Gate::define('self.api', function($user) { + Gate::define('self.api', function ($user) { return $user->hasAccess('self.api'); }); - Gate::define('self.edit_location', function($user) { + Gate::define('self.edit_location', function ($user) { return $user->hasAccess('self.edit_location'); }); - Gate::define('self.checkout_assets', function($user) { + Gate::define('self.checkout_assets', function ($user) { return $user->hasAccess('self.checkout_assets'); }); @@ -167,7 +162,7 @@ class AuthServiceProvider extends ServiceProvider || $user->can('view', Company::class) || $user->can('view', Manufacturer::class) || $user->can('view', CustomField::class) - || $user->can('view', CustomFieldset::class) + || $user->can('view', CustomFieldset::class) || $user->can('view', Depreciation::class); }); } diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index a67715fc12..1f08b445c9 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -15,11 +15,11 @@ class EventServiceProvider extends ServiceProvider */ protected $listen = [ 'Illuminate\Auth\Events\Login' => [ - 'App\Listeners\LogSuccessfulLogin', + \App\Listeners\LogSuccessfulLogin::class, ], 'Illuminate\Auth\Events\Failed' => [ - 'App\Listeners\LogFailedLogin', + \App\Listeners\LogFailedLogin::class, ], ]; @@ -30,6 +30,6 @@ class EventServiceProvider extends ServiceProvider */ protected $subscribe = [ LogListener::class, - CheckoutableListener::class + CheckoutableListener::class, ]; } diff --git a/app/Providers/LdapServiceProvider.php b/app/Providers/LdapServiceProvider.php index 5b3e71761c..58f93096d3 100644 --- a/app/Providers/LdapServiceProvider.php +++ b/app/Providers/LdapServiceProvider.php @@ -1,12 +1,13 @@ -configureRateLimiting(); - parent::boot(); - } + $this->routes(function () { + $this->mapApiRoutes(); - /** - * Define the routes for the application. - * - * @return void - */ - public function map() - { - $this->mapApiRoutes(); + $this->mapWebRoutes(); - $this->mapWebRoutes(); - - // + // + }); } /** @@ -85,4 +71,16 @@ class RouteServiceProvider extends ServiceProvider require base_path('routes/api.php'); }); } + + /** + * Configure the rate limiters for the application. + * + * @return void + */ + protected function configureRateLimiting() + { + RateLimiter::for('api', function (Request $request) { + return Limit::perMinute(60)->by(optional($request->user())->id ?: $request->ip()); + }); + } } diff --git a/app/Providers/SamlServiceProvider.php b/app/Providers/SamlServiceProvider.php index 0caf0e77dd..18b93cf56f 100644 --- a/app/Providers/SamlServiceProvider.php +++ b/app/Providers/SamlServiceProvider.php @@ -3,8 +3,8 @@ namespace App\Providers; use App\Services\Saml; -use Illuminate\Support\ServiceProvider; use Illuminate\Support\Facades\Route; +use Illuminate\Support\ServiceProvider; class SamlServiceProvider extends ServiceProvider { @@ -23,7 +23,7 @@ class SamlServiceProvider extends ServiceProvider 'metadata', [ 'as' => 'saml.metadata', - 'uses' => 'Auth\SamlController@metadata' ] + 'uses' => 'Auth\SamlController@metadata', ] ); Route::match( @@ -31,14 +31,14 @@ class SamlServiceProvider extends ServiceProvider 'acs', [ 'as' => 'saml.acs', - 'uses' => 'Auth\SamlController@acs' ] + 'uses' => 'Auth\SamlController@acs', ] ); Route::get( 'sls', [ 'as' => 'saml.sls', - 'uses' => 'Auth\SamlController@sls' ] + 'uses' => 'Auth\SamlController@sls', ] ); }); @@ -46,14 +46,12 @@ class SamlServiceProvider extends ServiceProvider 'login/saml', [ 'as' => 'saml.login', - 'uses' => 'Auth\SamlController@login' ] + 'uses' => 'Auth\SamlController@login', ] ); - Route::group(['prefix' => 'admin','middleware' => ['web','auth', 'authorize:superuser']], function () { - - Route::get('saml', ['as' => 'settings.saml.index','uses' => 'SettingsController@getSamlSettings' ]); - Route::post('saml', ['as' => 'settings.saml.save','uses' => 'SettingsController@postSamlSettings' ]); - + Route::group(['prefix' => 'admin', 'middleware' => ['web', 'auth', 'authorize:superuser']], function () { + Route::get('saml', ['as' => 'settings.saml.index', 'uses' => 'SettingsController@getSamlSettings']); + Route::post('saml', ['as' => 'settings.saml.save', 'uses' => 'SettingsController@postSamlSettings']); }); }); } diff --git a/app/Providers/SettingsServiceProvider.php b/app/Providers/SettingsServiceProvider.php index adf25b6435..be9928282c 100644 --- a/app/Providers/SettingsServiceProvider.php +++ b/app/Providers/SettingsServiceProvider.php @@ -1,8 +1,9 @@ composer('*', function ($view) { $view->with('snipeSettings', Setting::getSettings()); }); - /** * Set some common variables so that they're globally available. * The paths should always be public (versus private uploads) */ - - // Model paths and URLs - \App::singleton('assets_upload_path', function(){ + \App::singleton('assets_upload_path', function () { return 'assets/'; }); - \App::singleton('accessories_upload_path', function() { + \App::singleton('accessories_upload_path', function () { return 'public/uploads/accessories/'; }); - \App::singleton('models_upload_path', function(){ + \App::singleton('models_upload_path', function () { return 'models/'; }); - \App::singleton('models_upload_url', function(){ + \App::singleton('models_upload_url', function () { return 'models/'; }); // Categories - \App::singleton('categories_upload_path', function(){ + \App::singleton('categories_upload_path', function () { return 'categories/'; }); - \App::singleton('categories_upload_url', function(){ + \App::singleton('categories_upload_url', function () { return 'categories/'; }); // Locations - \App::singleton('locations_upload_path', function(){ + \App::singleton('locations_upload_path', function () { return 'locations/'; }); - \App::singleton('locations_upload_url', function(){ + \App::singleton('locations_upload_url', function () { return 'locations/'; }); // Users - \App::singleton('users_upload_path', function(){ + \App::singleton('users_upload_path', function () { return 'avatars/'; }); - \App::singleton('users_upload_url', function(){ + \App::singleton('users_upload_url', function () { return 'users/'; }); // Manufacturers - \App::singleton('manufacturers_upload_path', function(){ + \App::singleton('manufacturers_upload_path', function () { return 'manufacturers/'; }); - \App::singleton('manufacturers_upload_url', function(){ + \App::singleton('manufacturers_upload_url', function () { return 'manufacturers/'; }); // Suppliers - \App::singleton('suppliers_upload_path', function(){ + \App::singleton('suppliers_upload_path', function () { return 'suppliers/'; }); - \App::singleton('suppliers_upload_url', function(){ + \App::singleton('suppliers_upload_url', function () { return 'suppliers/'; }); // Departments - \App::singleton('departments_upload_path', function(){ + \App::singleton('departments_upload_path', function () { return 'departments/'; }); - \App::singleton('departments_upload_url', function(){ + \App::singleton('departments_upload_url', function () { return 'departments/'; }); // Company paths and URLs - \App::singleton('companies_upload_path', function(){ + \App::singleton('companies_upload_path', function () { return 'companies/'; }); - \App::singleton('companies_upload_url', function(){ + \App::singleton('companies_upload_url', function () { return 'companies/'; }); // Accessories paths and URLs - \App::singleton('accessories_upload_path', function(){ + \App::singleton('accessories_upload_path', function () { return 'accessories/'; }); - \App::singleton('accessories_upload_url', function(){ + \App::singleton('accessories_upload_url', function () { return 'accessories/'; }); // Consumables paths and URLs - \App::singleton('consumables_upload_path', function(){ + \App::singleton('consumables_upload_path', function () { return 'consumables/'; }); - \App::singleton('consumables_upload_url', function(){ + \App::singleton('consumables_upload_url', function () { return 'consumables/'; }); - // Components paths and URLs - \App::singleton('components_upload_path', function(){ + \App::singleton('components_upload_path', function () { return 'components/'; }); - \App::singleton('components_upload_url', function(){ + \App::singleton('components_upload_url', function () { return 'components/'; }); - - // Set the monetary locale to the configured locale to make helper::parseFloat work. setlocale(LC_MONETARY, config('app.locale')); setlocale(LC_NUMERIC, config('app.locale')); - } /** @@ -162,6 +154,5 @@ class SettingsServiceProvider extends ServiceProvider */ public function register() { - } } diff --git a/app/Providers/ValidationServiceProvider.php b/app/Providers/ValidationServiceProvider.php index ea9c322765..0f6c78ee67 100644 --- a/app/Providers/ValidationServiceProvider.php +++ b/app/Providers/ValidationServiceProvider.php @@ -1,4 +1,5 @@ 'email'); - $messages = array( - 'alert_email.*'=>trans('validation.email_array') - ); + $rules = ['alert_email.*'=>'email']; + $messages = [ + 'alert_email.*'=>trans('validation.email_array'), + ]; $validator = Validator::make($email_to_validate, $rules, $messages); return $validator->passes(); - }); - // Unique only if undeleted // This works around the use case where multiple deleted items have the same unique attribute. // (I think this is a bug in Laravel's validator?) Validator::extend('unique_undeleted', function ($attribute, $value, $parameters, $validator) { - if (count($parameters)) { $count = DB::table($parameters[0])->select('id')->where($attribute, '=', $value)->whereNull('deleted_at')->where('id', '!=', $parameters[1])->count(); + return $count < 1; } - }); + // Unique if undeleted for two columns + // Same as unique_undeleted but taking the combination of two columns as unique constrain. + Validator::extend('two_column_unique_undeleted', function ($attribute, $value, $parameters, $validator) { + if (count($parameters)) { + $count = DB::table($parameters[0]) + ->select('id')->where($attribute, '=', $value) + ->whereNull('deleted_at') + ->where('id', '!=', $parameters[1]) + ->where($parameters[2], $parameters[3])->count(); + + return $count < 1; + } + }); // Prevent circular references // @@ -83,7 +93,7 @@ class ValidationServiceProvider extends ServiceProvider $data_pk = array_get($data, $pk); $value_pk = $value; - // If we’re editing an existing model and there is a parent value set… + // If we’re editing an existing model and there is a parent value set… while ($data_pk && $value_pk) { // It’s not valid for any parent id to be equal to the existing model’s id @@ -103,7 +113,6 @@ class ValidationServiceProvider extends ServiceProvider return true; }); - // Yo dawg. I heard you like validators. // This validates the custom validator regex in custom fields. // We're just checking that the regex won't throw an exception, not @@ -112,7 +121,7 @@ class ValidationServiceProvider extends ServiceProvider Validator::extend('valid_regex', function ($attribute, $value, $parameters, $validator) { // Make sure it's not just an ANY format - if ($value!='') { + if ($value != '') { // Check that the string starts with regex: if (strpos($value, 'regex:') === false) { @@ -122,55 +131,50 @@ class ValidationServiceProvider extends ServiceProvider $test_string = 'My hovercraft is full of eels'; // We have to stip out the regex: part here to check with preg_match - $test_pattern = str_replace('regex:','', $value); + $test_pattern = str_replace('regex:', '', $value); try { preg_match($test_pattern, $test_string); + return true; } catch (\Exception $e) { return false; } - } + return true; - }); - // This ONLY works for create/update user forms, since the Update Profile Password form doesn't // include any of these additional validator fields Validator::extend('disallow_same_pwd_as_user_fields', function ($attribute, $value, $parameters, $validator) { - $data = $validator->getData(); - if (array_key_exists("username", $data)) { + if (array_key_exists('username', $data)) { if ($data['username'] == $data['password']) { return false; } } - if (array_key_exists("email", $data)) { + if (array_key_exists('email', $data)) { if ($data['email'] == $data['password']) { return false; } } - if (array_key_exists("first_name", $data)) { + if (array_key_exists('first_name', $data)) { if ($data['first_name'] == $data['password']) { return false; } } - if (array_key_exists("last_name", $data)) { + if (array_key_exists('last_name', $data)) { if ($data['last_name'] == $data['password']) { return false; } } - - return true; - - + return true; }); Validator::extend('letters', function ($attribute, $value, $parameters) { @@ -196,7 +200,7 @@ class ValidationServiceProvider extends ServiceProvider // $validator gives us proper access to the rest of the actual data $data = $validator->getData(); - if(array_key_exists("id", $data)) { + if (array_key_exists('id', $data)) { if ($value && $value == $data['id']) { // if you definitely have an ID - you're saving an existing user - and your ID matches your manager's ID - fail. return false; @@ -209,8 +213,6 @@ class ValidationServiceProvider extends ServiceProvider return true; } }); - - } /** @@ -220,6 +222,5 @@ class ValidationServiceProvider extends ServiceProvider */ public function register() { - } } diff --git a/app/Services/LdapAd.php b/app/Services/LdapAd.php index 4bfef3d3ed..186a2c7a9d 100644 --- a/app/Services/LdapAd.php +++ b/app/Services/LdapAd.php @@ -47,9 +47,9 @@ class LdapAd extends LdapAdConfiguration '262688', // 0x40220 NORMAL_ACCOUNT, PASSWD_NOTREQD, SMARTCARD_REQUIRED '328192', // 0x50200 NORMAL_ACCOUNT, SMARTCARD_REQUIRED, DONT_EXPIRE_PASSWORD '328224', // 0x50220 NORMAL_ACCOUNT, PASSWD_NOT_REQD, SMARTCARD_REQUIRED, DONT_EXPIRE_PASSWORD - '4260352',// 0x410200 NORMAL_ACCOUNT, DONT_EXPIRE_PASSWORD, DONT_REQ_PREAUTH - '1049088',// 0x100200 NORMAL_ACCOUNT, NOT_DELEGATED - '1114624',// 0x110200 NORMAL_ACCOUNT, NOT_DELEGATED, DONT_EXPIRE_PASSWORD + '4260352', // 0x410200 NORMAL_ACCOUNT, DONT_EXPIRE_PASSWORD, DONT_REQ_PREAUTH + '1049088', // 0x100200 NORMAL_ACCOUNT, NOT_DELEGATED + '1114624', // 0x110200 NORMAL_ACCOUNT, NOT_DELEGATED, DONT_EXPIRE_PASSWORD ]; /** @@ -86,8 +86,8 @@ class LdapAd extends LdapAdConfiguration } parent::init(); - if($this->isLdapEnabled()) { - if($this->ldapSettings['is_ad'] == 0 ) { //only for NON-AD setups! + if ($this->isLdapEnabled()) { + if ($this->ldapSettings['is_ad'] == 0) { //only for NON-AD setups! $this->ldapConfig['account_prefix'] = $this->ldapSettings['ldap_auth_filter_query']; $this->ldapConfig['account_suffix'] = ','.$this->ldapConfig['base_dn']; } /* @@ -98,16 +98,19 @@ class LdapAd extends LdapAdConfiguration */ $this->ldap = new Adldap(); $this->ldap->addProvider($this->ldapConfig); + return true; } + return false; } - public function __construct() { + public function __construct() + { $this->init(); } - /** + /** * Create a user if they successfully login to the LDAP server. * * @author Wes Hulette @@ -124,7 +127,7 @@ class LdapAd extends LdapAdConfiguration public function ldapLogin(string $username, string $password): User { if ($this->ldapSettings['ad_append_domain']) { //if you're using 'userprincipalname', don't check the ad_append_domain checkbox - $login_username = $username . '@' . $this->ldapSettings['ad_domain']; // I feel like could can be solved with the 'suffix' feature? Then this would be easier. + $login_username = $username.'@'.$this->ldapSettings['ad_domain']; // I feel like could can be solved with the 'suffix' feature? Then this would be easier. } else { $login_username = $username; } @@ -137,18 +140,17 @@ class LdapAd extends LdapAdConfiguration if (($this->ldap) && ($this->ldap->auth()->attempt($login_username, $password, $bind_as_user) === false)) { throw new Exception('Unable to validate user credentials!'); - } + } // Should we sync the logged in user Log::debug('Attempting to find user in LDAP directory'); $record = $this->ldap->search()->findBy($this->ldapSettings['ldap_username_field'], $username); - if($record) { + if ($record) { if ($this->isLdapSync($record)) { $this->syncUserLdapLogin($record, $password); } - } - else { + } else { throw new Exception('Unable to find user in LDAP directory!'); } @@ -158,7 +160,7 @@ class LdapAd extends LdapAdConfiguration /* Above, I could've just done ->firstOrFail() which would've been cleaner, but it would've been miserable to troubleshoot if it ever came up (giving a really generic and untraceable error message) */ - if (!$user) { + if (! $user) { throw new Exception("User is either deleted, not activated (can't log in), not from LDAP, or can't be found in database"); } @@ -178,19 +180,19 @@ class LdapAd extends LdapAdConfiguration * * @return null|\App\Models\User */ - public function processUser(AdldapUser $user, ?Collection $defaultLocation=null, ?Collection $mappedLocations=null): ?User + public function processUser(AdldapUser $user, ?Collection $defaultLocation = null, ?Collection $mappedLocations = null): ?User { // Only sync active users <- I think this actually means 'existing', not 'activated/deactivated' - if(!$user) { + if (! $user) { return null; } $snipeUser = []; - $snipeUser['username'] = $user->{$this->ldapSettings['ldap_username_field']}[0] ?? ''; + $snipeUser['username'] = $user->{$this->ldapSettings['ldap_username_field']}[0] ?? ''; $snipeUser['employee_number'] = $user->{$this->ldapSettings['ldap_emp_num']}[0] ?? ''; - $snipeUser['lastname'] = $user->{$this->ldapSettings['ldap_lname_field']}[0] ?? ''; - $snipeUser['firstname'] = $user->{$this->ldapSettings['ldap_fname_field']}[0] ?? ''; - $snipeUser['email'] = $user->{$this->ldapSettings['ldap_email']}[0] ?? ''; - $snipeUser['title'] = $user->getTitle() ?? ''; + $snipeUser['lastname'] = $user->{$this->ldapSettings['ldap_lname_field']}[0] ?? ''; + $snipeUser['firstname'] = $user->{$this->ldapSettings['ldap_fname_field']}[0] ?? ''; + $snipeUser['email'] = $user->{$this->ldapSettings['ldap_email']}[0] ?? ''; + $snipeUser['title'] = $user->getTitle() ?? ''; $snipeUser['telephonenumber'] = $user->getTelephoneNumber() ?? ''; /* @@ -204,7 +206,7 @@ class LdapAd extends LdapAdConfiguration * and it *will* override the administrators previous choices. I think this is a fair compromise. */ $locationId = $this->getLocationId($user, $defaultLocation, $mappedLocations); - if ($locationId !== null ) { + if ($locationId !== null) { $snipeUser['location_id'] = $locationId; } @@ -233,29 +235,29 @@ class LdapAd extends LdapAdConfiguration $user = User::firstOrNew([ 'username' => $userInfo['username'], ]); - $user->username = $user->username ?? trim($userInfo['username']); - $user->password = $user->password ?? Helper::generateEncyrptedPassword(); - $user->first_name = trim($userInfo['firstname']); - $user->last_name = trim($userInfo['lastname']); - $user->email = trim($userInfo['email']); + $user->username = $user->username ?? trim($userInfo['username']); + $user->password = $user->password ?? Helper::generateEncyrptedPassword(); + $user->first_name = trim($userInfo['firstname']); + $user->last_name = trim($userInfo['lastname']); + $user->email = trim($userInfo['email']); $user->employee_num = trim($userInfo['employee_number']); - $user->jobtitle = trim($userInfo['title']); - $user->phone = trim($userInfo['telephonenumber']); - if (array_key_exists('activated',$userInfo)) { - $user->activated = $userInfo['activated']; - } else if ( !$user->exists ) { // no 'activated' flag was set or unset, *AND* this user is new - activate by default. + $user->jobtitle = trim($userInfo['title']); + $user->phone = trim($userInfo['telephonenumber']); + if (array_key_exists('activated', $userInfo)) { + $user->activated = $userInfo['activated']; + } elseif (! $user->exists) { // no 'activated' flag was set or unset, *AND* this user is new - activate by default. $user->activated = 1; } - if (array_key_exists('location_id',$userInfo)) { - $user->location_id = $userInfo['location_id']; + if (array_key_exists('location_id', $userInfo)) { + $user->location_id = $userInfo['location_id']; } // this is a new user - if (!isset($user->id)) { - $user->notes = 'Imported from LDAP'; + if (! isset($user->id)) { + $user->notes = 'Imported from LDAP'; } - $user->ldap_import = 1; + $user->ldap_import = 1; return $user; } @@ -285,7 +287,7 @@ class LdapAd extends LdapAdConfiguration $user->password = bcrypt($password); } - if (!$user->save()) { + if (! $user->save()) { Log::debug('Could not save user. '.$user->getErrors()); throw new Exception('Could not save user: '.$user->getErrors()); } @@ -304,13 +306,13 @@ class LdapAd extends LdapAdConfiguration */ private function isLdapSync(AdldapUser $user): bool { - if ( !$this->ldapSettings['ldap_active_flag']) { + if (! $this->ldapSettings['ldap_active_flag']) { return true; // always sync if you didn't define an 'active' flag } - - if ( $user->{$this->ldapSettings['ldap_active_flag']} && // if your LDAP user has the aforementioned flag as an attribute *AND* - count($user->{$this->ldapSettings['ldap_active_flag']}) == 1 && // if that attribute has exactly one value *AND* - strtolower($user->{$this->ldapSettings['ldap_active_flag']}[0]) == 'false') { // that value is the string 'false' (regardless of case), + + if ($user->{$this->ldapSettings['ldap_active_flag']} && // if your LDAP user has the aforementioned flag as an attribute *AND* + count($user->{$this->ldapSettings['ldap_active_flag']}) == 1 && // if that attribute has exactly one value *AND* + strtolower($user->{$this->ldapSettings['ldap_active_flag']}[0]) == 'false') { // that value is the string 'false' (regardless of case), return false; // then your user is *INACTIVE* - return false } // otherwise, return true @@ -338,8 +340,8 @@ class LdapAd extends LdapAdConfiguration * If the admin has set their own 'active flag' - respect that instead * (this may work to allow AD users to ignore the built-in UAC stuff that AD does) */ - if ($user->hasAttribute($user->getSchema()->userAccountControl()) && !$this->ldapSettings['ldap_active_flag']) { - \Log::debug('This is AD - userAccountControl is'. $user->getSchema()->userAccountControl()); + if ($user->hasAttribute($user->getSchema()->userAccountControl()) && ! $this->ldapSettings['ldap_active_flag']) { + \Log::debug('This is AD - userAccountControl is'.$user->getSchema()->userAccountControl()); $activeStatus = (in_array($user->getUserAccountControl(), self::AD_USER_ACCOUNT_CONTROL_FLAGS)) ? 1 : 0; } else { @@ -347,26 +349,27 @@ class LdapAd extends LdapAdConfiguration // If there is no activated flag, then we can't make any determination about activated/deactivated if (false == $this->ldapSettings['ldap_active_flag']) { \Log::debug('ldap_active_flag is false - no ldap_active_flag is set'); + return null; } // If there *is* an activated flag, then respect it *only* if it is actually present. If it's not there, ignore it. - if (!$user->hasAttribute($this->ldapSettings['ldap_active_flag'])) { + if (! $user->hasAttribute($this->ldapSettings['ldap_active_flag'])) { return null; // 'active' flag is defined, but does not exist on returned user record. So we don't know if they're active or not. } // if $user has the flag *AND* that flag has exactly one value - - if ( $user->{$this->ldapSettings['ldap_active_flag']} && count($user->{$this->ldapSettings['ldap_active_flag']}) == 1 ) { - + if ($user->{$this->ldapSettings['ldap_active_flag']} && count($user->{$this->ldapSettings['ldap_active_flag']}) == 1) { $active_flag_value = $user->{$this->ldapSettings['ldap_active_flag']}[0]; // if the value of that flag is case-insensitively the string 'false' or boolean false - if ( strcasecmp($active_flag_value, "false") == 0 || $active_flag_value === false ) { + if (strcasecmp($active_flag_value, 'false') == 0 || $active_flag_value === false) { return 0; // then make them INACTIVE } else { return 1; // otherwise active } } + return 1; // fail 'open' (active) if we have the attribute and it's multivalued or empty; that's weird } @@ -399,7 +402,7 @@ class LdapAd extends LdapAdConfiguration $location = $mappedLocations->filter(function ($value, $key) use ($user) { //if ($user->inOu($value)) { // <----- *THIS* seems not to be working, and it seems more 'intelligent' - but it's literally just a strpos() call, and it doesn't work quite right against plain strings $user_ou = substr($user->getDn(), -strlen($value)); // get the LAST chars of the user's DN, the count of those chars being the length of the thing we're checking against - if(strcasecmp($user_ou, $value) === 0) { // case *IN*sensitive comparision - some people say OU=blah, some say ou=blah. returns 0 when strings are identical (which is a little odd, yeah) + if (strcasecmp($user_ou, $value) === 0) { // case *IN*sensitive comparision - some people say OU=blah, some say ou=blah. returns 0 when strings are identical (which is a little odd, yeah) return $key; // WARNING: we are doing a 'filter' - not a regular for-loop. So the answer(s) get "return"ed into the $location array } }); @@ -423,7 +426,7 @@ class LdapAd extends LdapAdConfiguration */ private function getBaseDn(): string { - if (!is_null($this->baseDn)) { + if (! is_null($this->baseDn)) { return $this->baseDn; } @@ -442,7 +445,7 @@ class LdapAd extends LdapAdConfiguration private function getFilter(): ?string { $filter = $this->ldapSettings['ldap_filter']; - if (!$filter) { + if (! $filter) { return null; } // Add surrounding parentheses as needed @@ -468,6 +471,7 @@ class LdapAd extends LdapAdConfiguration { /** @var Schema $schema */ $schema = new $this->ldapConfig['schema']; + return array_values(array_filter([ $this->ldapSettings['ldap_username_field'], $this->ldapSettings['ldap_fname_field'], @@ -557,7 +561,7 @@ class LdapAd extends LdapAdConfiguration $search = $this->ldap->search()->users()->in($this->getBaseDn()); //this looks wrong; we should instead have a passable parameter that does this, and use this as a 'sane' default, yeah? $filter = $this->getFilter(); - if (!is_null($filter)) { + if (! is_null($filter)) { $search = $search->rawFilter($filter); } //I think it might be possible to potentially do our own paging here? diff --git a/app/Services/LdapAdConfiguration.php b/app/Services/LdapAdConfiguration.php index e9b7e96d42..25f0fba372 100644 --- a/app/Services/LdapAdConfiguration.php +++ b/app/Services/LdapAdConfiguration.php @@ -19,9 +19,9 @@ use Illuminate\Support\Collection; */ class LdapAdConfiguration { - const LDAP_PORT = 389; - const CONNECTION_TIMEOUT = 5; - const DEFAULT_LDAP_VERSION = 3; + const LDAP_PORT = 389; + const CONNECTION_TIMEOUT = 5; + const DEFAULT_LDAP_VERSION = 3; const LDAP_BOOLEAN_SETTINGS = [ 'ldap_enabled', 'ldap_server_cert_ignore', @@ -51,7 +51,8 @@ class LdapAdConfiguration * * @since 5.0.0 */ - public function init() { + public function init() + { // This try/catch is dumb, but is necessary to run initial migrations, since // this service provider is booted even during migrations. :( - snipe @@ -64,7 +65,6 @@ class LdapAdConfiguration \Log::debug($e); $this->ldapSettings = null; } - } /** @@ -92,7 +92,7 @@ class LdapAdConfiguration private function getSnipeItLdapSettings(): Collection { $ldapSettings = collect(); - if(Setting::first()) { // during early migration steps, there may be no settings table entry to start with + if (Setting::first()) { // during early migration steps, there may be no settings table entry to start with $ldapSettings = Setting::getLdapSettings() ->map(function ($item, $key) { // Trim the items @@ -105,7 +105,7 @@ class LdapAdConfiguration } // Decrypt the admin password - if ('ldap_pword' === $key && !empty($item)) { + if ('ldap_pword' === $key && ! empty($item)) { try { return decrypt($item); } catch (Exception $e) { @@ -120,6 +120,7 @@ class LdapAdConfiguration return $item; }); } + return $ldapSettings; } @@ -156,7 +157,7 @@ class LdapAdConfiguration private function setLdapConnectionConfiguration(): array { // Create the configuration array. - return [ + $ldap_settings = [ // Mandatory Configuration Options 'hosts' => $this->getServerUrlBase(), 'base_dn' => $this->ldapSettings['ldap_basedn'], @@ -180,6 +181,14 @@ class LdapAdConfiguration // LDAP_OPT_X_TLS_REQUIRE_CERT => LDAP_OPT_X_TLS_HARD, ], ]; + + if($this->ldapSettings['ldap_client_tls_cert'] || $this->ldapSettings['ldap_client_tls_key']) { + $ldap_settings['custom_options'] = [ + LDAP_OPT_X_TLS_CERTFILE => Setting::get_client_side_cert_path(), + LDAP_OPT_X_TLS_KEYFILE => Setting::get_client_side_key_path() + ]; + } + return $ldap_settings; } /** @@ -216,6 +225,7 @@ class LdapAdConfiguration if ($port && is_int($port)) { return $port; } + return self::LDAP_PORT; } @@ -234,6 +244,7 @@ class LdapAdConfiguration if ($scheme && 'ldaps' === strtolower($scheme)) { return true; } + return false; } @@ -253,11 +264,12 @@ class LdapAdConfiguration return trim($item); })->toArray(); } */ // <- this was the *original* intent of the PR for AdLdap2, but we've been moving away from having - // two separate fields - one for "ldap_host" and one for "ad_domain" - towards just using "ldap_host" - // ad_domain for us just means "append this domain to your usernames for login, if you click that checkbox" - // that's all, nothing more (I hope). + // two separate fields - one for "ldap_host" and one for "ad_domain" - towards just using "ldap_host" + // ad_domain for us just means "append this domain to your usernames for login, if you click that checkbox" + // that's all, nothing more (I hope). $url = $this->getLdapServerData('host'); + return $url ? [$url] : []; } diff --git a/app/Services/PredefinedKitCheckoutService.php b/app/Services/PredefinedKitCheckoutService.php index 8a1c624cbe..7ef28c9ee0 100644 --- a/app/Services/PredefinedKitCheckoutService.php +++ b/app/Services/PredefinedKitCheckoutService.php @@ -17,6 +17,7 @@ use Illuminate\Support\Facades\DB; class PredefinedKitCheckoutService { use AuthorizesRequests; + /** * @param Request $request, this function works with fields: checkout_at, expected_checkin, note * @param PredefinedKit $kit kit for checkout @@ -43,8 +44,8 @@ class PredefinedKitCheckoutService return ['errors' => $errors]; } - $checkout_at = date("Y-m-d H:i:s"); - if (($request->filled('checkout_at')) && ($request->get('checkout_at') != date("Y-m-d"))) { + $checkout_at = date('Y-m-d H:i:s'); + if (($request->filled('checkout_at')) && ($request->get('checkout_at') != date('Y-m-d'))) { $checkout_at = $request->get('checkout_at'); } @@ -59,7 +60,7 @@ class PredefinedKitCheckoutService $errors = $this->saveToDb($user, $admin, $checkout_at, $expected_checkin, $errors, $assets_to_add, $license_seats_to_add, $consumables_to_add, $accessories_to_add, $note); - return ['errors' => $errors, 'assets' => $assets_to_add, 'accessories' => $accessories_to_add, 'consumables' => $consumables_to_add ]; + return ['errors' => $errors, 'assets' => $assets_to_add, 'accessories' => $accessories_to_add, 'consumables' => $consumables_to_add]; } catch (ModelNotFoundException $e) { return ['errors' => [$e->getMessage()]]; } catch (CheckoutNotAllowed $e) { @@ -79,12 +80,10 @@ class PredefinedKitCheckoutService $assets = $model->assets; $quantity = $model->pivot->quantity; foreach ($assets as $asset) { - if ( $asset->availableForCheckout() - && !$asset->is($user) + && ! $asset->is($user) ) { - $this->authorize('checkout', $asset); $quantity -= 1; $assets_to_add[] = $asset; @@ -116,6 +115,7 @@ class PredefinedKitCheckoutService $seats_to_add[] = $license->freeSeats[$i]; } } + return $seats_to_add; } @@ -127,6 +127,7 @@ class PredefinedKitCheckoutService $errors[] = trans('admin/kits/general.none_consumables', ['consumable'=> $consumable->name, 'qty' => $consumable->pivot->quantity]); } } + return $consumables; } @@ -138,6 +139,7 @@ class PredefinedKitCheckoutService $errors[] = trans('admin/kits/general.none_accessory', ['accessory'=> $accessory->name, 'qty' => $accessory->pivot->quantity]); } } + return $accessories; } @@ -169,7 +171,7 @@ class PredefinedKitCheckoutService $consumable->users()->attach($consumable->id, [ 'consumable_id' => $consumable->id, 'user_id' => $admin->id, - 'assigned_to' => $user->id + 'assigned_to' => $user->id, ]); event(new CheckoutableCheckedOut($consumable, $user, $admin, $note)); } @@ -179,10 +181,11 @@ class PredefinedKitCheckoutService $accessory->users()->attach($accessory->id, [ 'accessory_id' => $accessory->id, 'user_id' => $admin->id, - 'assigned_to' => $user->id + 'assigned_to' => $user->id, ]); event(new CheckoutableCheckedOut($accessory, $user, $admin, $note)); } + return $errors; } ); diff --git a/app/Services/Saml.php b/app/Services/Saml.php index 9b0204bbce..9d73e05b49 100644 --- a/app/Services/Saml.php +++ b/app/Services/Saml.php @@ -2,15 +2,15 @@ namespace App\Services; -use OneLogin\Saml2\Auth as OneLogin_Saml2_Auth; -use OneLogin\Saml2\IdPMetadataParser as OneLogin_Saml2_IdPMetadataParser; -use OneLogin\Saml2\Settings as OneLogin_Saml2_Settings; -use OneLogin\Saml2\Utils as OneLogin_Saml2_Utils; use App\Models\Setting; use App\Models\User; use Exception; use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Session; +use OneLogin\Saml2\Auth as OneLogin_Saml2_Auth; +use OneLogin\Saml2\IdPMetadataParser as OneLogin_Saml2_IdPMetadataParser; +use OneLogin\Saml2\Settings as OneLogin_Saml2_Settings; +use OneLogin\Saml2\Utils as OneLogin_Saml2_Utils; use Symfony\Component\HttpKernel\Exception\HttpException; /** @@ -112,15 +112,15 @@ class Saml /** * Initializes the SAML service and builds the OneLogin_Saml2_Auth instance. - * + * * @author Johnson Yi - * + * * @since 5.0.0 - * + * * @throws Exception * @throws Error */ - function __construct() + public function __construct() { $this->loadSettings(); @@ -139,10 +139,10 @@ class Saml /** * Builds settings from Snipe-IT for OneLogin_Saml2_Auth. - * + * * @author Johnson Yi * @author Michael Pietsch - * + * * @since 5.0.0 * * @return void @@ -163,19 +163,19 @@ class Saml data_set($settings, 'sp.singleLogoutService.url', route('saml.sls')); data_set($settings, 'sp.x509cert', $setting->saml_sp_x509cert); data_set($settings, 'sp.privateKey', $setting->saml_sp_privatekey); - if(!empty($setting->saml_sp_x509certNew)) { + if (! empty($setting->saml_sp_x509certNew)) { data_set($settings, 'sp.x509certNew', $setting->saml_sp_x509certNew); } else { - data_set($settings, 'sp.x509certNew', ""); + data_set($settings, 'sp.x509certNew', ''); } - if (!empty(data_get($settings, 'sp.privateKey'))) { + if (! empty(data_get($settings, 'sp.privateKey'))) { data_set($settings, 'security.logoutRequestSigned', true); data_set($settings, 'security.logoutResponseSigned', true); } $idpMetadata = $setting->saml_idp_metadata; - if (!empty($idpMetadata)) { + if (! empty($idpMetadata)) { $updatedAt = $setting->updated_at->timestamp; $metadataCache = Cache::get('saml_idp_metadata_cache'); try { @@ -203,16 +203,16 @@ class Saml } catch (Exception $e) { } } - + $custom_settings = preg_split('/\r\n|\r|\n/', $setting->saml_custom_settings); - if ($custom_settings){ - foreach($custom_settings as $custom_setting) { + if ($custom_settings) { + foreach ($custom_settings as $custom_setting) { $split = explode('=', $custom_setting, 2); if (count($split) == 2) { $boolValue = filter_var($split[1], FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE); - if (!is_null($boolValue)) { + if (! is_null($boolValue)) { $split[1] = $boolValue; } @@ -226,16 +226,17 @@ class Saml /** * Load SAML data from Session. - * + * * @author Johnson Yi - * + * * @since 5.0.0 - * + * * @return void */ - private function loadDataFromSession() { + private function loadDataFromSession() + { $samlData = collect(session(self::DATA_SESSION_KEY)); - $this->_authenticated = !$samlData->isEmpty(); + $this->_authenticated = ! $samlData->isEmpty(); $this->_nameid = $samlData->get('nameId'); $this->_nameidFormat = $samlData->get('nameIdFormat'); $this->_nameidNameQualifier = $samlData->get('nameIdNameQualifier'); @@ -248,9 +249,9 @@ class Saml /** * Save SAML data to Session. - * + * * @author Johnson Yi - * + * * @since 5.0.0 * * @param string $data @@ -264,9 +265,9 @@ class Saml /** * Check to see if SAML is enabled and has valid settings. - * + * * @author Johnson Yi - * + * * @since 5.0.0 * * @return bool @@ -278,9 +279,9 @@ class Saml /** * Clear SAML data from session. - * + * * @author Johnson Yi - * + * * @since 5.0.0 * * @return void @@ -293,36 +294,38 @@ class Saml /** * Find user from SAML data. - * + * * @author Johnson Yi - * + * * @since 5.0.0 * * @param string $data * * @return \App\Models\User */ - public function samlLogin($data) { + public function samlLogin($data) + { $setting = Setting::getSettings(); $this->saveDataToSession($data); $this->loadDataFromSession(); - + $username = $this->getUsername(); - + return User::where('username', '=', $username)->whereNull('deleted_at')->where('activated', '=', '1')->first(); } /** - * Returns the OneLogin_Saml2_Auth instance. - * + * Returns the OneLogin_Saml2_Auth instance. + * * @author Johnson Yi - * + * * @since 5.0.0 - * + * * @return OneLogin\Saml2\Auth */ - public function getAuth() { - if (!$this->isEnabled()) { + public function getAuth() + { + if (! $this->isEnabled()) { throw new HttpException(403, 'SAML not enabled.'); } @@ -331,15 +334,16 @@ class Saml /** * Get a setting. - * + * * @author Johnson Yi - * + * * @param string|array|int $key * @param mixed $default - * + * * @return void */ - public function getSetting($key, $default = null) { + public function getSetting($key, $default = null) + { return data_get($this->_settings, $key, $default); } @@ -359,27 +363,28 @@ class Saml public function getSPMetadata($alwaysPublishEncryptionCert = false, $validUntil = null, $cacheDuration = null) { try { - $settings = new OneLogin_Saml2_Settings($this->_settings , true); + $settings = new OneLogin_Saml2_Settings($this->_settings, true); $metadata = $settings->getSPMetadata($alwaysPublishEncryptionCert, $validUntil, $cacheDuration); - + return $metadata; } catch (Exception $e) { - return ""; + return ''; } } /** - * Extract data from SAML Response. - * + * Extract data from SAML Response. + * * @author Johnson Yi - * + * * @since 5.0.0 - * + * * @return array */ public function extractData() { $auth = $this->getAuth(); + return [ 'attributes' => $auth->getAttributes(), 'attributesWithFriendlyName' => $auth->getAttributesWithFriendlyName(), @@ -483,12 +488,12 @@ class Saml } /** - * Returns the correct username from SAML Response. - * + * Returns the correct username from SAML Response. + * * @author Johnson Yi - * + * * @since 5.0.0 - * + * * @return string */ public function getUsername() @@ -496,8 +501,7 @@ class Saml $setting = Setting::getSettings(); $username = $this->getNameId(); - if (!empty($setting->saml_attr_mapping_username)) - { + if (! empty($setting->saml_attr_mapping_username)) { $attributes = $this->getAttributes(); if (isset($attributes[$setting->saml_attr_mapping_username])) { diff --git a/composer.json b/composer.json index 1c8cb94520..e27a0cd1e9 100644 --- a/composer.json +++ b/composer.json @@ -11,53 +11,59 @@ "license": "AGPL-3.0-or-later", "type": "project", "require": { - "php": "^7.2.5", + "php": "^7.3", "ext-curl": "*", "ext-fileinfo": "*", "ext-json": "*", "ext-mbstring": "*", "ext-pdo": "*", "adldap2/adldap2": "^10.2", - "alek13/slack": "^1.12", + "alek13/slack": "^2.0", "bacon/bacon-qr-code": "^1.0", - "barryvdh/laravel-cors": "^0.11.3", - "barryvdh/laravel-debugbar": "^3.2", + "barryvdh/laravel-debugbar": "^3.6", "doctrine/cache": "^1.10", "doctrine/common": "^2.12", - "doctrine/dbal": "^2.10", + "doctrine/dbal": "^3.1", "doctrine/inflector": "^1.3", "doctrine/instantiator": "^1.3", "eduardokum/laravel-mail-auto-embed": "^1.0", "enshrined/svg-sanitize": "^0.13.3", "erusev/parsedown": "^1.7", + "facade/ignition": "^2.10", "fideloper/proxy": "^4.3", - "guzzlehttp/guzzle": "^6.5", + "fruitcake/laravel-cors": "^2.0", + "guzzlehttp/guzzle": "^7.0.1", "intervention/image": "^2.5", "javiereguiluz/easyslugger": "^1.0", - "laravel/framework": "^6.20", - "laravel/helpers": "^1.2", - "laravel/passport": "^9.3.2", - "laravel/slack-notification-channel": "^2.0", - "laravel/tinker": "^2.4", - "laravelcollective/html": "^6.0", - "league/csv": "^9.5", + "laravel/framework": "^8.46", + "laravel/helpers": "^1.4", + "laravel/passport": "^10.1", + "laravel/slack-notification-channel": "^2.3", + "laravel/tinker": "^2.6", + "laravel/ui": "^3.3", + "laravelcollective/html": "^6.2", + "lcobucci/clock": "1.2.0", + "lcobucci/jwt": "^3.4.5", + "league/csv": "^9.7", "league/flysystem-aws-s3-v3": "^1.0", - "league/flysystem-cached-adapter": "^1.0", + "league/flysystem-cached-adapter": "^1.1", + "livewire/livewire": "^2.4", + "mediconesystems/livewire-datatables": "^0.4.3", "neitanod/forceutf8": "^2.0", "nesbot/carbon": "^2.32", - "nunomaduro/collision": "^3.2", + "nunomaduro/collision": "^5.4", "onelogin/php-saml": "^3.4", "paragonie/constant_time_encoding": "^2.3", "patchwork/utf8": "^1.3", "phpdocumentor/reflection-docblock": "^5.1", "phpspec/prophecy": "^1.10", "pragmarx/google2fa-laravel": "^1.3", - "rollbar/rollbar-laravel": "^6.0", - "spatie/laravel-backup": "^6.9", + "rollbar/rollbar-laravel": "^7.0", + "spatie/laravel-backup": "^6.16", "tecnickcom/tc-lib-barcode": "^1.15", - "tightenco/ziggy": "^0.9.0", + "tightenco/ziggy": "v1.2.0", "unicodeveloper/laravel-password": "^1.0", - "watson/validating": "^4.0" + "watson/validating": "^6.1" }, "require-dev": { "codeception/codeception": "^4.1", @@ -66,7 +72,7 @@ "codeception/module-rest": "^1.2", "codeception/module-webdriver": "^1.0", "fzaninotto/faker": "^1.9", - "overtrue/phplint": "^2.2", + "overtrue/phplint": "^3.0", "phpunit/php-token-stream": "^3.1", "phpunit/phpunit": "^8.5", "squizlabs/php_codesniffer": "^3.5", @@ -88,7 +94,9 @@ "database" ], "psr-4": { - "App\\": "app/" + "App\\": "app/", + "Database\\Factories\\": "database/factories/", + "Database\\Seeders\\": "database/seeders/" } }, "autoload-dev": { @@ -112,4 +120,4 @@ "discard-changes": true, "process-timeout": 3000 } -} +} \ No newline at end of file diff --git a/composer.lock b/composer.lock index 4d0aac698b..aa4d99d39b 100644 --- a/composer.lock +++ b/composer.lock @@ -4,20 +4,20 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "de58687444791ed74502fe3fa2b4ce61", + "content-hash": "64dee2cbecb92c4250bb11ffe23f2ed0", "packages": [ { "name": "adldap2/adldap2", - "version": "v10.3.2", + "version": "v10.3.3", "source": { "type": "git", "url": "https://github.com/Adldap2/Adldap2.git", - "reference": "b2203d800c5932f975abc213c659428697e27cd9" + "reference": "c2a8f72455d3438377d955fc0f4b9ed836b47463" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Adldap2/Adldap2/zipball/b2203d800c5932f975abc213c659428697e27cd9", - "reference": "b2203d800c5932f975abc213c659428697e27cd9", + "url": "https://api.github.com/repos/Adldap2/Adldap2/zipball/c2a8f72455d3438377d955fc0f4b9ed836b47463", + "reference": "c2a8f72455d3438377d955fc0f4b9ed836b47463", "shasum": "" }, "require": { @@ -63,31 +63,37 @@ "ldap", "windows" ], - "time": "2021-03-05T21:14:57+00:00" + "support": { + "docs": "https://github.com/Adldap2/Adldap2/blob/master/readme.md", + "email": "steven_bauman@outlook.com", + "issues": "https://github.com/Adldap2/Adldap2/issues", + "source": "https://github.com/Adldap2/Adldap2" + }, + "time": "2021-08-09T15:22:35+00:00" }, { "name": "alek13/slack", - "version": "1.12.0", + "version": "2.1.1", "source": { "type": "git", "url": "https://github.com/php-slack/slack.git", - "reference": "9db79a622803bf7baf0efafb50e37b900882f7fb" + "reference": "b039b696bd6e37296efcc58a8a3824def3156de5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-slack/slack/zipball/9db79a622803bf7baf0efafb50e37b900882f7fb", - "reference": "9db79a622803bf7baf0efafb50e37b900882f7fb", + "url": "https://api.github.com/repos/php-slack/slack/zipball/b039b696bd6e37296efcc58a8a3824def3156de5", + "reference": "b039b696bd6e37296efcc58a8a3824def3156de5", "shasum": "" }, "require": { "ext-json": "*", "ext-mbstring": "*", "guzzlehttp/guzzle": "~7.0|~6.0|~5.0|~4.0", - "php": "^5.6|^7.0" + "php": "^7.1|^8.0" }, "require-dev": { - "mockery/mockery": "0.9.*", - "phpunit/phpunit": "4.2.*" + "mockery/mockery": "^1.0", + "phpunit/phpunit": ">=7.5" }, "type": "library", "extra": { @@ -97,7 +103,8 @@ }, "autoload": { "psr-4": { - "Maknz\\Slack\\": "src/" + "Maknz\\Slack\\": "src/", + "Slack\\Tests\\": "tests/" } }, "notification-url": "https://packagist.org/downloads/", @@ -121,7 +128,7 @@ ], "support": { "issues": "https://github.com/php-slack/slack/issues", - "source": "https://github.com/php-slack/slack/tree/1.12.0" + "source": "https://github.com/php-slack/slack/tree/2.1.1" }, "funding": [ { @@ -129,40 +136,40 @@ "type": "custom" } ], - "time": "2020-09-01T18:22:43+00:00" + "time": "2021-09-02T12:08:47+00:00" }, { "name": "asm89/stack-cors", - "version": "1.3.0", + "version": "v2.0.3", "source": { "type": "git", "url": "https://github.com/asm89/stack-cors.git", - "reference": "b9c31def6a83f84b4d4a40d35996d375755f0e08" + "reference": "9cb795bf30988e8c96dd3c40623c48a877bc6714" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/asm89/stack-cors/zipball/b9c31def6a83f84b4d4a40d35996d375755f0e08", - "reference": "b9c31def6a83f84b4d4a40d35996d375755f0e08", + "url": "https://api.github.com/repos/asm89/stack-cors/zipball/9cb795bf30988e8c96dd3c40623c48a877bc6714", + "reference": "9cb795bf30988e8c96dd3c40623c48a877bc6714", "shasum": "" }, "require": { - "php": ">=5.5.9", + "php": "^7.0|^8.0", "symfony/http-foundation": "~2.7|~3.0|~4.0|~5.0", "symfony/http-kernel": "~2.7|~3.0|~4.0|~5.0" }, "require-dev": { - "phpunit/phpunit": "^5.0 || ^4.8.10", - "squizlabs/php_codesniffer": "^2.3" + "phpunit/phpunit": "^6|^7|^8|^9", + "squizlabs/php_codesniffer": "^3.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2-dev" + "dev-master": "2.0-dev" } }, "autoload": { "psr-4": { - "Asm89\\Stack\\": "src/Asm89/Stack/" + "Asm89\\Stack\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -183,25 +190,76 @@ ], "support": { "issues": "https://github.com/asm89/stack-cors/issues", - "source": "https://github.com/asm89/stack-cors/tree/1.3.0" + "source": "https://github.com/asm89/stack-cors/tree/v2.0.3" }, - "time": "2019-12-24T22:41:47+00:00" + "time": "2021-03-11T06:42:03+00:00" }, { - "name": "aws/aws-sdk-php", - "version": "3.176.9", + "name": "aws/aws-crt-php", + "version": "v1.0.2", "source": { "type": "git", - "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "17dc67514b148979994758fbfb54088a8a3393bf" + "url": "https://github.com/awslabs/aws-crt-php.git", + "reference": "3942776a8c99209908ee0b287746263725685732" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/17dc67514b148979994758fbfb54088a8a3393bf", - "reference": "17dc67514b148979994758fbfb54088a8a3393bf", + "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/3942776a8c99209908ee0b287746263725685732", + "reference": "3942776a8c99209908ee0b287746263725685732", "shasum": "" }, "require": { + "php": ">=5.5" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35|^5.4.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "AWS SDK Common Runtime Team", + "email": "aws-sdk-common-runtime@amazon.com" + } + ], + "description": "AWS Common Runtime for PHP", + "homepage": "http://aws.amazon.com/sdkforphp", + "keywords": [ + "amazon", + "aws", + "crt", + "sdk" + ], + "support": { + "issues": "https://github.com/awslabs/aws-crt-php/issues", + "source": "https://github.com/awslabs/aws-crt-php/tree/v1.0.2" + }, + "time": "2021-09-03T22:57:30+00:00" + }, + { + "name": "aws/aws-sdk-php", + "version": "3.195.2", + "source": { + "type": "git", + "url": "https://github.com/aws/aws-sdk-php.git", + "reference": "7e0cdfe30ee3cfa2a1494f8e3b4fa5277f118102" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/7e0cdfe30ee3cfa2a1494f8e3b4fa5277f118102", + "reference": "7e0cdfe30ee3cfa2a1494f8e3b4fa5277f118102", + "shasum": "" + }, + "require": { + "aws/aws-crt-php": "^1.0.2", "ext-json": "*", "ext-pcre": "*", "ext-simplexml": "*", @@ -270,7 +328,12 @@ "s3", "sdk" ], - "time": "2021-04-06T18:13:47+00:00" + "support": { + "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", + "issues": "https://github.com/aws/aws-sdk-php/issues", + "source": "https://github.com/aws/aws-sdk-php/tree/3.195.2" + }, + "time": "2021-09-29T18:17:19+00:00" }, { "name": "bacon/bacon-qr-code", @@ -322,84 +385,18 @@ }, "time": "2017-10-17T09:59:25+00:00" }, - { - "name": "barryvdh/laravel-cors", - "version": "v0.11.4", - "source": { - "type": "git", - "url": "https://github.com/fruitcake/laravel-cors.git", - "reference": "03492f1a3bc74a05de23f93b94ac7cc5c173eec9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/fruitcake/laravel-cors/zipball/03492f1a3bc74a05de23f93b94ac7cc5c173eec9", - "reference": "03492f1a3bc74a05de23f93b94ac7cc5c173eec9", - "shasum": "" - }, - "require": { - "asm89/stack-cors": "^1.2", - "illuminate/support": "^5.5|^6", - "php": ">=7", - "symfony/http-foundation": "^3.1|^4", - "symfony/http-kernel": "^3.1|^4" - }, - "require-dev": { - "laravel/framework": "^5.5", - "orchestra/testbench": "3.3.x|3.4.x|3.5.x|3.6.x|3.7.x", - "phpunit/phpunit": "^4.8|^5.2|^7.0", - "squizlabs/php_codesniffer": "^2.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.11-dev" - }, - "laravel": { - "providers": [ - "Barryvdh\\Cors\\ServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "Barryvdh\\Cors\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Barry vd. Heuvel", - "email": "barryvdh@gmail.com" - } - ], - "description": "Adds CORS (Cross-Origin Resource Sharing) headers support in your Laravel application", - "keywords": [ - "api", - "cors", - "crossdomain", - "laravel" - ], - "support": { - "issues": "https://github.com/fruitcake/laravel-cors/issues", - "source": "https://github.com/fruitcake/laravel-cors/tree/v0.11.4" - }, - "time": "2019-08-28T11:27:11+00:00" - }, { "name": "barryvdh/laravel-debugbar", - "version": "v3.5.4", + "version": "v3.6.2", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-debugbar.git", - "reference": "b8af309dea71eab3f2c942652969f518130228ee" + "reference": "70b89754913fd89fef16d0170a91dbc2a5cd633a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/b8af309dea71eab3f2c942652969f518130228ee", - "reference": "b8af309dea71eab3f2c942652969f518130228ee", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/70b89754913fd89fef16d0170a91dbc2a5cd633a", + "reference": "70b89754913fd89fef16d0170a91dbc2a5cd633a", "shasum": "" }, "require": { @@ -457,36 +454,176 @@ "profiler", "webprofiler" ], + "support": { + "issues": "https://github.com/barryvdh/laravel-debugbar/issues", + "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.6.2" + }, "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, { "url": "https://github.com/barryvdh", "type": "github" } ], - "time": "2021-04-06T18:11:42+00:00" + "time": "2021-06-14T14:29:26+00:00" }, { - "name": "defuse/php-encryption", - "version": "v2.2.1", + "name": "brick/math", + "version": "0.9.3", "source": { "type": "git", - "url": "https://github.com/defuse/php-encryption.git", - "reference": "0f407c43b953d571421e0020ba92082ed5fb7620" + "url": "https://github.com/brick/math.git", + "reference": "ca57d18f028f84f777b2168cd1911b0dee2343ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/defuse/php-encryption/zipball/0f407c43b953d571421e0020ba92082ed5fb7620", - "reference": "0f407c43b953d571421e0020ba92082ed5fb7620", + "url": "https://api.github.com/repos/brick/math/zipball/ca57d18f028f84f777b2168cd1911b0dee2343ae", + "reference": "ca57d18f028f84f777b2168cd1911b0dee2343ae", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.0", + "vimeo/psalm": "4.9.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Brick\\Math\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Arbitrary-precision arithmetic library", + "keywords": [ + "Arbitrary-precision", + "BigInteger", + "BigRational", + "arithmetic", + "bigdecimal", + "bignum", + "brick", + "math" + ], + "support": { + "issues": "https://github.com/brick/math/issues", + "source": "https://github.com/brick/math/tree/0.9.3" + }, + "funding": [ + { + "url": "https://github.com/BenMorel", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/brick/math", + "type": "tidelift" + } + ], + "time": "2021-08-15T20:50:18+00:00" + }, + { + "name": "composer/package-versions-deprecated", + "version": "1.11.99.4", + "source": { + "type": "git", + "url": "https://github.com/composer/package-versions-deprecated.git", + "reference": "b174585d1fe49ceed21928a945138948cb394600" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b174585d1fe49ceed21928a945138948cb394600", + "reference": "b174585d1fe49ceed21928a945138948cb394600", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.1.0 || ^2.0", + "php": "^7 || ^8" + }, + "replace": { + "ocramius/package-versions": "1.11.99" + }, + "require-dev": { + "composer/composer": "^1.9.3 || ^2.0@dev", + "ext-zip": "^1.13", + "phpunit/phpunit": "^6.5 || ^7" + }, + "type": "composer-plugin", + "extra": { + "class": "PackageVersions\\Installer", + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "PackageVersions\\": "src/PackageVersions" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be" + } + ], + "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", + "support": { + "issues": "https://github.com/composer/package-versions-deprecated/issues", + "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.4" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2021-09-13T08:41:34+00:00" + }, + { + "name": "defuse/php-encryption", + "version": "v2.3.1", + "source": { + "type": "git", + "url": "https://github.com/defuse/php-encryption.git", + "reference": "77880488b9954b7884c25555c2a0ea9e7053f9d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/defuse/php-encryption/zipball/77880488b9954b7884c25555c2a0ea9e7053f9d2", + "reference": "77880488b9954b7884c25555c2a0ea9e7053f9d2", "shasum": "" }, "require": { "ext-openssl": "*", "paragonie/random_compat": ">= 2", - "php": ">=5.4.0" + "php": ">=5.6.0" }, "require-dev": { - "nikic/php-parser": "^2.0|^3.0|^4.0", - "phpunit/phpunit": "^4|^5" + "phpunit/phpunit": "^4|^5|^6|^7|^8|^9" }, "bin": [ "bin/generate-defuse-key" @@ -528,71 +665,36 @@ ], "support": { "issues": "https://github.com/defuse/php-encryption/issues", - "source": "https://github.com/defuse/php-encryption/tree/master" + "source": "https://github.com/defuse/php-encryption/tree/v2.3.1" }, - "time": "2018-07-24T23:27:56+00:00" - }, - { - "name": "dnoegel/php-xdg-base-dir", - "version": "v0.1.1", - "source": { - "type": "git", - "url": "https://github.com/dnoegel/php-xdg-base-dir.git", - "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", - "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "require-dev": { - "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" - }, - "type": "library", - "autoload": { - "psr-4": { - "XdgBaseDir\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "implementation of xdg base directory specification for php", - "support": { - "issues": "https://github.com/dnoegel/php-xdg-base-dir/issues", - "source": "https://github.com/dnoegel/php-xdg-base-dir/tree/v0.1.1" - }, - "time": "2019-12-04T15:06:13+00:00" + "time": "2021-04-09T23:57:26+00:00" }, { "name": "doctrine/annotations", - "version": "1.12.1", + "version": "1.13.2", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "b17c5014ef81d212ac539f07a1001832df1b6d3b" + "reference": "5b668aef16090008790395c02c893b1ba13f7e08" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/b17c5014ef81d212ac539f07a1001832df1b6d3b", - "reference": "b17c5014ef81d212ac539f07a1001832df1b6d3b", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/5b668aef16090008790395c02c893b1ba13f7e08", + "reference": "5b668aef16090008790395c02c893b1ba13f7e08", "shasum": "" }, "require": { "doctrine/lexer": "1.*", "ext-tokenizer": "*", - "php": "^7.1 || ^8.0" + "php": "^7.1 || ^8.0", + "psr/cache": "^1 || ^2 || ^3" }, "require-dev": { - "doctrine/cache": "1.*", + "doctrine/cache": "^1.11 || ^2.0", "doctrine/coding-standard": "^6.0 || ^8.1", "phpstan/phpstan": "^0.12.20", - "phpunit/phpunit": "^7.5 || ^9.1.5" + "phpunit/phpunit": "^7.5 || ^8.0 || ^9.1.5", + "symfony/cache": "^4.4 || ^5.2" }, "type": "library", "autoload": { @@ -633,20 +735,24 @@ "docblock", "parser" ], - "time": "2021-02-21T21:00:45+00:00" + "support": { + "issues": "https://github.com/doctrine/annotations/issues", + "source": "https://github.com/doctrine/annotations/tree/1.13.2" + }, + "time": "2021-08-05T19:00:23+00:00" }, { "name": "doctrine/cache", - "version": "1.10.2", + "version": "1.12.1", "source": { "type": "git", "url": "https://github.com/doctrine/cache.git", - "reference": "13e3381b25847283a91948d04640543941309727" + "reference": "4cf401d14df219fa6f38b671f5493449151c9ad8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/13e3381b25847283a91948d04640543941309727", - "reference": "13e3381b25847283a91948d04640543941309727", + "url": "https://api.github.com/repos/doctrine/cache/zipball/4cf401d14df219fa6f38b671f5493449151c9ad8", + "reference": "4cf401d14df219fa6f38b671f5493449151c9ad8", "shasum": "" }, "require": { @@ -657,20 +763,19 @@ }, "require-dev": { "alcaeus/mongo-php-adapter": "^1.1", - "doctrine/coding-standard": "^6.0", + "cache/integration-tests": "dev-master", + "doctrine/coding-standard": "^8.0", "mongodb/mongodb": "^1.1", - "phpunit/phpunit": "^7.0", - "predis/predis": "~1.0" + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "predis/predis": "~1.0", + "psr/cache": "^1.0 || ^2.0 || ^3.0", + "symfony/cache": "^4.4 || ^5.2 || ^6.0@dev", + "symfony/var-exporter": "^4.4 || ^5.2 || ^6.0@dev" }, "suggest": { "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.9.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" @@ -717,7 +822,7 @@ ], "support": { "issues": "https://github.com/doctrine/cache/issues", - "source": "https://github.com/doctrine/cache/tree/1.10.x" + "source": "https://github.com/doctrine/cache/tree/1.12.1" }, "funding": [ { @@ -733,30 +838,30 @@ "type": "tidelift" } ], - "time": "2020-07-07T18:54:01+00:00" + "time": "2021-07-17T14:39:21+00:00" }, { "name": "doctrine/collections", - "version": "1.6.7", + "version": "1.6.8", "source": { "type": "git", "url": "https://github.com/doctrine/collections.git", - "reference": "55f8b799269a1a472457bd1a41b4f379d4cfba4a" + "reference": "1958a744696c6bb3bb0d28db2611dc11610e78af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/55f8b799269a1a472457bd1a41b4f379d4cfba4a", - "reference": "55f8b799269a1a472457bd1a41b4f379d4cfba4a", + "url": "https://api.github.com/repos/doctrine/collections/zipball/1958a744696c6bb3bb0d28db2611dc11610e78af", + "reference": "1958a744696c6bb3bb0d28db2611dc11610e78af", "shasum": "" }, "require": { "php": "^7.1.3 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpstan/phpstan-shim": "^0.9.2", - "phpunit/phpunit": "^7.0", - "vimeo/psalm": "^3.8.1" + "doctrine/coding-standard": "^9.0", + "phpstan/phpstan": "^0.12", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.1.5", + "vimeo/psalm": "^4.2.1" }, "type": "library", "autoload": { @@ -800,9 +905,9 @@ ], "support": { "issues": "https://github.com/doctrine/collections/issues", - "source": "https://github.com/doctrine/collections/tree/1.6.7" + "source": "https://github.com/doctrine/collections/tree/1.6.8" }, - "time": "2020-07-27T17:53:49+00:00" + "time": "2021-08-10T18:51:53+00:00" }, { "name": "doctrine/common", @@ -907,32 +1012,36 @@ }, { "name": "doctrine/dbal", - "version": "2.13.0", + "version": "3.1.2", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "67d56d3203b33db29834e6b2fcdbfdc50535d796" + "reference": "3ee2622b57370c786f531678f6641208747f7bfc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/67d56d3203b33db29834e6b2fcdbfdc50535d796", - "reference": "67d56d3203b33db29834e6b2fcdbfdc50535d796", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/3ee2622b57370c786f531678f6641208747f7bfc", + "reference": "3ee2622b57370c786f531678f6641208747f7bfc", "shasum": "" }, "require": { - "doctrine/cache": "^1.0", + "composer/package-versions-deprecated": "^1.11.99", + "doctrine/cache": "^1.0|^2.0", "doctrine/deprecations": "^0.5.3", "doctrine/event-manager": "^1.0", - "ext-pdo": "*", - "php": "^7.1 || ^8" + "php": "^7.3 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "8.2.0", - "jetbrains/phpstorm-stubs": "2020.2", - "phpstan/phpstan": "0.12.81", - "phpunit/phpunit": "^7.5.20|^8.5|9.5.0", - "symfony/console": "^2.0.5|^3.0|^4.0|^5.0", - "vimeo/psalm": "4.6.4" + "doctrine/coding-standard": "9.0.0", + "jetbrains/phpstorm-stubs": "2021.1", + "phpstan/phpstan": "0.12.96", + "phpstan/phpstan-strict-rules": "^0.12.11", + "phpunit/phpunit": "9.5.5", + "psalm/plugin-phpunit": "0.16.1", + "squizlabs/php_codesniffer": "3.6.0", + "symfony/cache": "^5.2|^6.0", + "symfony/console": "^2.0.5|^3.0|^4.0|^5.0|^6.0", + "vimeo/psalm": "4.10.0" }, "suggest": { "symfony/console": "For helpful console commands such as SQL execution and import of files." @@ -943,7 +1052,7 @@ "type": "library", "autoload": { "psr-4": { - "Doctrine\\DBAL\\": "lib/Doctrine/DBAL" + "Doctrine\\DBAL\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -986,11 +1095,14 @@ "queryobject", "sasql", "sql", - "sqlanywhere", "sqlite", "sqlserver", "sqlsrv" ], + "support": { + "issues": "https://github.com/doctrine/dbal/issues", + "source": "https://github.com/doctrine/dbal/tree/3.1.2" + }, "funding": [ { "url": "https://www.doctrine-project.org/sponsorship.html", @@ -1005,7 +1117,7 @@ "type": "tidelift" } ], - "time": "2021-03-28T18:10:53+00:00" + "time": "2021-09-12T20:56:32+00:00" }, { "name": "doctrine/deprecations", @@ -1044,6 +1156,10 @@ ], "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/v0.5.3" + }, "time": "2021-03-21T12:59:47+00:00" }, { @@ -1142,26 +1258,26 @@ }, { "name": "doctrine/inflector", - "version": "1.4.3", + "version": "1.4.4", "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", - "reference": "4650c8b30c753a76bf44fb2ed00117d6f367490c" + "reference": "4bd5c1cdfcd00e9e2d8c484f79150f67e5d355d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/4650c8b30c753a76bf44fb2ed00117d6f367490c", - "reference": "4650c8b30c753a76bf44fb2ed00117d6f367490c", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/4bd5c1cdfcd00e9e2d8c484f79150f67e5d355d9", + "reference": "4bd5c1cdfcd00e9e2d8c484f79150f67e5d355d9", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^7.0", - "phpstan/phpstan": "^0.11", - "phpstan/phpstan-phpunit": "^0.11", - "phpstan/phpstan-strict-rules": "^0.11", + "doctrine/coding-standard": "^8.0", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpstan/phpstan-strict-rules": "^0.12", "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" }, "type": "library", @@ -1218,7 +1334,7 @@ ], "support": { "issues": "https://github.com/doctrine/inflector/issues", - "source": "https://github.com/doctrine/inflector/tree/1.4.x" + "source": "https://github.com/doctrine/inflector/tree/1.4.4" }, "funding": [ { @@ -1234,7 +1350,7 @@ "type": "tidelift" } ], - "time": "2020-05-29T07:19:59+00:00" + "time": "2021-04-16T17:34:40+00:00" }, { "name": "doctrine/instantiator", @@ -1572,30 +1688,32 @@ }, { "name": "dragonmantank/cron-expression", - "version": "v2.3.1", + "version": "v3.1.0", "source": { "type": "git", "url": "https://github.com/dragonmantank/cron-expression.git", - "reference": "65b2d8ee1f10915efb3b55597da3404f096acba2" + "reference": "7a8c6e56ab3ffcc538d05e8155bb42269abf1a0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/65b2d8ee1f10915efb3b55597da3404f096acba2", - "reference": "65b2d8ee1f10915efb3b55597da3404f096acba2", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/7a8c6e56ab3ffcc538d05e8155bb42269abf1a0c", + "reference": "7a8c6e56ab3ffcc538d05e8155bb42269abf1a0c", "shasum": "" }, "require": { - "php": "^7.0|^8.0" + "php": "^7.2|^8.0", + "webmozart/assert": "^1.7.0" + }, + "replace": { + "mtdowling/cron-expression": "^1.0" }, "require-dev": { - "phpunit/phpunit": "^6.4|^7.0|^8.0|^9.0" + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-webmozart-assert": "^0.12.7", + "phpunit/phpunit": "^7.0|^8.0|^9.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3-dev" - } - }, "autoload": { "psr-4": { "Cron\\": "src/Cron/" @@ -1606,11 +1724,6 @@ "MIT" ], "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, { "name": "Chris Tankersley", "email": "chris@ctankersley.com", @@ -1624,7 +1737,7 @@ ], "support": { "issues": "https://github.com/dragonmantank/cron-expression/issues", - "source": "https://github.com/dragonmantank/cron-expression/tree/v2.3.1" + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.1.0" }, "funding": [ { @@ -1632,35 +1745,31 @@ "type": "github" } ], - "time": "2020-10-13T00:52:37+00:00" + "time": "2020-11-24T19:55:57+00:00" }, { "name": "eduardokum/laravel-mail-auto-embed", - "version": "1.0.5", + "version": "1.0.4", "source": { "type": "git", "url": "https://github.com/eduardokum/laravel-mail-auto-embed.git", - "reference": "83349a6a35560edb1c95e31205e2a848d73196ef" + "reference": "918c3aff220d965fbaee96ae4d48a09036381bdf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/eduardokum/laravel-mail-auto-embed/zipball/83349a6a35560edb1c95e31205e2a848d73196ef", - "reference": "83349a6a35560edb1c95e31205e2a848d73196ef", + "url": "https://api.github.com/repos/eduardokum/laravel-mail-auto-embed/zipball/918c3aff220d965fbaee96ae4d48a09036381bdf", + "reference": "918c3aff220d965fbaee96ae4d48a09036381bdf", "shasum": "" }, "require": { - "ext-dom": "*", - "illuminate/contracts": "^5.3 | ^6.0 | ^7.0", - "illuminate/mail": "^5.3 | ^6.0 | ^7.0 | ^8.0", - "illuminate/support": "^5.3 | ^6.0 | ^7.0", - "masterminds/html5": "^2.0", - "php": ">=5.6", - "squizlabs/php_codesniffer": "^3.5" + "illuminate/contracts": ">=5.3", + "illuminate/mail": ">=5.3", + "illuminate/support": ">=5.3", + "php": ">=5.5.0" }, "require-dev": { - "orchestra/testbench": "^3.4 | ^4.0 | ^5.0", - "php": ">=7.0", - "phpunit/phpunit": "^6.0 | ^7.0 | ^8.0" + "orchestra/testbench": "~3.0", + "phpunit/phpunit": "~5.0|~6.0" }, "type": "library", "extra": { @@ -1693,9 +1802,9 @@ ], "support": { "issues": "https://github.com/eduardokum/laravel-mail-auto-embed/issues", - "source": "https://github.com/eduardokum/laravel-mail-auto-embed/tree/1.0.5" + "source": "https://github.com/eduardokum/laravel-mail-auto-embed/tree/master" }, - "time": "2020-04-13T17:47:22+00:00" + "time": "2017-09-21T12:11:32+00:00" }, { "name": "egulias/email-validator", @@ -1860,6 +1969,254 @@ }, "time": "2019-12-30T22:54:17+00:00" }, + { + "name": "ezyang/htmlpurifier", + "version": "v4.13.0", + "source": { + "type": "git", + "url": "https://github.com/ezyang/htmlpurifier.git", + "reference": "08e27c97e4c6ed02f37c5b2b20488046c8d90d75" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/08e27c97e4c6ed02f37c5b2b20488046c8d90d75", + "reference": "08e27c97e4c6ed02f37c5b2b20488046c8d90d75", + "shasum": "" + }, + "require": { + "php": ">=5.2" + }, + "require-dev": { + "simpletest/simpletest": "dev-master#72de02a7b80c6bb8864ef9bf66d41d2f58f826bd" + }, + "type": "library", + "autoload": { + "psr-0": { + "HTMLPurifier": "library/" + }, + "files": [ + "library/HTMLPurifier.composer.php" + ], + "exclude-from-classmap": [ + "/library/HTMLPurifier/Language/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "Edward Z. Yang", + "email": "admin@htmlpurifier.org", + "homepage": "http://ezyang.com" + } + ], + "description": "Standards compliant HTML filter written in PHP", + "homepage": "http://htmlpurifier.org/", + "keywords": [ + "html" + ], + "support": { + "issues": "https://github.com/ezyang/htmlpurifier/issues", + "source": "https://github.com/ezyang/htmlpurifier/tree/master" + }, + "time": "2020-06-29T00:56:53+00:00" + }, + { + "name": "facade/flare-client-php", + "version": "1.9.1", + "source": { + "type": "git", + "url": "https://github.com/facade/flare-client-php.git", + "reference": "b2adf1512755637d0cef4f7d1b54301325ac78ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/facade/flare-client-php/zipball/b2adf1512755637d0cef4f7d1b54301325ac78ed", + "reference": "b2adf1512755637d0cef4f7d1b54301325ac78ed", + "shasum": "" + }, + "require": { + "facade/ignition-contracts": "~1.0", + "illuminate/pipeline": "^5.5|^6.0|^7.0|^8.0", + "php": "^7.1|^8.0", + "symfony/http-foundation": "^3.3|^4.1|^5.0", + "symfony/mime": "^3.4|^4.0|^5.1", + "symfony/var-dumper": "^3.4|^4.0|^5.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.14", + "phpunit/phpunit": "^7.5.16", + "spatie/phpunit-snapshot-assertions": "^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Facade\\FlareClient\\": "src" + }, + "files": [ + "src/helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Send PHP errors to Flare", + "homepage": "https://github.com/facade/flare-client-php", + "keywords": [ + "exception", + "facade", + "flare", + "reporting" + ], + "support": { + "issues": "https://github.com/facade/flare-client-php/issues", + "source": "https://github.com/facade/flare-client-php/tree/1.9.1" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2021-09-13T12:16:46+00:00" + }, + { + "name": "facade/ignition", + "version": "2.13.1", + "source": { + "type": "git", + "url": "https://github.com/facade/ignition.git", + "reference": "e3f49bef7b4165fa4b8a9dc579e7b63fa06aef78" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/facade/ignition/zipball/e3f49bef7b4165fa4b8a9dc579e7b63fa06aef78", + "reference": "e3f49bef7b4165fa4b8a9dc579e7b63fa06aef78", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "facade/flare-client-php": "^1.9.1", + "facade/ignition-contracts": "^1.0.2", + "illuminate/support": "^7.0|^8.0", + "monolog/monolog": "^2.0", + "php": "^7.2.5|^8.0", + "symfony/console": "^5.0", + "symfony/var-dumper": "^5.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.14", + "mockery/mockery": "^1.3", + "orchestra/testbench": "^5.0|^6.0", + "psalm/plugin-laravel": "^1.2" + }, + "suggest": { + "laravel/telescope": "^3.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Facade\\Ignition\\IgnitionServiceProvider" + ], + "aliases": { + "Flare": "Facade\\Ignition\\Facades\\Flare" + } + } + }, + "autoload": { + "psr-4": { + "Facade\\Ignition\\": "src" + }, + "files": [ + "src/helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A beautiful error page for Laravel applications.", + "homepage": "https://github.com/facade/ignition", + "keywords": [ + "error", + "flare", + "laravel", + "page" + ], + "support": { + "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction", + "forum": "https://twitter.com/flareappio", + "issues": "https://github.com/facade/ignition/issues", + "source": "https://github.com/facade/ignition" + }, + "time": "2021-09-13T13:01:30+00:00" + }, + { + "name": "facade/ignition-contracts", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/facade/ignition-contracts.git", + "reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/facade/ignition-contracts/zipball/3c921a1cdba35b68a7f0ccffc6dffc1995b18267", + "reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^v2.15.8", + "phpunit/phpunit": "^9.3.11", + "vimeo/psalm": "^3.17.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Facade\\IgnitionContracts\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://flareapp.io", + "role": "Developer" + } + ], + "description": "Solution contracts for Ignition", + "homepage": "https://github.com/facade/ignition-contracts", + "keywords": [ + "contracts", + "flare", + "ignition" + ], + "support": { + "issues": "https://github.com/facade/ignition-contracts/issues", + "source": "https://github.com/facade/ignition-contracts/tree/1.0.2" + }, + "time": "2020-10-16T08:27:54+00:00" + }, { "name": "fideloper/proxy", "version": "4.4.1", @@ -1920,16 +2277,16 @@ }, { "name": "filp/whoops", - "version": "2.12.0", + "version": "2.14.3", "source": { "type": "git", "url": "https://github.com/filp/whoops.git", - "reference": "d501fd2658d55491a2295ff600ae5978eaad7403" + "reference": "89584ce67dd32307f1063cc43846674f4679feda" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/d501fd2658d55491a2295ff600ae5978eaad7403", - "reference": "d501fd2658d55491a2295ff600ae5978eaad7403", + "url": "https://api.github.com/repos/filp/whoops/zipball/89584ce67dd32307f1063cc43846674f4679feda", + "reference": "89584ce67dd32307f1063cc43846674f4679feda", "shasum": "" }, "require": { @@ -1977,26 +2334,30 @@ "throwable", "whoops" ], + "support": { + "issues": "https://github.com/filp/whoops/issues", + "source": "https://github.com/filp/whoops/tree/2.14.3" + }, "funding": [ { "url": "https://github.com/denis-sokolov", "type": "github" } ], - "time": "2021-03-30T12:00:00+00:00" + "time": "2021-09-19T12:00:00+00:00" }, { "name": "firebase/php-jwt", - "version": "v5.2.1", + "version": "v5.4.0", "source": { "type": "git", "url": "https://github.com/firebase/php-jwt.git", - "reference": "f42c9110abe98dd6cfe9053c49bc86acc70b2d23" + "reference": "d2113d9b2e0e349796e72d2a63cf9319100382d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/f42c9110abe98dd6cfe9053c49bc86acc70b2d23", - "reference": "f42c9110abe98dd6cfe9053c49bc86acc70b2d23", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/d2113d9b2e0e349796e72d2a63cf9319100382d2", + "reference": "d2113d9b2e0e349796e72d2a63cf9319100382d2", "shasum": "" }, "require": { @@ -2005,6 +2366,9 @@ "require-dev": { "phpunit/phpunit": ">=4.8 <=9" }, + "suggest": { + "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" + }, "type": "library", "autoload": { "psr-4": { @@ -2033,41 +2397,190 @@ "jwt", "php" ], - "time": "2021-02-12T00:02:00+00:00" + "support": { + "issues": "https://github.com/firebase/php-jwt/issues", + "source": "https://github.com/firebase/php-jwt/tree/v5.4.0" + }, + "time": "2021-06-23T19:00:23+00:00" }, { - "name": "guzzlehttp/guzzle", - "version": "6.5.5", + "name": "fruitcake/laravel-cors", + "version": "v2.0.4", "source": { "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e" + "url": "https://github.com/fruitcake/laravel-cors.git", + "reference": "a8ccedc7ca95189ead0e407c43b530dc17791d6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/9d4290de1cfd701f38099ef7e183b64b4b7b0c5e", - "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e", + "url": "https://api.github.com/repos/fruitcake/laravel-cors/zipball/a8ccedc7ca95189ead0e407c43b530dc17791d6a", + "reference": "a8ccedc7ca95189ead0e407c43b530dc17791d6a", + "shasum": "" + }, + "require": { + "asm89/stack-cors": "^2.0.1", + "illuminate/contracts": "^6|^7|^8|^9", + "illuminate/support": "^6|^7|^8|^9", + "php": ">=7.2", + "symfony/http-foundation": "^4|^5", + "symfony/http-kernel": "^4.3.4|^5" + }, + "require-dev": { + "laravel/framework": "^6|^7|^8", + "orchestra/testbench-dusk": "^4|^5|^6|^7", + "phpunit/phpunit": "^6|^7|^8|^9", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + }, + "laravel": { + "providers": [ + "Fruitcake\\Cors\\CorsServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Fruitcake\\Cors\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fruitcake", + "homepage": "https://fruitcake.nl" + }, + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "Adds CORS (Cross-Origin Resource Sharing) headers support in your Laravel application", + "keywords": [ + "api", + "cors", + "crossdomain", + "laravel" + ], + "support": { + "issues": "https://github.com/fruitcake/laravel-cors/issues", + "source": "https://github.com/fruitcake/laravel-cors/tree/v2.0.4" + }, + "funding": [ + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2021-04-26T11:24:25+00:00" + }, + { + "name": "graham-campbell/result-type", + "version": "v1.0.2", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "84afea85c6841deeea872f36249a206e878a5de0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/84afea85c6841deeea872f36249a206e878a5de0", + "reference": "84afea85c6841deeea872f36249a206e878a5de0", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "phpoption/phpoption": "^1.8" + }, + "require-dev": { + "phpunit/phpunit": "^6.5.14 || ^7.5.20 || ^8.5.19 || ^9.5.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.0.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2021-08-28T21:34:50+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.3.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "7008573787b430c1c1f650e3722d9bba59967628" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/7008573787b430c1c1f650e3722d9bba59967628", + "reference": "7008573787b430c1c1f650e3722d9bba59967628", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.0", - "guzzlehttp/psr7": "^1.6.1", - "php": ">=5.5", - "symfony/polyfill-intl-idn": "^1.17.0" + "guzzlehttp/promises": "^1.4", + "guzzlehttp/psr7": "^1.7 || ^2.0", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" }, "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", "ext-curl": "*", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", + "php-http/client-integration-tests": "^3.0", + "phpunit/phpunit": "^8.5.5 || ^9.3.5", "psr/log": "^1.1" }, "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", "psr/log": "Required for using the Log middleware" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "6.5-dev" + "dev-master": "7.3-dev" } }, "autoload": { @@ -2087,6 +2600,11 @@ "name": "Michael Dowling", "email": "mtdowling@gmail.com", "homepage": "https://github.com/mtdowling" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" } ], "description": "Guzzle is a PHP HTTP client library", @@ -2097,14 +2615,34 @@ "framework", "http", "http client", + "psr-18", + "psr-7", "rest", "web service" ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/6.5" + "source": "https://github.com/guzzle/guzzle/tree/7.3.0" }, - "time": "2020-06-16T21:01:06+00:00" + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://github.com/alexeyshockov", + "type": "github" + }, + { + "url": "https://github.com/gmponos", + "type": "github" + } + ], + "time": "2021-03-23T11:33:13+00:00" }, { "name": "guzzlehttp/promises", @@ -2155,20 +2693,24 @@ "keywords": [ "promise" ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/1.4.1" + }, "time": "2021-03-07T09:25:29+00:00" }, { "name": "guzzlehttp/psr7", - "version": "1.8.1", + "version": "1.8.2", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "35ea11d335fd638b5882ff1725228b3d35496ab1" + "reference": "dc960a912984efb74d0a90222870c72c87f10c91" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/35ea11d335fd638b5882ff1725228b3d35496ab1", - "reference": "35ea11d335fd638b5882ff1725228b3d35496ab1", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/dc960a912984efb74d0a90222870c72c87f10c91", + "reference": "dc960a912984efb74d0a90222870c72c87f10c91", "shasum": "" }, "require": { @@ -2226,30 +2768,34 @@ "uri", "url" ], - "time": "2021-03-21T16:25:00+00:00" + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/1.8.2" + }, + "time": "2021-04-26T09:17:50+00:00" }, { "name": "intervention/image", - "version": "2.5.1", + "version": "2.6.1", "source": { "type": "git", "url": "https://github.com/Intervention/image.git", - "reference": "abbf18d5ab8367f96b3205ca3c89fb2fa598c69e" + "reference": "0925f10b259679b5d8ca58f3a2add9255ffcda45" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Intervention/image/zipball/abbf18d5ab8367f96b3205ca3c89fb2fa598c69e", - "reference": "abbf18d5ab8367f96b3205ca3c89fb2fa598c69e", + "url": "https://api.github.com/repos/Intervention/image/zipball/0925f10b259679b5d8ca58f3a2add9255ffcda45", + "reference": "0925f10b259679b5d8ca58f3a2add9255ffcda45", "shasum": "" }, "require": { "ext-fileinfo": "*", - "guzzlehttp/psr7": "~1.1", + "guzzlehttp/psr7": "~1.1 || ^2.0", "php": ">=5.4.0" }, "require-dev": { "mockery/mockery": "~0.9.2", - "phpunit/phpunit": "^4.8 || ^5.7" + "phpunit/phpunit": "^4.8 || ^5.7 || ^7.5.15" }, "suggest": { "ext-gd": "to use GD library based image processing.", @@ -2298,9 +2844,19 @@ ], "support": { "issues": "https://github.com/Intervention/image/issues", - "source": "https://github.com/Intervention/image/tree/master" + "source": "https://github.com/Intervention/image/tree/2.6.1" }, - "time": "2019-11-02T09:15:47+00:00" + "funding": [ + { + "url": "https://www.paypal.me/interventionphp", + "type": "custom" + }, + { + "url": "https://github.com/Intervention", + "type": "github" + } + ], + "time": "2021-07-22T14:31:53+00:00" }, { "name": "javiereguiluz/easyslugger", @@ -2336,216 +2892,65 @@ }, "time": "2015-04-12T19:57:10+00:00" }, - { - "name": "laminas/laminas-diactoros", - "version": "2.4.1", - "source": { - "type": "git", - "url": "https://github.com/laminas/laminas-diactoros.git", - "reference": "36ef09b73e884135d2059cc498c938e90821bb57" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/36ef09b73e884135d2059cc498c938e90821bb57", - "reference": "36ef09b73e884135d2059cc498c938e90821bb57", - "shasum": "" - }, - "require": { - "laminas/laminas-zendframework-bridge": "^1.0", - "php": "^7.1", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.0" - }, - "conflict": { - "phpspec/prophecy": "<1.9.0" - }, - "provide": { - "psr/http-factory-implementation": "1.0", - "psr/http-message-implementation": "1.0" - }, - "replace": { - "zendframework/zend-diactoros": "^2.2.1" - }, - "require-dev": { - "ext-curl": "*", - "ext-dom": "*", - "ext-gd": "*", - "ext-libxml": "*", - "http-interop/http-factory-tests": "^0.5.0", - "laminas/laminas-coding-standard": "~1.0.0", - "php-http/psr7-integration-tests": "^1.0", - "phpunit/phpunit": "^7.5.18" - }, - "type": "library", - "extra": { - "laminas": { - "config-provider": "Laminas\\Diactoros\\ConfigProvider", - "module": "Laminas\\Diactoros" - } - }, - "autoload": { - "files": [ - "src/functions/create_uploaded_file.php", - "src/functions/marshal_headers_from_sapi.php", - "src/functions/marshal_method_from_sapi.php", - "src/functions/marshal_protocol_version_from_sapi.php", - "src/functions/marshal_uri_from_sapi.php", - "src/functions/normalize_server.php", - "src/functions/normalize_uploaded_files.php", - "src/functions/parse_cookie_header.php", - "src/functions/create_uploaded_file.legacy.php", - "src/functions/marshal_headers_from_sapi.legacy.php", - "src/functions/marshal_method_from_sapi.legacy.php", - "src/functions/marshal_protocol_version_from_sapi.legacy.php", - "src/functions/marshal_uri_from_sapi.legacy.php", - "src/functions/normalize_server.legacy.php", - "src/functions/normalize_uploaded_files.legacy.php", - "src/functions/parse_cookie_header.legacy.php" - ], - "psr-4": { - "Laminas\\Diactoros\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "PSR HTTP Message implementations", - "homepage": "https://laminas.dev", - "keywords": [ - "http", - "laminas", - "psr", - "psr-17", - "psr-7" - ], - "support": { - "chat": "https://laminas.dev/chat", - "docs": "https://docs.laminas.dev/laminas-diactoros/", - "forum": "https://discourse.laminas.dev", - "issues": "https://github.com/laminas/laminas-diactoros/issues", - "rss": "https://github.com/laminas/laminas-diactoros/releases.atom", - "source": "https://github.com/laminas/laminas-diactoros" - }, - "funding": [ - { - "url": "https://funding.communitybridge.org/projects/laminas-project", - "type": "community_bridge" - } - ], - "time": "2020-09-03T14:29:41+00:00" - }, - { - "name": "laminas/laminas-zendframework-bridge", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/laminas/laminas-zendframework-bridge.git", - "reference": "6ede70583e101030bcace4dcddd648f760ddf642" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/6ede70583e101030bcace4dcddd648f760ddf642", - "reference": "6ede70583e101030bcace4dcddd648f760ddf642", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.1 || ^9.3", - "squizlabs/php_codesniffer": "^3.5" - }, - "type": "library", - "extra": { - "laminas": { - "module": "Laminas\\ZendFrameworkBridge" - } - }, - "autoload": { - "files": [ - "src/autoload.php" - ], - "psr-4": { - "Laminas\\ZendFrameworkBridge\\": "src//" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Alias legacy ZF class names to Laminas Project equivalents.", - "keywords": [ - "ZendFramework", - "autoloading", - "laminas", - "zf" - ], - "support": { - "forum": "https://discourse.laminas.dev/", - "issues": "https://github.com/laminas/laminas-zendframework-bridge/issues", - "rss": "https://github.com/laminas/laminas-zendframework-bridge/releases.atom", - "source": "https://github.com/laminas/laminas-zendframework-bridge" - }, - "funding": [ - { - "url": "https://funding.communitybridge.org/projects/laminas-project", - "type": "community_bridge" - } - ], - "time": "2020-09-14T14:23:00+00:00" - }, { "name": "laravel/framework", - "version": "v6.20.22", + "version": "v8.62.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "f4d2beff6f1793909e1db4f2204800183b4f1719" + "reference": "60a7e00488167ce2babf3a2aeb3677e48aaf39be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/f4d2beff6f1793909e1db4f2204800183b4f1719", - "reference": "f4d2beff6f1793909e1db4f2204800183b4f1719", + "url": "https://api.github.com/repos/laravel/framework/zipball/60a7e00488167ce2babf3a2aeb3677e48aaf39be", + "reference": "60a7e00488167ce2babf3a2aeb3677e48aaf39be", "shasum": "" }, "require": { "doctrine/inflector": "^1.4|^2.0", - "dragonmantank/cron-expression": "^2.3.1", + "dragonmantank/cron-expression": "^3.0.2", "egulias/email-validator": "^2.1.10", "ext-json": "*", "ext-mbstring": "*", "ext-openssl": "*", - "league/commonmark": "^1.3", + "laravel/serializable-closure": "^1.0", + "league/commonmark": "^1.3|^2.0.2", "league/flysystem": "^1.1", - "monolog/monolog": "^1.12|^2.0", + "monolog/monolog": "^2.0", "nesbot/carbon": "^2.31", "opis/closure": "^3.6", - "php": "^7.2.5|^8.0", + "php": "^7.3|^8.0", "psr/container": "^1.0", + "psr/log": "^1.0 || ^2.0", "psr/simple-cache": "^1.0", - "ramsey/uuid": "^3.7", + "ramsey/uuid": "^4.2.2", "swiftmailer/swiftmailer": "^6.0", - "symfony/console": "^4.3.4", - "symfony/debug": "^4.3.4", - "symfony/finder": "^4.3.4", - "symfony/http-foundation": "^4.3.4", - "symfony/http-kernel": "^4.3.4", - "symfony/polyfill-php73": "^1.17", - "symfony/process": "^4.3.4", - "symfony/routing": "^4.3.4", - "symfony/var-dumper": "^4.3.4", - "tijsverkoyen/css-to-inline-styles": "^2.2.1", - "vlucas/phpdotenv": "^3.3" + "symfony/console": "^5.1.4", + "symfony/error-handler": "^5.1.4", + "symfony/finder": "^5.1.4", + "symfony/http-foundation": "^5.1.4", + "symfony/http-kernel": "^5.1.4", + "symfony/mime": "^5.1.4", + "symfony/process": "^5.1.4", + "symfony/routing": "^5.1.4", + "symfony/var-dumper": "^5.1.4", + "tijsverkoyen/css-to-inline-styles": "^2.2.2", + "vlucas/phpdotenv": "^5.2", + "voku/portable-ascii": "^1.4.8" }, "conflict": { "tightenco/collect": "<5.5.33" }, + "provide": { + "psr/container-implementation": "1.0", + "psr/simple-cache-implementation": "1.0" + }, "replace": { "illuminate/auth": "self.version", "illuminate/broadcasting": "self.version", "illuminate/bus": "self.version", "illuminate/cache": "self.version", + "illuminate/collections": "self.version", "illuminate/config": "self.version", "illuminate/console": "self.version", "illuminate/container": "self.version", @@ -2558,6 +2963,7 @@ "illuminate/hashing": "self.version", "illuminate/http": "self.version", "illuminate/log": "self.version", + "illuminate/macroable": "self.version", "illuminate/mail": "self.version", "illuminate/notifications": "self.version", "illuminate/pagination": "self.version", @@ -2567,27 +2973,28 @@ "illuminate/routing": "self.version", "illuminate/session": "self.version", "illuminate/support": "self.version", + "illuminate/testing": "self.version", "illuminate/translation": "self.version", "illuminate/validation": "self.version", "illuminate/view": "self.version" }, "require-dev": { - "aws/aws-sdk-php": "^3.155", - "doctrine/dbal": "^2.6", + "aws/aws-sdk-php": "^3.189.0", + "doctrine/dbal": "^2.13.3|^3.1.2", "filp/whoops": "^2.8", - "guzzlehttp/guzzle": "^6.3.1|^7.0.1", + "guzzlehttp/guzzle": "^6.5.5|^7.0.1", "league/flysystem-cached-adapter": "^1.0", - "mockery/mockery": "~1.3.3|^1.4.2", - "moontoast/math": "^1.1", - "orchestra/testbench-core": "^4.8", + "mockery/mockery": "^1.4.4", + "orchestra/testbench-core": "^6.23", "pda/pheanstalk": "^4.0", - "phpunit/phpunit": "^7.5.15|^8.4|^9.3.3", - "predis/predis": "^1.1.1", - "symfony/cache": "^4.3.4" + "phpunit/phpunit": "^8.5.19|^9.5.8", + "predis/predis": "^1.1.2", + "symfony/cache": "^5.1.4" }, "suggest": { - "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage and SES mail driver (^3.155).", - "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.6).", + "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage and SES mail driver (^3.189.0).", + "brianium/paratest": "Required to run tests in parallel (^6.0).", + "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.13.3|^3.1.2).", "ext-ftp": "Required to use the Flysystem FTP driver.", "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", "ext-memcached": "Required to use the memcache cache driver.", @@ -2596,34 +3003,42 @@ "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0).", "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", "filp/whoops": "Required for friendly error pages in development (^2.8).", - "guzzlehttp/guzzle": "Required to use the Mailgun mail driver and the ping methods on schedules (^6.3.1|^7.0.1).", + "guzzlehttp/guzzle": "Required to use the HTTP Client, Mailgun mail driver and the ping methods on schedules (^6.5.5|^7.0.1).", "laravel/tinker": "Required to use the tinker console command (^2.0).", "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^1.0).", "league/flysystem-cached-adapter": "Required to use the Flysystem cache (^1.0).", "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (^1.0).", - "moontoast/math": "Required to use ordered UUIDs (^1.1).", + "mockery/mockery": "Required to use mocking (^1.4.4).", "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).", "pda/pheanstalk": "Required to use the beanstalk queue driver (^4.0).", + "phpunit/phpunit": "Required to use assertions and run tests (^8.5.19|^9.5.8).", "predis/predis": "Required to use the predis connector (^1.1.2).", "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", - "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^4.0).", - "symfony/cache": "Required to PSR-6 cache bridge (^4.3.4).", - "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^1.2).", + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^4.0|^5.0|^6.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^5.1.4).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^5.1.4).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0).", "wildbit/swiftmailer-postmark": "Required to use Postmark mail driver (^3.0)." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "6.x-dev" + "dev-master": "8.x-dev" } }, "autoload": { "files": [ + "src/Illuminate/Collections/helpers.php", + "src/Illuminate/Events/functions.php", "src/Illuminate/Foundation/helpers.php", "src/Illuminate/Support/helpers.php" ], "psr-4": { - "Illuminate\\": "src/Illuminate/" + "Illuminate\\": "src/Illuminate/", + "Illuminate\\Support\\": [ + "src/Illuminate/Macroable/", + "src/Illuminate/Collections/" + ] } }, "notification-url": "https://packagist.org/downloads/", @@ -2642,7 +3057,11 @@ "framework", "laravel" ], - "time": "2021-03-30T21:33:47+00:00" + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-09-28T13:30:25+00:00" }, { "name": "laravel/helpers", @@ -2695,51 +3114,53 @@ "helpers", "laravel" ], + "support": { + "source": "https://github.com/laravel/helpers/tree/v1.4.1" + }, "time": "2021-02-16T15:27:11+00:00" }, { "name": "laravel/passport", - "version": "v9.4.0", + "version": "v10.1.3", "source": { "type": "git", "url": "https://github.com/laravel/passport.git", - "reference": "011bd500e8ae3d459b692467880a49ff1ecd60c0" + "reference": "a5e4471dd99b7638ab5ca3ecab6cd87cf37eb410" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/passport/zipball/011bd500e8ae3d459b692467880a49ff1ecd60c0", - "reference": "011bd500e8ae3d459b692467880a49ff1ecd60c0", + "url": "https://api.github.com/repos/laravel/passport/zipball/a5e4471dd99b7638ab5ca3ecab6cd87cf37eb410", + "reference": "a5e4471dd99b7638ab5ca3ecab6cd87cf37eb410", "shasum": "" }, "require": { "ext-json": "*", "firebase/php-jwt": "^5.0", - "illuminate/auth": "^6.18.31|^7.22.4", - "illuminate/console": "^6.18.31|^7.22.4", - "illuminate/container": "^6.18.31|^7.22.4", - "illuminate/contracts": "^6.18.31|^7.22.4", - "illuminate/cookie": "^6.18.31|^7.22.4", - "illuminate/database": "^6.18.31|^7.22.4", - "illuminate/encryption": "^6.18.31|^7.22.4", - "illuminate/http": "^6.18.31|^7.22.4", - "illuminate/support": "^6.18.31|^7.22.4", - "laminas/laminas-diactoros": "^2.2", + "illuminate/auth": "^8.2", + "illuminate/console": "^8.2", + "illuminate/container": "^8.2", + "illuminate/contracts": "^8.2", + "illuminate/cookie": "^8.2", + "illuminate/database": "^8.2", + "illuminate/encryption": "^8.2", + "illuminate/http": "^8.2", + "illuminate/support": "^8.2", "lcobucci/jwt": "^3.4|^4.0", - "league/oauth2-server": "^8.2.3", - "nyholm/psr7": "^1.0", - "php": "^7.2|^8.0", - "phpseclib/phpseclib": "^2.0", + "league/oauth2-server": "^8.2", + "nyholm/psr7": "^1.3", + "php": "^7.3|^8.0", + "phpseclib/phpseclib": "^2.0|^3.0", "symfony/psr-http-message-bridge": "^2.0" }, "require-dev": { "mockery/mockery": "^1.0", - "orchestra/testbench": "^4.4|^5.0", - "phpunit/phpunit": "^8.5|^9.3" + "orchestra/testbench": "^6.0", + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "9.x-dev" + "dev-master": "10.x-dev" }, "laravel": { "providers": [ @@ -2749,7 +3170,8 @@ }, "autoload": { "psr-4": { - "Laravel\\Passport\\": "src/" + "Laravel\\Passport\\": "src/", + "Laravel\\Passport\\Database\\Factories\\": "database/factories/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2772,7 +3194,66 @@ "issues": "https://github.com/laravel/passport/issues", "source": "https://github.com/laravel/passport" }, - "time": "2020-12-04T09:37:12+00:00" + "time": "2021-04-06T14:30:45+00:00" + }, + { + "name": "laravel/serializable-closure", + "version": "v1.0.2", + "source": { + "type": "git", + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "679e24d36ff8b9be0e36f5222244ec8602e18867" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/679e24d36ff8b9be0e36f5222244ec8602e18867", + "reference": "679e24d36ff8b9be0e36f5222244ec8602e18867", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "pestphp/pest": "^1.18", + "phpstan/phpstan": "^0.12.98", + "symfony/var-dumper": "^5.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\SerializableClosure\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "nuno@laravel.com" + } + ], + "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", + "keywords": [ + "closure", + "laravel", + "serializable" + ], + "support": { + "issues": "https://github.com/laravel/serializable-closure/issues", + "source": "https://github.com/laravel/serializable-closure" + }, + "time": "2021-09-29T13:25:52+00:00" }, { "name": "laravel/slack-notification-channel", @@ -2837,16 +3318,16 @@ }, { "name": "laravel/tinker", - "version": "v2.6.1", + "version": "v2.6.2", "source": { "type": "git", "url": "https://github.com/laravel/tinker.git", - "reference": "04ad32c1a3328081097a181875733fa51f402083" + "reference": "c808a7227f97ecfd9219fbf913bad842ea854ddc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/tinker/zipball/04ad32c1a3328081097a181875733fa51f402083", - "reference": "04ad32c1a3328081097a181875733fa51f402083", + "url": "https://api.github.com/repos/laravel/tinker/zipball/c808a7227f97ecfd9219fbf913bad842ea854ddc", + "reference": "c808a7227f97ecfd9219fbf913bad842ea854ddc", "shasum": "" }, "require": { @@ -2897,7 +3378,69 @@ "laravel", "psysh" ], - "time": "2021-03-02T16:53:12+00:00" + "support": { + "issues": "https://github.com/laravel/tinker/issues", + "source": "https://github.com/laravel/tinker/tree/v2.6.2" + }, + "time": "2021-09-28T15:47:34+00:00" + }, + { + "name": "laravel/ui", + "version": "v3.3.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/ui.git", + "reference": "07d725813350c695c779382cbd6dac0ab8665537" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/ui/zipball/07d725813350c695c779382cbd6dac0ab8665537", + "reference": "07d725813350c695c779382cbd6dac0ab8665537", + "shasum": "" + }, + "require": { + "illuminate/console": "^8.42", + "illuminate/filesystem": "^8.42", + "illuminate/support": "^8.42", + "illuminate/validation": "^8.42", + "php": "^7.3|^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Ui\\UiServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Ui\\": "src/", + "Illuminate\\Foundation\\Auth\\": "auth-backend/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Laravel UI utilities and presets.", + "keywords": [ + "laravel", + "ui" + ], + "support": { + "source": "https://github.com/laravel/ui/tree/v3.3.0" + }, + "time": "2021-05-25T16:45:33+00:00" }, { "name": "laravelcollective/html", @@ -2972,17 +3515,71 @@ "time": "2020-12-15T20:20:05+00:00" }, { - "name": "lcobucci/jwt", - "version": "3.4.5", + "name": "lcobucci/clock", + "version": "1.2.0", "source": { "type": "git", - "url": "https://github.com/lcobucci/jwt.git", - "reference": "511629a54465e89a31d3d7e4cf0935feab8b14c1" + "url": "https://github.com/lcobucci/clock.git", + "reference": "13fda71158032b805cb9c8c7544e6c99019dc267" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lcobucci/jwt/zipball/511629a54465e89a31d3d7e4cf0935feab8b14c1", - "reference": "511629a54465e89a31d3d7e4cf0935feab8b14c1", + "url": "https://api.github.com/repos/lcobucci/clock/zipball/13fda71158032b805cb9c8c7544e6c99019dc267", + "reference": "13fda71158032b805cb9c8c7544e6c99019dc267", + "shasum": "" + }, + "require": { + "php": "^7.2" + }, + "require-dev": { + "infection/infection": "^0.10", + "lcobucci/coding-standard": "^1.0", + "phpstan/phpstan": "^0.10", + "phpstan/phpstan-deprecation-rules": "^0.10", + "phpstan/phpstan-phpunit": "^0.10", + "phpstan/phpstan-strict-rules": "^0.10", + "phpunit/phpunit": "^7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "Lcobucci\\Clock\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Luís Cobucci", + "email": "lcobucci@gmail.com" + } + ], + "description": "Yet another clock abstraction", + "support": { + "issues": "https://github.com/lcobucci/clock/issues", + "source": "https://github.com/lcobucci/clock/tree/master" + }, + "time": "2018-08-12T16:47:48+00:00" + }, + { + "name": "lcobucci/jwt", + "version": "3.4.6", + "source": { + "type": "git", + "url": "https://github.com/lcobucci/jwt.git", + "reference": "3ef8657a78278dfeae7707d51747251db4176240" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/lcobucci/jwt/zipball/3ef8657a78278dfeae7707d51747251db4176240", + "reference": "3ef8657a78278dfeae7707d51747251db4176240", "shasum": "" }, "require": { @@ -3032,6 +3629,10 @@ "JWS", "jwt" ], + "support": { + "issues": "https://github.com/lcobucci/jwt/issues", + "source": "https://github.com/lcobucci/jwt/tree/3.4.6" + }, "funding": [ { "url": "https://github.com/lcobucci", @@ -3042,20 +3643,20 @@ "type": "patreon" } ], - "time": "2021-02-16T09:40:01+00:00" + "time": "2021-09-28T19:18:28+00:00" }, { "name": "league/commonmark", - "version": "1.5.8", + "version": "1.6.6", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "08fa59b8e4e34ea8a773d55139ae9ac0e0aecbaf" + "reference": "c4228d11e30d7493c6836d20872f9582d8ba6dcf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/08fa59b8e4e34ea8a773d55139ae9ac0e0aecbaf", - "reference": "08fa59b8e4e34ea8a773d55139ae9ac0e0aecbaf", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/c4228d11e30d7493c6836d20872f9582d8ba6dcf", + "reference": "c4228d11e30d7493c6836d20872f9582d8ba6dcf", "shasum": "" }, "require": { @@ -3073,7 +3674,7 @@ "github/gfm": "0.29.0", "michelf/php-markdown": "~1.4", "mikehaertl/php-shellcommand": "^1.4", - "phpstan/phpstan": "^0.12", + "phpstan/phpstan": "^0.12.90", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.2", "scrutinizer/ocular": "^1.5", "symfony/finder": "^4.2" @@ -3111,6 +3712,12 @@ "md", "parser" ], + "support": { + "docs": "https://commonmark.thephpleague.com/", + "issues": "https://github.com/thephpleague/commonmark/issues", + "rss": "https://github.com/thephpleague/commonmark/releases.atom", + "source": "https://github.com/thephpleague/commonmark" + }, "funding": [ { "url": "https://enjoy.gitstore.app/repositories/thephpleague/commonmark", @@ -3137,26 +3744,26 @@ "type": "tidelift" } ], - "time": "2021-03-28T18:51:39+00:00" + "time": "2021-07-17T17:13:23+00:00" }, { "name": "league/csv", - "version": "9.6.2", + "version": "9.7.1", "source": { "type": "git", "url": "https://github.com/thephpleague/csv.git", - "reference": "f28da6e483bf979bac10e2add384c90ae9983e4e" + "reference": "0ec57e8264ec92565974ead0d1724cf1026e10c1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/csv/zipball/f28da6e483bf979bac10e2add384c90ae9983e4e", - "reference": "f28da6e483bf979bac10e2add384c90ae9983e4e", + "url": "https://api.github.com/repos/thephpleague/csv/zipball/0ec57e8264ec92565974ead0d1724cf1026e10c1", + "reference": "0ec57e8264ec92565974ead0d1724cf1026e10c1", "shasum": "" }, "require": { "ext-json": "*", "ext-mbstring": "*", - "php": ">=7.2.5" + "php": "^7.3 || ^8.0" }, "require-dev": { "ext-curl": "*", @@ -3165,7 +3772,7 @@ "phpstan/phpstan": "^0.12.0", "phpstan/phpstan-phpunit": "^0.12.0", "phpstan/phpstan-strict-rules": "^0.12.0", - "phpunit/phpunit": "^8.5" + "phpunit/phpunit": "^9.5" }, "suggest": { "ext-dom": "Required to use the XMLConverter and or the HTMLConverter classes", @@ -3221,7 +3828,7 @@ "type": "github" } ], - "time": "2020-12-10T19:40:30+00:00" + "time": "2021-04-17T16:32:08+00:00" }, { "name": "league/event", @@ -3279,16 +3886,16 @@ }, { "name": "league/flysystem", - "version": "1.1.3", + "version": "1.1.5", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "9be3b16c877d477357c015cec057548cf9b2a14a" + "reference": "18634df356bfd4119fe3d6156bdb990c414c14ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/9be3b16c877d477357c015cec057548cf9b2a14a", - "reference": "9be3b16c877d477357c015cec057548cf9b2a14a", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/18634df356bfd4119fe3d6156bdb990c414c14ea", + "reference": "18634df356bfd4119fe3d6156bdb990c414c14ea", "shasum": "" }, "require": { @@ -3304,7 +3911,6 @@ "phpunit/phpunit": "^8.5.8" }, "suggest": { - "ext-fileinfo": "Required for MimeType", "ext-ftp": "Allows you to use FTP server storage", "ext-openssl": "Allows you to use FTPS server storage", "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", @@ -3362,7 +3968,7 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/1.x" + "source": "https://github.com/thephpleague/flysystem/tree/1.1.5" }, "funding": [ { @@ -3370,7 +3976,7 @@ "type": "other" } ], - "time": "2020-08-23T07:39:11+00:00" + "time": "2021-08-17T13:49:42+00:00" }, { "name": "league/flysystem-aws-s3-v3", @@ -3476,16 +4082,16 @@ }, { "name": "league/mime-type-detection", - "version": "1.7.0", + "version": "1.8.0", "source": { "type": "git", "url": "https://github.com/thephpleague/mime-type-detection.git", - "reference": "3b9dff8aaf7323590c1d2e443db701eb1f9aa0d3" + "reference": "b38b25d7b372e9fddb00335400467b223349fd7e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/3b9dff8aaf7323590c1d2e443db701eb1f9aa0d3", - "reference": "3b9dff8aaf7323590c1d2e443db701eb1f9aa0d3", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/b38b25d7b372e9fddb00335400467b223349fd7e", + "reference": "b38b25d7b372e9fddb00335400467b223349fd7e", "shasum": "" }, "require": { @@ -3516,7 +4122,7 @@ "description": "Mime-type detection for Flysystem", "support": { "issues": "https://github.com/thephpleague/mime-type-detection/issues", - "source": "https://github.com/thephpleague/mime-type-detection/tree/1.7.0" + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.8.0" }, "funding": [ { @@ -3528,20 +4134,20 @@ "type": "tidelift" } ], - "time": "2021-01-18T20:58:21+00:00" + "time": "2021-09-25T08:23:19+00:00" }, { "name": "league/oauth2-server", - "version": "8.2.4", + "version": "8.3.2", "source": { "type": "git", "url": "https://github.com/thephpleague/oauth2-server.git", - "reference": "622eaa1f28eb4a2dea0cfc7e4f5280fac794e83c" + "reference": "0809487d33dd8a2c8c8c04e4a599ba4aadba1ae6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/oauth2-server/zipball/622eaa1f28eb4a2dea0cfc7e4f5280fac794e83c", - "reference": "622eaa1f28eb4a2dea0cfc7e4f5280fac794e83c", + "url": "https://api.github.com/repos/thephpleague/oauth2-server/zipball/0809487d33dd8a2c8c8c04e4a599ba4aadba1ae6", + "reference": "0809487d33dd8a2c8c8c04e4a599ba4aadba1ae6", "shasum": "" }, "require": { @@ -3607,7 +4213,7 @@ ], "support": { "issues": "https://github.com/thephpleague/oauth2-server/issues", - "source": "https://github.com/thephpleague/oauth2-server/tree/8.2.4" + "source": "https://github.com/thephpleague/oauth2-server/tree/8.3.2" }, "funding": [ { @@ -3615,40 +4221,55 @@ "type": "github" } ], - "time": "2020-12-10T11:35:44+00:00" + "time": "2021-07-27T08:17:08+00:00" }, { - "name": "masterminds/html5", - "version": "2.7.4", + "name": "livewire/livewire", + "version": "v2.6.7", "source": { "type": "git", - "url": "https://github.com/Masterminds/html5-php.git", - "reference": "9227822783c75406cfe400984b2f095cdf03d417" + "url": "https://github.com/livewire/livewire.git", + "reference": "7e8ded3cc496858b0a35c1c9355e5af79985bd0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/9227822783c75406cfe400984b2f095cdf03d417", - "reference": "9227822783c75406cfe400984b2f095cdf03d417", + "url": "https://api.github.com/repos/livewire/livewire/zipball/7e8ded3cc496858b0a35c1c9355e5af79985bd0c", + "reference": "7e8ded3cc496858b0a35c1c9355e5af79985bd0c", "shasum": "" }, "require": { - "ext-ctype": "*", - "ext-dom": "*", - "ext-libxml": "*", - "php": ">=5.3.0" + "illuminate/database": "^7.0|^8.0", + "illuminate/support": "^7.0|^8.0", + "illuminate/validation": "^7.0|^8.0", + "php": "^7.2.5|^8.0", + "symfony/http-kernel": "^5.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35" + "calebporzio/sushi": "^2.1", + "laravel/framework": "^7.0|^8.0", + "mockery/mockery": "^1.3.1", + "orchestra/testbench": "^5.0|^6.0", + "orchestra/testbench-dusk": "^5.2|^6.0", + "phpunit/phpunit": "^8.4|^9.0", + "psy/psysh": "@stable" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "2.7-dev" + "laravel": { + "providers": [ + "Livewire\\LivewireServiceProvider" + ], + "aliases": { + "Livewire": "Livewire\\Livewire" + } } }, "autoload": { + "files": [ + "src/helpers.php" + ], "psr-4": { - "Masterminds\\": "src" + "Livewire\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3657,47 +4278,353 @@ ], "authors": [ { - "name": "Matt Butcher", - "email": "technosophos@gmail.com" - }, - { - "name": "Matt Farina", - "email": "matt@mattfarina.com" - }, - { - "name": "Asmir Mustafic", - "email": "goetas@gmail.com" + "name": "Caleb Porzio", + "email": "calebporzio@gmail.com" } ], - "description": "An HTML5 parser and serializer.", - "homepage": "http://masterminds.github.io/html5-php", - "keywords": [ - "HTML5", - "dom", - "html", - "parser", - "querypath", - "serializer", - "xml" - ], + "description": "A front-end framework for Laravel.", "support": { - "issues": "https://github.com/Masterminds/html5-php/issues", - "source": "https://github.com/Masterminds/html5-php/tree/2.7.4" + "issues": "https://github.com/livewire/livewire/issues", + "source": "https://github.com/livewire/livewire/tree/v2.6.7" }, - "time": "2020-10-01T13:52:52+00:00" + "funding": [ + { + "url": "https://github.com/calebporzio", + "type": "github" + } + ], + "time": "2021-09-25T22:50:47+00:00" }, { - "name": "maximebf/debugbar", - "version": "v1.16.5", + "name": "maatwebsite/excel", + "version": "3.1.33", "source": { "type": "git", - "url": "https://github.com/maximebf/php-debugbar.git", - "reference": "6d51ee9e94cff14412783785e79a4e7ef97b9d62" + "url": "https://github.com/Maatwebsite/Laravel-Excel.git", + "reference": "b2de5ba92c5c1ad9415f0eb7c72838fb3eaaa5b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/6d51ee9e94cff14412783785e79a4e7ef97b9d62", - "reference": "6d51ee9e94cff14412783785e79a4e7ef97b9d62", + "url": "https://api.github.com/repos/Maatwebsite/Laravel-Excel/zipball/b2de5ba92c5c1ad9415f0eb7c72838fb3eaaa5b8", + "reference": "b2de5ba92c5c1ad9415f0eb7c72838fb3eaaa5b8", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/support": "5.8.*|^6.0|^7.0|^8.0", + "php": "^7.0|^8.0", + "phpoffice/phpspreadsheet": "^1.18" + }, + "require-dev": { + "orchestra/testbench": "^6.0", + "predis/predis": "^1.1" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Maatwebsite\\Excel\\ExcelServiceProvider" + ], + "aliases": { + "Excel": "Maatwebsite\\Excel\\Facades\\Excel" + } + } + }, + "autoload": { + "psr-4": { + "Maatwebsite\\Excel\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Patrick Brouwers", + "email": "patrick@maatwebsite.nl" + } + ], + "description": "Supercharged Excel exports and imports in Laravel", + "keywords": [ + "PHPExcel", + "batch", + "csv", + "excel", + "export", + "import", + "laravel", + "php", + "phpspreadsheet" + ], + "support": { + "issues": "https://github.com/Maatwebsite/Laravel-Excel/issues", + "source": "https://github.com/Maatwebsite/Laravel-Excel/tree/3.1.33" + }, + "funding": [ + { + "url": "https://laravel-excel.com/commercial-support", + "type": "custom" + }, + { + "url": "https://github.com/patrickbrouwers", + "type": "github" + } + ], + "time": "2021-08-12T15:52:25+00:00" + }, + { + "name": "maennchen/zipstream-php", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/maennchen/ZipStream-PHP.git", + "reference": "c4c5803cc1f93df3d2448478ef79394a5981cc58" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/c4c5803cc1f93df3d2448478ef79394a5981cc58", + "reference": "c4c5803cc1f93df3d2448478ef79394a5981cc58", + "shasum": "" + }, + "require": { + "myclabs/php-enum": "^1.5", + "php": ">= 7.1", + "psr/http-message": "^1.0", + "symfony/polyfill-mbstring": "^1.0" + }, + "require-dev": { + "ext-zip": "*", + "guzzlehttp/guzzle": ">= 6.3", + "mikey179/vfsstream": "^1.6", + "phpunit/phpunit": ">= 7.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZipStream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paul Duncan", + "email": "pabs@pablotron.org" + }, + { + "name": "Jonatan Männchen", + "email": "jonatan@maennchen.ch" + }, + { + "name": "Jesse Donat", + "email": "donatj@gmail.com" + }, + { + "name": "András Kolesár", + "email": "kolesar@kolesar.hu" + } + ], + "description": "ZipStream is a library for dynamically streaming dynamic zip files from PHP without writing to the disk at all on the server.", + "keywords": [ + "stream", + "zip" + ], + "support": { + "issues": "https://github.com/maennchen/ZipStream-PHP/issues", + "source": "https://github.com/maennchen/ZipStream-PHP/tree/master" + }, + "funding": [ + { + "url": "https://opencollective.com/zipstream", + "type": "open_collective" + } + ], + "time": "2020-05-30T13:11:16+00:00" + }, + { + "name": "markbaker/complex", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/MarkBaker/PHPComplex.git", + "reference": "6f724d7e04606fd8adaa4e3bb381c3e9db09c946" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/6f724d7e04606fd8adaa4e3bb381c3e9db09c946", + "reference": "6f724d7e04606fd8adaa4e3bb381c3e9db09c946", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "phpcompatibility/php-compatibility": "^9.0", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.3", + "squizlabs/php_codesniffer": "^3.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Complex\\": "classes/src/" + }, + "files": [ + "classes/src/functions/abs.php", + "classes/src/functions/acos.php", + "classes/src/functions/acosh.php", + "classes/src/functions/acot.php", + "classes/src/functions/acoth.php", + "classes/src/functions/acsc.php", + "classes/src/functions/acsch.php", + "classes/src/functions/argument.php", + "classes/src/functions/asec.php", + "classes/src/functions/asech.php", + "classes/src/functions/asin.php", + "classes/src/functions/asinh.php", + "classes/src/functions/atan.php", + "classes/src/functions/atanh.php", + "classes/src/functions/conjugate.php", + "classes/src/functions/cos.php", + "classes/src/functions/cosh.php", + "classes/src/functions/cot.php", + "classes/src/functions/coth.php", + "classes/src/functions/csc.php", + "classes/src/functions/csch.php", + "classes/src/functions/exp.php", + "classes/src/functions/inverse.php", + "classes/src/functions/ln.php", + "classes/src/functions/log2.php", + "classes/src/functions/log10.php", + "classes/src/functions/negative.php", + "classes/src/functions/pow.php", + "classes/src/functions/rho.php", + "classes/src/functions/sec.php", + "classes/src/functions/sech.php", + "classes/src/functions/sin.php", + "classes/src/functions/sinh.php", + "classes/src/functions/sqrt.php", + "classes/src/functions/tan.php", + "classes/src/functions/tanh.php", + "classes/src/functions/theta.php", + "classes/src/operations/add.php", + "classes/src/operations/subtract.php", + "classes/src/operations/multiply.php", + "classes/src/operations/divideby.php", + "classes/src/operations/divideinto.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Baker", + "email": "mark@lange.demon.co.uk" + } + ], + "description": "PHP Class for working with complex numbers", + "homepage": "https://github.com/MarkBaker/PHPComplex", + "keywords": [ + "complex", + "mathematics" + ], + "support": { + "issues": "https://github.com/MarkBaker/PHPComplex/issues", + "source": "https://github.com/MarkBaker/PHPComplex/tree/2.0.3" + }, + "time": "2021-06-02T09:44:11+00:00" + }, + { + "name": "markbaker/matrix", + "version": "2.1.3", + "source": { + "type": "git", + "url": "https://github.com/MarkBaker/PHPMatrix.git", + "reference": "174395a901b5ba0925f1d790fa91bab531074b61" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/174395a901b5ba0925f1d790fa91bab531074b61", + "reference": "174395a901b5ba0925f1d790fa91bab531074b61", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "phpcompatibility/php-compatibility": "^9.0", + "phpdocumentor/phpdocumentor": "2.*", + "phploc/phploc": "^4.0", + "phpmd/phpmd": "2.*", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.3", + "sebastian/phpcpd": "^4.0", + "squizlabs/php_codesniffer": "^3.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Matrix\\": "classes/src/" + }, + "files": [ + "classes/src/Functions/adjoint.php", + "classes/src/Functions/antidiagonal.php", + "classes/src/Functions/cofactors.php", + "classes/src/Functions/determinant.php", + "classes/src/Functions/diagonal.php", + "classes/src/Functions/identity.php", + "classes/src/Functions/inverse.php", + "classes/src/Functions/minors.php", + "classes/src/Functions/trace.php", + "classes/src/Functions/transpose.php", + "classes/src/Operations/add.php", + "classes/src/Operations/directsum.php", + "classes/src/Operations/subtract.php", + "classes/src/Operations/multiply.php", + "classes/src/Operations/divideby.php", + "classes/src/Operations/divideinto.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Baker", + "email": "mark@demon-angel.eu" + } + ], + "description": "PHP Class for working with matrices", + "homepage": "https://github.com/MarkBaker/PHPMatrix", + "keywords": [ + "mathematics", + "matrix", + "vector" + ], + "support": { + "issues": "https://github.com/MarkBaker/PHPMatrix/issues", + "source": "https://github.com/MarkBaker/PHPMatrix/tree/2.1.3" + }, + "time": "2021-05-25T15:42:17+00:00" + }, + { + "name": "maximebf/debugbar", + "version": "v1.17.1", + "source": { + "type": "git", + "url": "https://github.com/maximebf/php-debugbar.git", + "reference": "0a3532556be0145603f8a9de23e76dc28eed7054" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/0a3532556be0145603f8a9de23e76dc28eed7054", + "reference": "0a3532556be0145603f8a9de23e76dc28eed7054", "shasum": "" }, "require": { @@ -3716,7 +4643,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.16-dev" + "dev-master": "1.17-dev" } }, "autoload": { @@ -3747,30 +4674,93 @@ ], "support": { "issues": "https://github.com/maximebf/php-debugbar/issues", - "source": "https://github.com/maximebf/php-debugbar/tree/v1.16.5" + "source": "https://github.com/maximebf/php-debugbar/tree/v1.17.1" }, - "time": "2020-12-07T11:07:24+00:00" + "time": "2021-08-01T09:19:02+00:00" }, { - "name": "monolog/monolog", - "version": "2.2.0", + "name": "mediconesystems/livewire-datatables", + "version": "v0.4.3", "source": { "type": "git", - "url": "https://github.com/Seldaek/monolog.git", - "reference": "1cb1cde8e8dd0f70cc0fe51354a59acad9302084" + "url": "https://github.com/MedicOneSystems/livewire-datatables.git", + "reference": "b0f3b3b9ee801d6870de898436090b27b2bc19c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/1cb1cde8e8dd0f70cc0fe51354a59acad9302084", - "reference": "1cb1cde8e8dd0f70cc0fe51354a59acad9302084", + "url": "https://api.github.com/repos/MedicOneSystems/livewire-datatables/zipball/b0f3b3b9ee801d6870de898436090b27b2bc19c0", + "reference": "b0f3b3b9ee801d6870de898436090b27b2bc19c0", + "shasum": "" + }, + "require": { + "illuminate/support": "^7.0|^8.0", + "livewire/livewire": "^1.2|^2.0", + "maatwebsite/excel": "^3.1", + "php": "^7.2.5" + }, + "require-dev": { + "laravel/legacy-factories": "^1.0.4", + "orchestra/testbench": "^4.0|5.0|6.0", + "phpunit/phpunit": "^8.0|9.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Mediconesystems\\LivewireDatatables\\LivewireDatatablesServiceProvider" + ], + "aliases": { + "LivewireDatatables": "Mediconesystems\\LivewireDatatables\\LivewireDatatablesFacade" + } + } + }, + "autoload": { + "psr-4": { + "Mediconesystems\\LivewireDatatables\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Salmon", + "email": "mark.salmon@mediconesystems.com", + "role": "Developer" + } + ], + "homepage": "https://github.com/mediconesystems/livewire-datatables", + "keywords": [ + "livewire-datatables", + "mediconesystems" + ], + "support": { + "issues": "https://github.com/MedicOneSystems/livewire-datatables/issues", + "source": "https://github.com/MedicOneSystems/livewire-datatables/tree/v0.4.3" + }, + "time": "2020-11-16T12:02:40+00:00" + }, + { + "name": "monolog/monolog", + "version": "2.3.4", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "437e7a1c50044b92773b361af77620efb76fff59" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/437e7a1c50044b92773b361af77620efb76fff59", + "reference": "437e7a1c50044b92773b361af77620efb76fff59", "shasum": "" }, "require": { "php": ">=7.2", - "psr/log": "^1.0.1" + "psr/log": "^1.0.1 || ^2.0 || ^3.0" }, "provide": { - "psr/log-implementation": "1.0.0" + "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" }, "require-dev": { "aws/aws-sdk-php": "^2.4.9 || ^3.0", @@ -3781,11 +4771,11 @@ "php-amqplib/php-amqplib": "~2.4", "php-console/php-console": "^3.1.3", "phpspec/prophecy": "^1.6.1", - "phpstan/phpstan": "^0.12.59", + "phpstan/phpstan": "^0.12.91", "phpunit/phpunit": "^8.5", "predis/predis": "^1.1", "rollbar/rollbar": "^1.3", - "ruflin/elastica": ">=0.90 <7.0.1", + "ruflin/elastica": ">=0.90@dev", "swiftmailer/swiftmailer": "^5.3|^6.0" }, "suggest": { @@ -3793,8 +4783,11 @@ "doctrine/couchdb": "Allow sending log messages to a CouchDB server", "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", "ext-mbstring": "Allow to work properly with unicode symbols", "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", @@ -3833,7 +4826,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/2.2.0" + "source": "https://github.com/Seldaek/monolog/tree/2.3.4" }, "funding": [ { @@ -3845,20 +4838,20 @@ "type": "tidelift" } ], - "time": "2020-12-14T13:15:25+00:00" + "time": "2021-09-15T11:27:21+00:00" }, { "name": "mtdowling/jmespath.php", - "version": "2.6.0", + "version": "2.6.1", "source": { "type": "git", "url": "https://github.com/jmespath/jmespath.php.git", - "reference": "42dae2cbd13154083ca6d70099692fef8ca84bfb" + "reference": "9b87907a81b87bc76d19a7fb2d61e61486ee9edb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/42dae2cbd13154083ca6d70099692fef8ca84bfb", - "reference": "42dae2cbd13154083ca6d70099692fef8ca84bfb", + "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/9b87907a81b87bc76d19a7fb2d61e61486ee9edb", + "reference": "9b87907a81b87bc76d19a7fb2d61e61486ee9edb", "shasum": "" }, "require": { @@ -3866,7 +4859,7 @@ "symfony/polyfill-mbstring": "^1.17" }, "require-dev": { - "composer/xdebug-handler": "^1.4", + "composer/xdebug-handler": "^1.4 || ^2.0", "phpunit/phpunit": "^4.8.36 || ^7.5.15" }, "bin": [ @@ -3904,9 +4897,69 @@ ], "support": { "issues": "https://github.com/jmespath/jmespath.php/issues", - "source": "https://github.com/jmespath/jmespath.php/tree/2.6.0" + "source": "https://github.com/jmespath/jmespath.php/tree/2.6.1" }, - "time": "2020-07-31T21:01:56+00:00" + "time": "2021-06-14T00:11:39+00:00" + }, + { + "name": "myclabs/php-enum", + "version": "1.8.3", + "source": { + "type": "git", + "url": "https://github.com/myclabs/php-enum.git", + "reference": "b942d263c641ddb5190929ff840c68f78713e937" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/php-enum/zipball/b942d263c641ddb5190929ff840c68f78713e937", + "reference": "b942d263c641ddb5190929ff840c68f78713e937", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "1.*", + "vimeo/psalm": "^4.6.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "MyCLabs\\Enum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP Enum contributors", + "homepage": "https://github.com/myclabs/php-enum/graphs/contributors" + } + ], + "description": "PHP Enum implementation", + "homepage": "http://github.com/myclabs/php-enum", + "keywords": [ + "enum" + ], + "support": { + "issues": "https://github.com/myclabs/php-enum/issues", + "source": "https://github.com/myclabs/php-enum/tree/1.8.3" + }, + "funding": [ + { + "url": "https://github.com/mnapoli", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/php-enum", + "type": "tidelift" + } + ], + "time": "2021-07-05T08:18:36+00:00" }, { "name": "neitanod/forceutf8", @@ -3951,27 +5004,28 @@ }, { "name": "nesbot/carbon", - "version": "2.46.0", + "version": "2.53.1", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "2fd2c4a77d58a4e95234c8a61c5df1f157a91bf4" + "reference": "f4655858a784988f880c1b8c7feabbf02dfdf045" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/2fd2c4a77d58a4e95234c8a61c5df1f157a91bf4", - "reference": "2fd2c4a77d58a4e95234c8a61c5df1f157a91bf4", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/f4655858a784988f880c1b8c7feabbf02dfdf045", + "reference": "f4655858a784988f880c1b8c7feabbf02dfdf045", "shasum": "" }, "require": { "ext-json": "*", "php": "^7.1.8 || ^8.0", "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", "symfony/translation": "^3.4 || ^4.0 || ^5.0" }, "require-dev": { "doctrine/orm": "^2.7", - "friendsofphp/php-cs-fixer": "^2.14 || ^3.0", + "friendsofphp/php-cs-fixer": "^3.0", "kylekatarnls/multi-tester": "^2.0", "phpmd/phpmd": "^2.9", "phpstan/extension-installer": "^1.0", @@ -3985,8 +5039,8 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.x-dev", - "dev-3.x": "3.x-dev" + "dev-3.x": "3.x-dev", + "dev-master": "2.x-dev" }, "laravel": { "providers": [ @@ -4012,20 +5066,24 @@ { "name": "Brian Nesbitt", "email": "brian@nesbot.com", - "homepage": "http://nesbot.com" + "homepage": "https://markido.com" }, { "name": "kylekatarnls", - "homepage": "http://github.com/kylekatarnls" + "homepage": "https://github.com/kylekatarnls" } ], "description": "An API extension for DateTime that supports 281 different languages.", - "homepage": "http://carbon.nesbot.com", + "homepage": "https://carbon.nesbot.com", "keywords": [ "date", "datetime", "time" ], + "support": { + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" + }, "funding": [ { "url": "https://opencollective.com/Carbon", @@ -4036,20 +5094,20 @@ "type": "tidelift" } ], - "time": "2021-02-24T17:30:44+00:00" + "time": "2021-09-06T09:29:23+00:00" }, { "name": "nikic/php-parser", - "version": "v4.10.4", + "version": "v4.13.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "c6d052fc58cb876152f89f532b95a8d7907e7f0e" + "reference": "50953a2691a922aa1769461637869a0a2faa3f53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/c6d052fc58cb876152f89f532b95a8d7907e7f0e", - "reference": "c6d052fc58cb876152f89f532b95a8d7907e7f0e", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/50953a2691a922aa1769461637869a0a2faa3f53", + "reference": "50953a2691a922aa1769461637869a0a2faa3f53", "shasum": "" }, "require": { @@ -4090,33 +5148,40 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.10.4" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.13.0" }, - "time": "2020-12-20T10:01:03+00:00" + "time": "2021-09-20T12:20:58+00:00" }, { "name": "nunomaduro/collision", - "version": "v3.2.0", + "version": "v5.10.0", "source": { "type": "git", "url": "https://github.com/nunomaduro/collision.git", - "reference": "f7c45764dfe4ba5f2618d265a6f1f9c72732e01d" + "reference": "3004cfa49c022183395eabc6d0e5207dfe498d00" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/f7c45764dfe4ba5f2618d265a6f1f9c72732e01d", - "reference": "f7c45764dfe4ba5f2618d265a6f1f9c72732e01d", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/3004cfa49c022183395eabc6d0e5207dfe498d00", + "reference": "3004cfa49c022183395eabc6d0e5207dfe498d00", "shasum": "" }, "require": { - "filp/whoops": "^2.1.4", - "php": "^7.2.5 || ^8.0", - "php-parallel-lint/php-console-highlighter": "0.5.*", - "symfony/console": "~2.8|~3.3|~4.0" + "facade/ignition-contracts": "^1.0", + "filp/whoops": "^2.14.3", + "php": "^7.3 || ^8.0", + "symfony/console": "^5.0" }, "require-dev": { - "laravel/framework": "^6.0", - "phpunit/phpunit": "^8.0 || ^9.0" + "brianium/paratest": "^6.1", + "fideloper/proxy": "^4.4.1", + "fruitcake/laravel-cors": "^2.0.3", + "laravel/framework": "8.x-dev", + "nunomaduro/larastan": "^0.6.2", + "nunomaduro/mock-final-classes": "^1.0", + "orchestra/testbench": "^6.0", + "phpstan/phpstan": "^0.12.64", + "phpunit/phpunit": "^9.5.0" }, "type": "library", "extra": { @@ -4172,20 +5237,20 @@ "type": "patreon" } ], - "time": "2021-02-11T09:01:42+00:00" + "time": "2021-09-20T15:06:32+00:00" }, { "name": "nyholm/psr7", - "version": "1.4.0", + "version": "1.4.1", "source": { "type": "git", "url": "https://github.com/Nyholm/psr7.git", - "reference": "23ae1f00fbc6a886cbe3062ca682391b9cc7c37b" + "reference": "2212385b47153ea71b1c1b1374f8cb5e4f7892ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Nyholm/psr7/zipball/23ae1f00fbc6a886cbe3062ca682391b9cc7c37b", - "reference": "23ae1f00fbc6a886cbe3062ca682391b9cc7c37b", + "url": "https://api.github.com/repos/Nyholm/psr7/zipball/2212385b47153ea71b1c1b1374f8cb5e4f7892ec", + "reference": "2212385b47153ea71b1c1b1374f8cb5e4f7892ec", "shasum": "" }, "require": { @@ -4199,7 +5264,7 @@ "psr/http-message-implementation": "1.0" }, "require-dev": { - "http-interop/http-factory-tests": "^0.8", + "http-interop/http-factory-tests": "^0.9", "php-http/psr7-integration-tests": "^1.0", "phpunit/phpunit": "^7.5 || 8.5 || 9.4", "symfony/error-handler": "^4.4" @@ -4235,6 +5300,10 @@ "psr-17", "psr-7" ], + "support": { + "issues": "https://github.com/Nyholm/psr7/issues", + "source": "https://github.com/Nyholm/psr7/tree/1.4.1" + }, "funding": [ { "url": "https://github.com/Zegnat", @@ -4245,7 +5314,7 @@ "type": "github" } ], - "time": "2021-02-18T15:41:32+00:00" + "time": "2021-07-02T08:32:20+00:00" }, { "name": "onelogin/php-saml", @@ -4295,20 +5364,25 @@ "onelogin", "saml" ], + "support": { + "email": "sixto.garcia@onelogin.com", + "issues": "https://github.com/onelogin/php-saml/issues", + "source": "https://github.com/onelogin/php-saml/" + }, "time": "2021-03-02T10:13:07+00:00" }, { "name": "opis/closure", - "version": "3.6.1", + "version": "3.6.2", "source": { "type": "git", "url": "https://github.com/opis/closure.git", - "reference": "943b5d70cc5ae7483f6aff6ff43d7e34592ca0f5" + "reference": "06e2ebd25f2869e54a306dda991f7db58066f7f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/opis/closure/zipball/943b5d70cc5ae7483f6aff6ff43d7e34592ca0f5", - "reference": "943b5d70cc5ae7483f6aff6ff43d7e34592ca0f5", + "url": "https://api.github.com/repos/opis/closure/zipball/06e2ebd25f2869e54a306dda991f7db58066f7f6", + "reference": "06e2ebd25f2869e54a306dda991f7db58066f7f6", "shasum": "" }, "require": { @@ -4358,9 +5432,9 @@ ], "support": { "issues": "https://github.com/opis/closure/issues", - "source": "https://github.com/opis/closure/tree/3.6.1" + "source": "https://github.com/opis/closure/tree/3.6.2" }, - "time": "2020-11-07T02:01:34+00:00" + "time": "2021-04-09T13:42:10+00:00" }, { "name": "paragonie/constant_time_encoding", @@ -4431,20 +5505,20 @@ }, { "name": "paragonie/random_compat", - "version": "v9.99.99", + "version": "v9.99.100", "source": { "type": "git", "url": "https://github.com/paragonie/random_compat.git", - "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95" + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", - "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a", "shasum": "" }, "require": { - "php": "^7" + "php": ">= 7" }, "require-dev": { "phpunit/phpunit": "4.*|5.*", @@ -4477,7 +5551,7 @@ "issues": "https://github.com/paragonie/random_compat/issues", "source": "https://github.com/paragonie/random_compat" }, - "time": "2018-07-02T15:55:56+00:00" + "time": "2020-10-15T08:29:30+00:00" }, { "name": "patchwork/utf8", @@ -4610,108 +5684,6 @@ }, "time": "2015-12-19T14:08:53+00:00" }, - { - "name": "php-parallel-lint/php-console-color", - "version": "v0.3", - "source": { - "type": "git", - "url": "https://github.com/php-parallel-lint/PHP-Console-Color.git", - "reference": "b6af326b2088f1ad3b264696c9fd590ec395b49e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-parallel-lint/PHP-Console-Color/zipball/b6af326b2088f1ad3b264696c9fd590ec395b49e", - "reference": "b6af326b2088f1ad3b264696c9fd590ec395b49e", - "shasum": "" - }, - "require": { - "php": ">=5.4.0" - }, - "replace": { - "jakub-onderka/php-console-color": "*" - }, - "require-dev": { - "php-parallel-lint/php-code-style": "1.0", - "php-parallel-lint/php-parallel-lint": "1.0", - "php-parallel-lint/php-var-dump-check": "0.*", - "phpunit/phpunit": "~4.3", - "squizlabs/php_codesniffer": "1.*" - }, - "type": "library", - "autoload": { - "psr-4": { - "JakubOnderka\\PhpConsoleColor\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-2-Clause" - ], - "authors": [ - { - "name": "Jakub Onderka", - "email": "jakub.onderka@gmail.com" - } - ], - "support": { - "issues": "https://github.com/php-parallel-lint/PHP-Console-Color/issues", - "source": "https://github.com/php-parallel-lint/PHP-Console-Color/tree/master" - }, - "time": "2020-05-14T05:47:14+00:00" - }, - { - "name": "php-parallel-lint/php-console-highlighter", - "version": "v0.5", - "source": { - "type": "git", - "url": "https://github.com/php-parallel-lint/PHP-Console-Highlighter.git", - "reference": "21bf002f077b177f056d8cb455c5ed573adfdbb8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-parallel-lint/PHP-Console-Highlighter/zipball/21bf002f077b177f056d8cb455c5ed573adfdbb8", - "reference": "21bf002f077b177f056d8cb455c5ed573adfdbb8", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": ">=5.4.0", - "php-parallel-lint/php-console-color": "~0.2" - }, - "replace": { - "jakub-onderka/php-console-highlighter": "*" - }, - "require-dev": { - "php-parallel-lint/php-code-style": "~1.0", - "php-parallel-lint/php-parallel-lint": "~1.0", - "php-parallel-lint/php-var-dump-check": "~0.1", - "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "~1.5" - }, - "type": "library", - "autoload": { - "psr-4": { - "JakubOnderka\\PhpConsoleHighlighter\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jakub Onderka", - "email": "acci@acci.cz", - "homepage": "http://www.acci.cz/" - } - ], - "description": "Highlight PHP code in terminal", - "support": { - "issues": "https://github.com/php-parallel-lint/PHP-Console-Highlighter/issues", - "source": "https://github.com/php-parallel-lint/PHP-Console-Highlighter/tree/master" - }, - "time": "2020-05-13T07:37:49+00:00" - }, { "name": "phpdocumentor/reflection-common", "version": "2.2.0", @@ -4823,16 +5795,16 @@ }, { "name": "phpdocumentor/type-resolver", - "version": "1.4.0", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0" + "reference": "30f38bffc6f24293dadd1823936372dfa9e86e2f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", - "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/30f38bffc6f24293dadd1823936372dfa9e86e2f", + "reference": "30f38bffc6f24293dadd1823936372dfa9e86e2f", "shasum": "" }, "require": { @@ -4840,7 +5812,8 @@ "phpdocumentor/reflection-common": "^2.0" }, "require-dev": { - "ext-tokenizer": "*" + "ext-tokenizer": "*", + "psalm/phar": "^4.8" }, "type": "library", "extra": { @@ -4866,35 +5839,139 @@ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "support": { "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.4.0" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.5.0" }, - "time": "2020-09-17T18:55:26+00:00" + "time": "2021-09-17T15:28:14+00:00" }, { - "name": "phpoption/phpoption", - "version": "1.7.5", + "name": "phpoffice/phpspreadsheet", + "version": "1.18.0", "source": { "type": "git", - "url": "https://github.com/schmittjoh/php-option.git", - "reference": "994ecccd8f3283ecf5ac33254543eb0ac946d525" + "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", + "reference": "418cd304e8e6b417ea79c3b29126a25dc4b1170c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/994ecccd8f3283ecf5ac33254543eb0ac946d525", - "reference": "994ecccd8f3283ecf5ac33254543eb0ac946d525", + "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/418cd304e8e6b417ea79c3b29126a25dc4b1170c", + "reference": "418cd304e8e6b417ea79c3b29126a25dc4b1170c", "shasum": "" }, "require": { - "php": "^5.5.9 || ^7.0 || ^8.0" + "ext-ctype": "*", + "ext-dom": "*", + "ext-fileinfo": "*", + "ext-gd": "*", + "ext-iconv": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-simplexml": "*", + "ext-xml": "*", + "ext-xmlreader": "*", + "ext-xmlwriter": "*", + "ext-zip": "*", + "ext-zlib": "*", + "ezyang/htmlpurifier": "^4.13", + "maennchen/zipstream-php": "^2.1", + "markbaker/complex": "^2.0", + "markbaker/matrix": "^2.0", + "php": "^7.2 || ^8.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/simple-cache": "^1.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "dev-master", + "dompdf/dompdf": "^1.0", + "friendsofphp/php-cs-fixer": "^2.18", + "jpgraph/jpgraph": "^4.0", + "mpdf/mpdf": "^8.0", + "phpcompatibility/php-compatibility": "^9.3", + "phpstan/phpstan": "^0.12.82", + "phpstan/phpstan-phpunit": "^0.12.18", + "phpunit/phpunit": "^8.5", + "squizlabs/php_codesniffer": "^3.5", + "tecnickcom/tcpdf": "^6.3" + }, + "suggest": { + "dompdf/dompdf": "Option for rendering PDF with PDF Writer (doesn't yet support PHP8)", + "jpgraph/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers", + "mpdf/mpdf": "Option for rendering PDF with PDF Writer", + "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer (doesn't yet support PHP8)" + }, + "type": "library", + "autoload": { + "psr-4": { + "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Maarten Balliauw", + "homepage": "https://blog.maartenballiauw.be" + }, + { + "name": "Mark Baker", + "homepage": "https://markbakeruk.net" + }, + { + "name": "Franck Lefevre", + "homepage": "https://rootslabs.net" + }, + { + "name": "Erik Tilt" + }, + { + "name": "Adrien Crivelli" + } + ], + "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine", + "homepage": "https://github.com/PHPOffice/PhpSpreadsheet", + "keywords": [ + "OpenXML", + "excel", + "gnumeric", + "ods", + "php", + "spreadsheet", + "xls", + "xlsx" + ], + "support": { + "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues", + "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.18.0" + }, + "time": "2021-05-31T18:21:15+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.8.0", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "5455cb38aed4523f99977c4a12ef19da4bfe2a28" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/5455cb38aed4523f99977c4a12ef19da4bfe2a28", + "reference": "5455cb38aed4523f99977c4a12ef19da4bfe2a28", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" }, "require-dev": { "bamarni/composer-bin-plugin": "^1.4.1", - "phpunit/phpunit": "^4.8.35 || ^5.7.27 || ^6.5.6 || ^7.0 || ^8.0 || ^9.0" + "phpunit/phpunit": "^6.5.14 || ^7.0.20 || ^8.5.19 || ^9.5.8" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.7-dev" + "dev-master": "1.8-dev" } }, "autoload": { @@ -4913,7 +5990,7 @@ }, { "name": "Graham Campbell", - "email": "graham@alt-three.com" + "email": "hello@gjcampbell.co.uk" } ], "description": "Option Type for PHP", @@ -4925,7 +6002,7 @@ ], "support": { "issues": "https://github.com/schmittjoh/php-option/issues", - "source": "https://github.com/schmittjoh/php-option/tree/1.7.5" + "source": "https://github.com/schmittjoh/php-option/tree/1.8.0" }, "funding": [ { @@ -4937,28 +6014,30 @@ "type": "tidelift" } ], - "time": "2020-07-20T17:29:33+00:00" + "time": "2021-08-28T21:27:29+00:00" }, { "name": "phpseclib/phpseclib", - "version": "2.0.31", + "version": "3.0.10", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "233a920cb38636a43b18d428f9a8db1f0a1a08f4" + "reference": "62fcc5a94ac83b1506f52d7558d828617fac9187" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/233a920cb38636a43b18d428f9a8db1f0a1a08f4", - "reference": "233a920cb38636a43b18d428f9a8db1f0a1a08f4", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/62fcc5a94ac83b1506f52d7558d828617fac9187", + "reference": "62fcc5a94ac83b1506f52d7558d828617fac9187", "shasum": "" }, "require": { - "php": ">=5.3.3" + "paragonie/constant_time_encoding": "^1|^2", + "paragonie/random_compat": "^1.4|^2.0|^9.99.99", + "php": ">=5.6.1" }, "require-dev": { "phing/phing": "~2.7", - "phpunit/phpunit": "^4.8.35|^5.7|^6.0|^9.4", + "phpunit/phpunit": "^5.7|^6.0|^9.4", "squizlabs/php_codesniffer": "~2.0" }, "suggest": { @@ -4973,7 +6052,7 @@ "phpseclib/bootstrap.php" ], "psr-4": { - "phpseclib\\": "phpseclib/" + "phpseclib3\\": "phpseclib/" } }, "notification-url": "https://packagist.org/downloads/", @@ -5028,6 +6107,10 @@ "x.509", "x509" ], + "support": { + "issues": "https://github.com/phpseclib/phpseclib/issues", + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.10" + }, "funding": [ { "url": "https://github.com/terrafrost", @@ -5042,37 +6125,37 @@ "type": "tidelift" } ], - "time": "2021-04-06T13:56:45+00:00" + "time": "2021-08-16T04:24:45+00:00" }, { "name": "phpspec/prophecy", - "version": "1.13.0", + "version": "1.14.0", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea" + "reference": "d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/be1996ed8adc35c3fd795488a653f4b518be70ea", - "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e", + "reference": "d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e", "shasum": "" }, "require": { "doctrine/instantiator": "^1.2", - "php": "^7.2 || ~8.0, <8.1", + "php": "^7.2 || ~8.0, <8.2", "phpdocumentor/reflection-docblock": "^5.2", "sebastian/comparator": "^3.0 || ^4.0", "sebastian/recursion-context": "^3.0 || ^4.0" }, "require-dev": { - "phpspec/phpspec": "^6.0", + "phpspec/phpspec": "^6.0 || ^7.0", "phpunit/phpunit": "^8.0 || ^9.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.11.x-dev" + "dev-master": "1.x-dev" } }, "autoload": { @@ -5105,7 +6188,11 @@ "spy", "stub" ], - "time": "2021-03-17T13:42:18+00:00" + "support": { + "issues": "https://github.com/phpspec/prophecy/issues", + "source": "https://github.com/phpspec/prophecy/tree/1.14.0" + }, + "time": "2021-09-10T09:02:12+00:00" }, { "name": "pragmarx/google2fa", @@ -5387,8 +6474,114 @@ "container-interop", "psr" ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.1" + }, "time": "2021-03-05T17:36:06+00:00" }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client/tree/master" + }, + "time": "2020-06-29T06:28:15+00:00" + }, { "name": "psr/http-factory", "version": "1.0.1", @@ -5499,16 +6692,16 @@ }, { "name": "psr/log", - "version": "1.1.3", + "version": "1.1.4", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", "shasum": "" }, "require": { @@ -5532,7 +6725,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for logging libraries", @@ -5543,9 +6736,9 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/1.1.3" + "source": "https://github.com/php-fig/log/tree/1.1.4" }, - "time": "2020-03-23T09:12:05+00:00" + "time": "2021-05-03T11:20:27+00:00" }, { "name": "psr/simple-cache", @@ -5600,20 +6793,19 @@ }, { "name": "psy/psysh", - "version": "v0.10.7", + "version": "v0.10.8", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "a395af46999a12006213c0c8346c9445eb31640c" + "reference": "e4573f47750dd6c92dca5aee543fa77513cbd8d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/a395af46999a12006213c0c8346c9445eb31640c", - "reference": "a395af46999a12006213c0c8346c9445eb31640c", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/e4573f47750dd6c92dca5aee543fa77513cbd8d3", + "reference": "e4573f47750dd6c92dca5aee543fa77513cbd8d3", "shasum": "" }, "require": { - "dnoegel/php-xdg-base-dir": "0.1.*", "ext-json": "*", "ext-tokenizer": "*", "nikic/php-parser": "~4.0|~3.0|~2.0|~1.3", @@ -5668,7 +6860,11 @@ "interactive", "shell" ], - "time": "2021-03-14T02:14:56+00:00" + "support": { + "issues": "https://github.com/bobthecow/psysh/issues", + "source": "https://github.com/bobthecow/psysh/tree/v0.10.8" + }, + "time": "2021-04-10T16:23:39+00:00" }, { "name": "ralouphie/getallheaders", @@ -5715,54 +6911,146 @@ "time": "2019-03-08T08:55:37+00:00" }, { - "name": "ramsey/uuid", - "version": "3.9.3", + "name": "ramsey/collection", + "version": "1.2.1", "source": { "type": "git", - "url": "https://github.com/ramsey/uuid.git", - "reference": "7e1633a6964b48589b142d60542f9ed31bd37a92" + "url": "https://github.com/ramsey/collection.git", + "reference": "eaca1dc1054ddd10cbd83c1461907bee6fb528fa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/7e1633a6964b48589b142d60542f9ed31bd37a92", - "reference": "7e1633a6964b48589b142d60542f9ed31bd37a92", + "url": "https://api.github.com/repos/ramsey/collection/zipball/eaca1dc1054ddd10cbd83c1461907bee6fb528fa", + "reference": "eaca1dc1054ddd10cbd83c1461907bee6fb528fa", "shasum": "" }, "require": { + "php": "^7.3 || ^8", + "symfony/polyfill-php81": "^1.23" + }, + "require-dev": { + "captainhook/captainhook": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "ergebnis/composer-normalize": "^2.6", + "fakerphp/faker": "^1.5", + "hamcrest/hamcrest-php": "^2", + "jangregor/phpstan-prophecy": "^0.8", + "mockery/mockery": "^1.3", + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/extension-installer": "^1", + "phpstan/phpstan": "^0.12.32", + "phpstan/phpstan-mockery": "^0.12.5", + "phpstan/phpstan-phpunit": "^0.12.11", + "phpunit/phpunit": "^8.5 || ^9", + "psy/psysh": "^0.10.4", + "slevomat/coding-standard": "^6.3", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/1.2.1" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", + "type": "tidelift" + } + ], + "time": "2021-08-06T03:41:06+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.2.3", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df", + "reference": "fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df", + "shasum": "" + }, + "require": { + "brick/math": "^0.8 || ^0.9", "ext-json": "*", - "paragonie/random_compat": "^1 | ^2 | 9.99.99", - "php": "^5.4 | ^7 | ^8", - "symfony/polyfill-ctype": "^1.8" + "php": "^7.2 || ^8.0", + "ramsey/collection": "^1.0", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-php80": "^1.14" }, "replace": { "rhumsaa/uuid": "self.version" }, "require-dev": { - "codeception/aspect-mock": "^1 | ^2", - "doctrine/annotations": "^1.2", - "goaop/framework": "1.0.0-alpha.2 | ^1 | ^2.1", - "jakub-onderka/php-parallel-lint": "^1", - "mockery/mockery": "^0.9.11 | ^1", + "captainhook/captainhook": "^5.10", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "doctrine/annotations": "^1.8", + "ergebnis/composer-normalize": "^2.15", + "mockery/mockery": "^1.3", "moontoast/math": "^1.1", "paragonie/random-lib": "^2", - "php-mock/php-mock-phpunit": "^0.3 | ^1.1", - "phpunit/phpunit": "^4.8 | ^5.4 | ^6.5", - "squizlabs/php_codesniffer": "^3.5" + "php-mock/php-mock": "^2.2", + "php-mock/php-mock-mockery": "^1.3", + "php-parallel-lint/php-parallel-lint": "^1.1", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-mockery": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^8.5 || ^9", + "slevomat/coding-standard": "^7.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.9" }, "suggest": { - "ext-ctype": "Provides support for PHP Ctype functions", - "ext-libsodium": "Provides the PECL libsodium extension for use with the SodiumRandomGenerator", - "ext-openssl": "Provides the OpenSSL extension for use with the OpenSslGenerator", - "ext-uuid": "Provides the PECL UUID extension for use with the PeclUuidTimeGenerator and PeclUuidRandomGenerator", - "moontoast/math": "Provides support for converting UUID to 128-bit integer (in string form).", + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-ctype": "Enables faster processing of character classification using ctype functions.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", - "ramsey/uuid-console": "A console application for generating UUIDs with ramsey/uuid", "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.x-dev" + "dev-main": "4.x-dev" + }, + "captainhook": { + "force-install": true } }, "autoload": { @@ -5777,23 +7065,7 @@ "license": [ "MIT" ], - "authors": [ - { - "name": "Ben Ramsey", - "email": "ben@benramsey.com", - "homepage": "https://benramsey.com" - }, - { - "name": "Marijn Huizendveld", - "email": "marijn.huizendveld@gmail.com" - }, - { - "name": "Thibaud Fabre", - "email": "thibaud@aztech.io" - } - ], - "description": "Formerly rhumsaa/uuid. A PHP 5.4+ library for generating RFC 4122 version 1, 3, 4, and 5 universally unique identifiers (UUID).", - "homepage": "https://github.com/ramsey/uuid", + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", "keywords": [ "guid", "identifier", @@ -5801,11 +7073,19 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "rss": "https://github.com/ramsey/uuid/releases.atom", - "source": "https://github.com/ramsey/uuid", - "wiki": "https://github.com/ramsey/uuid/wiki" + "source": "https://github.com/ramsey/uuid/tree/4.2.3" }, - "time": "2020-02-21T04:36:14+00:00" + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", + "type": "tidelift" + } + ], + "time": "2021-09-25T23:10:38+00:00" }, { "name": "robrichards/xmlseclibs", @@ -5915,26 +7195,26 @@ }, { "name": "rollbar/rollbar-laravel", - "version": "v6.0.0", + "version": "v7.0.0", "source": { "type": "git", "url": "https://github.com/rollbar/rollbar-php-laravel.git", - "reference": "11df7e19313a4cf60769d26ce35e29b09d5405cd" + "reference": "9ffed9026f3786538a64cf5fb7e28a1fbdd11b2d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rollbar/rollbar-php-laravel/zipball/11df7e19313a4cf60769d26ce35e29b09d5405cd", - "reference": "11df7e19313a4cf60769d26ce35e29b09d5405cd", + "url": "https://api.github.com/repos/rollbar/rollbar-php-laravel/zipball/9ffed9026f3786538a64cf5fb7e28a1fbdd11b2d", + "reference": "9ffed9026f3786538a64cf5fb7e28a1fbdd11b2d", "shasum": "" }, "require": { - "illuminate/support": "^6.0|^7.0", + "illuminate/support": "^6.0|^7.0|^8.0", "php": ">=7.2", "rollbar/rollbar": "^2" }, "require-dev": { "mockery/mockery": "^1", - "orchestra/testbench": "^4|^5", + "orchestra/testbench": "^4.0|^5.0|^6.0", "php-coveralls/php-coveralls": "^2.2", "phpunit/phpunit": "^8", "squizlabs/php_codesniffer": "3.*" @@ -5981,9 +7261,9 @@ ], "support": { "issues": "https://github.com/rollbar/rollbar-php-laravel/issues", - "source": "https://github.com/rollbar/rollbar-php-laravel/tree/v6.0.0" + "source": "https://github.com/rollbar/rollbar-php-laravel/tree/v7.0.0" }, - "time": "2020-03-03T20:09:19+00:00" + "time": "2020-09-10T17:20:14+00:00" }, { "name": "sebastian/comparator", @@ -6313,6 +7593,10 @@ "mysqldump", "spatie" ], + "support": { + "issues": "https://github.com/spatie/db-dumper/issues", + "source": "https://github.com/spatie/db-dumper/tree/2.21.1" + }, "funding": [ { "url": "https://github.com/spatie", @@ -6323,36 +7607,37 @@ }, { "name": "spatie/laravel-backup", - "version": "6.11.1", + "version": "6.16.5", "source": { "type": "git", "url": "https://github.com/spatie/laravel-backup.git", - "reference": "3ede36961b79b6ea4a6b5f708f2cc60fee74ad6c" + "reference": "332fae80b12cacb9e4161824ba195d984b28c8fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-backup/zipball/3ede36961b79b6ea4a6b5f708f2cc60fee74ad6c", - "reference": "3ede36961b79b6ea4a6b5f708f2cc60fee74ad6c", + "url": "https://api.github.com/repos/spatie/laravel-backup/zipball/332fae80b12cacb9e4161824ba195d984b28c8fb", + "reference": "332fae80b12cacb9e4161824ba195d984b28c8fb", "shasum": "" }, "require": { - "illuminate/console": "^5.8.15|^6.0|^7.0", - "illuminate/contracts": "^5.8.15|^6.0|^7.0", - "illuminate/events": "^5.8.15|^6.0|^7.0", - "illuminate/filesystem": "^5.8.15|^6.0|^7.0", - "illuminate/notifications": "^5.8.15|^6.0|^7.0", - "illuminate/support": "^5.8.15|^6.0|^7.0", + "ext-zip": "^1.14.0", + "illuminate/console": "^6.0|^7.0|^8.0", + "illuminate/contracts": "^6.0|^7.0|^8.0", + "illuminate/events": "^6.0|^7.0|^8.0", + "illuminate/filesystem": "^6.0|^7.0|^8.0", + "illuminate/notifications": "^6.0|^7.0|^8.0", + "illuminate/support": "^6.0|^7.0|^8.0", "league/flysystem": "^1.0.49", - "php": "^7.2", + "php": "^7.3|^8.0", "spatie/db-dumper": "^2.12", "spatie/temporary-directory": "^1.1", "symfony/finder": "^4.2|^5.0" }, "require-dev": { - "laravel/slack-notification-channel": "^1.0", + "laravel/slack-notification-channel": "^2.3", "league/flysystem-aws-s3-v3": "^1.0", - "mockery/mockery": "^1.3", - "orchestra/testbench": "3.8.*|4.*|5.*", + "mockery/mockery": "^1.4.2", + "orchestra/testbench": "4.*|5.*|6.*", "phpunit/phpunit": "^8.4|^9.0" }, "suggest": { @@ -6396,19 +7681,19 @@ ], "support": { "issues": "https://github.com/spatie/laravel-backup/issues", - "source": "https://github.com/spatie/laravel-backup/tree/master" + "source": "https://github.com/spatie/laravel-backup/tree/6.16.5" }, "funding": [ { - "url": "https://spatie.be/open-source/support-us", - "type": "custom" + "url": "https://github.com/sponsors/spatie", + "type": "github" }, { - "url": "https://github.com/spatie", - "type": "github" + "url": "https://spatie.be/open-source/support-us", + "type": "other" } ], - "time": "2020-06-18T09:59:06+00:00" + "time": "2021-09-12T10:04:18+00:00" }, { "name": "spatie/temporary-directory", @@ -6461,62 +7746,6 @@ }, "time": "2020-11-09T15:54:21+00:00" }, - { - "name": "squizlabs/php_codesniffer", - "version": "3.5.8", - "source": { - "type": "git", - "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "9d583721a7157ee997f235f327de038e7ea6dac4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/9d583721a7157ee997f235f327de038e7ea6dac4", - "reference": "9d583721a7157ee997f235f327de038e7ea6dac4", - "shasum": "" - }, - "require": { - "ext-simplexml": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": ">=5.4.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" - }, - "bin": [ - "bin/phpcs", - "bin/phpcbf" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Greg Sherwood", - "role": "lead" - } - ], - "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", - "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", - "keywords": [ - "phpcs", - "standards" - ], - "support": { - "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", - "source": "https://github.com/squizlabs/PHP_CodeSniffer", - "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" - }, - "time": "2020-10-23T02:01:07+00:00" - }, { "name": "swiftmailer/swiftmailer", "version": "v6.2.7", @@ -6576,6 +7805,10 @@ "mail", "mailer" ], + "support": { + "issues": "https://github.com/swiftmailer/swiftmailer/issues", + "source": "https://github.com/swiftmailer/swiftmailer/tree/v6.2.7" + }, "funding": [ { "url": "https://github.com/fabpot", @@ -6590,42 +7823,46 @@ }, { "name": "symfony/console", - "version": "v4.4.21", + "version": "v5.3.7", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "1ba4560dbbb9fcf5ae28b61f71f49c678086cf23" + "reference": "8b1008344647462ae6ec57559da166c2bfa5e16a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/1ba4560dbbb9fcf5ae28b61f71f49c678086cf23", - "reference": "1ba4560dbbb9fcf5ae28b61f71f49c678086cf23", + "url": "https://api.github.com/repos/symfony/console/zipball/8b1008344647462ae6ec57559da166c2bfa5e16a", + "reference": "8b1008344647462ae6ec57559da166c2bfa5e16a", "shasum": "" }, "require": { - "php": ">=7.1.3", + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-php73": "^1.8", - "symfony/polyfill-php80": "^1.15", - "symfony/service-contracts": "^1.1|^2" + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2", + "symfony/string": "^5.1" }, "conflict": { - "symfony/dependency-injection": "<3.4", - "symfony/event-dispatcher": "<4.3|>=5", + "psr/log": ">=3", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", "symfony/lock": "<4.4", - "symfony/process": "<3.3" + "symfony/process": "<4.4" }, "provide": { - "psr/log-implementation": "1.0" + "psr/log-implementation": "1.0|2.0" }, "require-dev": { - "psr/log": "~1.0", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/event-dispatcher": "^4.3", + "psr/log": "^1|^2", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/event-dispatcher": "^4.4|^5.0", "symfony/lock": "^4.4|^5.0", - "symfony/process": "^3.4|^4.0|^5.0", - "symfony/var-dumper": "^4.3|^5.0" + "symfony/process": "^4.4|^5.0", + "symfony/var-dumper": "^4.4|^5.0" }, "suggest": { "psr/log": "For using the console logger", @@ -6658,6 +7895,15 @@ ], "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v5.3.7" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -6672,24 +7918,25 @@ "type": "tidelift" } ], - "time": "2021-03-26T09:23:24+00:00" + "time": "2021-08-25T20:02:16+00:00" }, { "name": "symfony/css-selector", - "version": "v4.4.20", + "version": "v4.4.27", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "f907d3e53ecb2a5fad8609eb2f30525287a734c8" + "reference": "5194f18bd80d106f11efa8f7cd0fbdcc3af96ce6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/f907d3e53ecb2a5fad8609eb2f30525287a734c8", - "reference": "f907d3e53ecb2a5fad8609eb2f30525287a734c8", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/5194f18bd80d106f11efa8f7cd0fbdcc3af96ce6", + "reference": "5194f18bd80d106f11efa8f7cd0fbdcc3af96ce6", "shasum": "" }, "require": { - "php": ">=7.1.3" + "php": ">=7.1.3", + "symfony/polyfill-php80": "^1.16" }, "type": "library", "autoload": { @@ -6720,6 +7967,9 @@ ], "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v4.4.27" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -6734,26 +7984,25 @@ "type": "tidelift" } ], - "time": "2021-01-27T09:09:26+00:00" + "time": "2021-07-21T12:19:41+00:00" }, { "name": "symfony/debug", - "version": "v4.4.20", + "version": "v4.4.31", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "157bbec4fd773bae53c5483c50951a5530a2cc16" + "reference": "43ede438d4cb52cd589ae5dc070e9323866ba8e0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/157bbec4fd773bae53c5483c50951a5530a2cc16", - "reference": "157bbec4fd773bae53c5483c50951a5530a2cc16", + "url": "https://api.github.com/repos/symfony/debug/zipball/43ede438d4cb52cd589ae5dc070e9323866ba8e0", + "reference": "43ede438d4cb52cd589ae5dc070e9323866ba8e0", "shasum": "" }, "require": { "php": ">=7.1.3", - "psr/log": "~1.0", - "symfony/polyfill-php80": "^1.15" + "psr/log": "^1|^2|^3" }, "conflict": { "symfony/http-kernel": "<3.4" @@ -6786,6 +8035,9 @@ ], "description": "Provides tools to ease debugging PHP code", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/debug/tree/v4.4.31" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -6800,20 +8052,20 @@ "type": "tidelift" } ], - "time": "2021-01-28T16:54:48+00:00" + "time": "2021-09-24T13:30:14+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v2.2.0", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665" + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5fa56b4074d1ae755beb55617ddafe6f5d78f665", - "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", "shasum": "" }, "require": { @@ -6822,7 +8074,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.2-dev" + "dev-main": "2.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -6851,7 +8103,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/master" + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" }, "funding": [ { @@ -6867,30 +8119,29 @@ "type": "tidelift" } ], - "time": "2020-09-07T11:33:47+00:00" + "time": "2021-03-23T23:28:01+00:00" }, { "name": "symfony/error-handler", - "version": "v4.4.21", + "version": "v5.3.7", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "48e81a375525872e788c2418430f54150d935810" + "reference": "3bc60d0fba00ae8d1eaa9eb5ab11a2bbdd1fc321" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/48e81a375525872e788c2418430f54150d935810", - "reference": "48e81a375525872e788c2418430f54150d935810", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/3bc60d0fba00ae8d1eaa9eb5ab11a2bbdd1fc321", + "reference": "3bc60d0fba00ae8d1eaa9eb5ab11a2bbdd1fc321", "shasum": "" }, "require": { - "php": ">=7.1.3", - "psr/log": "~1.0", - "symfony/debug": "^4.4.5", - "symfony/polyfill-php80": "^1.15", + "php": ">=7.2.5", + "psr/log": "^1|^2|^3", "symfony/var-dumper": "^4.4|^5.0" }, "require-dev": { + "symfony/deprecation-contracts": "^2.1", "symfony/http-kernel": "^4.4|^5.0", "symfony/serializer": "^4.4|^5.0" }, @@ -6919,6 +8170,9 @@ ], "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v5.3.7" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -6933,42 +8187,44 @@ "type": "tidelift" } ], - "time": "2021-03-08T10:28:40+00:00" + "time": "2021-08-28T15:07:08+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v4.4.20", + "version": "v5.3.7", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "c352647244bd376bf7d31efbd5401f13f50dad0c" + "reference": "ce7b20d69c66a20939d8952b617506a44d102130" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/c352647244bd376bf7d31efbd5401f13f50dad0c", - "reference": "c352647244bd376bf7d31efbd5401f13f50dad0c", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/ce7b20d69c66a20939d8952b617506a44d102130", + "reference": "ce7b20d69c66a20939d8952b617506a44d102130", "shasum": "" }, "require": { - "php": ">=7.1.3", - "symfony/event-dispatcher-contracts": "^1.1" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/event-dispatcher-contracts": "^2", + "symfony/polyfill-php80": "^1.16" }, "conflict": { - "symfony/dependency-injection": "<3.4" + "symfony/dependency-injection": "<4.4" }, "provide": { "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "1.1" + "symfony/event-dispatcher-implementation": "2.0" }, "require-dev": { - "psr/log": "~1.0", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/error-handler": "~3.4|~4.4", - "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/http-foundation": "^3.4|^4.0|^5.0", + "psr/log": "^1|^2|^3", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/error-handler": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", "symfony/service-contracts": "^1.1|^2", - "symfony/stopwatch": "^3.4|^4.0|^5.0" + "symfony/stopwatch": "^4.4|^5.0" }, "suggest": { "symfony/dependency-injection": "", @@ -6999,6 +8255,9 @@ ], "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v5.3.7" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -7013,33 +8272,33 @@ "type": "tidelift" } ], - "time": "2021-01-27T09:09:26+00:00" + "time": "2021-08-04T21:20:46+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v1.1.9", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7" + "reference": "69fee1ad2332a7cbab3aca13591953da9cdb7a11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/84e23fdcd2517bf37aecbd16967e83f0caee25a7", - "reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/69fee1ad2332a7cbab3aca13591953da9cdb7a11", + "reference": "69fee1ad2332a7cbab3aca13591953da9cdb7a11", "shasum": "" }, "require": { - "php": ">=7.1.3" + "php": ">=7.2.5", + "psr/event-dispatcher": "^1" }, "suggest": { - "psr/event-dispatcher": "", "symfony/event-dispatcher-implementation": "" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1-dev" + "dev-main": "2.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -7076,7 +8335,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v1.1.9" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.4.0" }, "funding": [ { @@ -7092,24 +8351,25 @@ "type": "tidelift" } ], - "time": "2020-07-06T13:19:58+00:00" + "time": "2021-03-23T23:28:01+00:00" }, { "name": "symfony/finder", - "version": "v4.4.20", + "version": "v5.3.7", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "2543795ab1570df588b9bbd31e1a2bd7037b94f6" + "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/2543795ab1570df588b9bbd31e1a2bd7037b94f6", - "reference": "2543795ab1570df588b9bbd31e1a2bd7037b94f6", + "url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93", "shasum": "" }, "require": { - "php": ">=7.1.3" + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" }, "type": "library", "autoload": { @@ -7136,6 +8396,9 @@ ], "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v5.3.7" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -7150,20 +8413,20 @@ "type": "tidelift" } ], - "time": "2021-02-12T10:48:09+00:00" + "time": "2021-08-04T21:20:46+00:00" }, { "name": "symfony/http-client-contracts", - "version": "v2.3.1", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "41db680a15018f9c1d4b23516059633ce280ca33" + "reference": "7e82f6084d7cae521a75ef2cb5c9457bbda785f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/41db680a15018f9c1d4b23516059633ce280ca33", - "reference": "41db680a15018f9c1d4b23516059633ce280ca33", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/7e82f6084d7cae521a75ef2cb5c9457bbda785f4", + "reference": "7e82f6084d7cae521a75ef2cb5c9457bbda785f4", "shasum": "" }, "require": { @@ -7174,9 +8437,8 @@ }, "type": "library", "extra": { - "branch-version": "2.3", "branch-alias": { - "dev-main": "2.3-dev" + "dev-main": "2.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -7213,7 +8475,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/http-client-contracts/tree/v2.3.1" + "source": "https://github.com/symfony/http-client-contracts/tree/v2.4.0" }, "funding": [ { @@ -7229,31 +8491,36 @@ "type": "tidelift" } ], - "time": "2020-10-14T17:08:19+00:00" + "time": "2021-04-11T23:07:08+00:00" }, { "name": "symfony/http-foundation", - "version": "v4.4.20", + "version": "v5.3.7", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "02d968647fe61b2f419a8dc70c468a9d30a48d3a" + "reference": "e36c8e5502b4f3f0190c675f1c1f1248a64f04e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/02d968647fe61b2f419a8dc70c468a9d30a48d3a", - "reference": "02d968647fe61b2f419a8dc70c468a9d30a48d3a", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e36c8e5502b4f3f0190c675f1c1f1248a64f04e5", + "reference": "e36c8e5502b4f3f0190c675f1c1f1248a64f04e5", "shasum": "" }, "require": { - "php": ">=7.1.3", - "symfony/mime": "^4.3|^5.0", + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.16" }, "require-dev": { "predis/predis": "~1.0", - "symfony/expression-language": "^3.4|^4.0|^5.0" + "symfony/cache": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0" + }, + "suggest": { + "symfony/mime": "To use the file extension guesser" }, "type": "library", "autoload": { @@ -7280,6 +8547,9 @@ ], "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v5.3.7" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -7294,61 +8564,69 @@ "type": "tidelift" } ], - "time": "2021-02-25T17:11:33+00:00" + "time": "2021-08-27T11:20:35+00:00" }, { "name": "symfony/http-kernel", - "version": "v4.4.21", + "version": "v5.3.9", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "0248214120d00c5f44f1cd5d9ad65f0b38459333" + "reference": "ceaf46a992f60e90645e7279825a830f733a17c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/0248214120d00c5f44f1cd5d9ad65f0b38459333", - "reference": "0248214120d00c5f44f1cd5d9ad65f0b38459333", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/ceaf46a992f60e90645e7279825a830f733a17c5", + "reference": "ceaf46a992f60e90645e7279825a830f733a17c5", "shasum": "" }, "require": { - "php": ">=7.1.3", - "psr/log": "~1.0", - "symfony/error-handler": "^4.4", - "symfony/event-dispatcher": "^4.4", + "php": ">=7.2.5", + "psr/log": "^1|^2", + "symfony/deprecation-contracts": "^2.1", + "symfony/error-handler": "^4.4|^5.0", + "symfony/event-dispatcher": "^5.0", "symfony/http-client-contracts": "^1.1|^2", - "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-foundation": "^5.3.7", "symfony/polyfill-ctype": "^1.8", "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.16" }, "conflict": { - "symfony/browser-kit": "<4.3", - "symfony/config": "<3.4", - "symfony/console": ">=5", - "symfony/dependency-injection": "<4.3", - "symfony/translation": "<4.2", - "twig/twig": "<1.43|<2.13,>=2" + "symfony/browser-kit": "<4.4", + "symfony/cache": "<5.0", + "symfony/config": "<5.0", + "symfony/console": "<4.4", + "symfony/dependency-injection": "<5.3", + "symfony/doctrine-bridge": "<5.0", + "symfony/form": "<5.0", + "symfony/http-client": "<5.0", + "symfony/mailer": "<5.0", + "symfony/messenger": "<5.0", + "symfony/translation": "<5.0", + "symfony/twig-bridge": "<5.0", + "symfony/validator": "<5.0", + "twig/twig": "<2.13" }, "provide": { - "psr/log-implementation": "1.0" + "psr/log-implementation": "1.0|2.0" }, "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", - "symfony/browser-kit": "^4.3|^5.0", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/console": "^3.4|^4.0", - "symfony/css-selector": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^4.3|^5.0", - "symfony/dom-crawler": "^3.4|^4.0|^5.0", - "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/finder": "^3.4|^4.0|^5.0", - "symfony/process": "^3.4|^4.0|^5.0", - "symfony/routing": "^3.4|^4.0|^5.0", - "symfony/stopwatch": "^3.4|^4.0|^5.0", - "symfony/templating": "^3.4|^4.0|^5.0", - "symfony/translation": "^4.2|^5.0", + "symfony/browser-kit": "^4.4|^5.0", + "symfony/config": "^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/css-selector": "^4.4|^5.0", + "symfony/dependency-injection": "^5.3", + "symfony/dom-crawler": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "symfony/routing": "^4.4|^5.0", + "symfony/stopwatch": "^4.4|^5.0", + "symfony/translation": "^4.4|^5.0", "symfony/translation-contracts": "^1.1|^2", - "twig/twig": "^1.43|^2.13|^3.0.4" + "twig/twig": "^2.13|^3.0.4" }, "suggest": { "symfony/browser-kit": "", @@ -7381,6 +8659,9 @@ ], "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v5.3.9" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -7395,20 +8676,20 @@ "type": "tidelift" } ], - "time": "2021-03-29T05:11:04+00:00" + "time": "2021-09-28T10:25:11+00:00" }, { "name": "symfony/mime", - "version": "v5.2.6", + "version": "v5.3.8", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "1b2092244374cbe48ae733673f2ca0818b37197b" + "reference": "a756033d0a7e53db389618653ae991eba5a19a11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/1b2092244374cbe48ae733673f2ca0818b37197b", - "reference": "1b2092244374cbe48ae733673f2ca0818b37197b", + "url": "https://api.github.com/repos/symfony/mime/zipball/a756033d0a7e53db389618653ae991eba5a19a11", + "reference": "a756033d0a7e53db389618653ae991eba5a19a11", "shasum": "" }, "require": { @@ -7416,7 +8697,7 @@ "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-intl-idn": "^1.10", "symfony/polyfill-mbstring": "^1.0", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.16" }, "conflict": { "egulias/email-validator": "~3.0.0", @@ -7461,6 +8742,9 @@ "mime", "mime-type" ], + "support": { + "source": "https://github.com/symfony/mime/tree/v5.3.8" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -7475,20 +8759,20 @@ "type": "tidelift" } ], - "time": "2021-03-12T13:18:39+00:00" + "time": "2021-09-10T12:30:38+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.22.1", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "c6c942b1ac76c82448322025e084cadc56048b4e" + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/c6c942b1ac76c82448322025e084cadc56048b4e", - "reference": "c6c942b1ac76c82448322025e084cadc56048b4e", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", "shasum": "" }, "require": { @@ -7500,7 +8784,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -7537,6 +8821,9 @@ "polyfill", "portable" ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -7551,20 +8838,20 @@ "type": "tidelift" } ], - "time": "2021-01-07T16:49:33+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { "name": "symfony/polyfill-iconv", - "version": "v1.22.1", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-iconv.git", - "reference": "06fb361659649bcfd6a208a0f1fcaf4e827ad342" + "reference": "63b5bb7db83e5673936d6e3b8b3e022ff6474933" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/06fb361659649bcfd6a208a0f1fcaf4e827ad342", - "reference": "06fb361659649bcfd6a208a0f1fcaf4e827ad342", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/63b5bb7db83e5673936d6e3b8b3e022ff6474933", + "reference": "63b5bb7db83e5673936d6e3b8b3e022ff6474933", "shasum": "" }, "require": { @@ -7576,7 +8863,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -7614,6 +8901,9 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-iconv/tree/v1.23.0" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -7628,20 +8918,101 @@ "type": "tidelift" } ], - "time": "2021-01-22T09:19:47+00:00" + "time": "2021-05-27T09:27:20+00:00" }, { - "name": "symfony/polyfill-intl-idn", - "version": "v1.22.1", + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.23.1", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "2d63434d922daf7da8dd863e7907e67ee3031483" + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "16880ba9c5ebe3642d1995ab866db29270b36535" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/2d63434d922daf7da8dd863e7907e67ee3031483", - "reference": "2d63434d922daf7da8dd863e7907e67ee3031483", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/16880ba9c5ebe3642d1995ab866db29270b36535", + "reference": "16880ba9c5ebe3642d1995ab866db29270b36535", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T12:26:48+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/65bd267525e82759e7d8c4e8ceea44f398838e65", + "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65", "shasum": "" }, "require": { @@ -7655,7 +9026,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -7698,6 +9069,9 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.23.0" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -7712,20 +9086,20 @@ "type": "tidelift" } ], - "time": "2021-01-22T09:19:47+00:00" + "time": "2021-05-27T09:27:20+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.22.1", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "43a0283138253ed1d48d352ab6d0bdb3f809f248" + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/43a0283138253ed1d48d352ab6d0bdb3f809f248", - "reference": "43a0283138253ed1d48d352ab6d0bdb3f809f248", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", "shasum": "" }, "require": { @@ -7737,7 +9111,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -7779,6 +9153,9 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -7793,20 +9170,20 @@ "type": "tidelift" } ], - "time": "2021-01-22T09:19:47+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.22.1", + "version": "v1.23.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "5232de97ee3b75b0360528dae24e73db49566ab1" + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/5232de97ee3b75b0360528dae24e73db49566ab1", - "reference": "5232de97ee3b75b0360528dae24e73db49566ab1", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", "shasum": "" }, "require": { @@ -7818,7 +9195,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -7856,6 +9233,9 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -7870,20 +9250,20 @@ "type": "tidelift" } ], - "time": "2021-01-22T09:19:47+00:00" + "time": "2021-05-27T12:26:48+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.22.1", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "cc6e6f9b39fe8075b3dabfbaf5b5f645ae1340c9" + "reference": "9a142215a36a3888e30d0a9eeea9766764e96976" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/cc6e6f9b39fe8075b3dabfbaf5b5f645ae1340c9", - "reference": "cc6e6f9b39fe8075b3dabfbaf5b5f645ae1340c9", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976", + "reference": "9a142215a36a3888e30d0a9eeea9766764e96976", "shasum": "" }, "require": { @@ -7892,7 +9272,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -7929,6 +9309,9 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.23.0" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -7943,20 +9326,20 @@ "type": "tidelift" } ], - "time": "2021-01-07T16:49:33+00:00" + "time": "2021-05-27T09:17:38+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.22.1", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2" + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/a678b42e92f86eca04b7fa4c0f6f19d097fb69e2", - "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", "shasum": "" }, "require": { @@ -7965,7 +9348,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -8005,6 +9388,9 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -8019,20 +9405,20 @@ "type": "tidelift" } ], - "time": "2021-01-07T16:49:33+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.22.1", + "version": "v1.23.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91" + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dc3063ba22c2a1fd2f45ed856374d79114998f91", - "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", "shasum": "" }, "require": { @@ -8041,7 +9427,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -8085,6 +9471,9 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -8099,24 +9488,104 @@ "type": "tidelift" } ], - "time": "2021-01-07T16:49:33+00:00" + "time": "2021-07-28T13:41:28+00:00" }, { - "name": "symfony/process", - "version": "v4.4.20", + "name": "symfony/polyfill-php81", + "version": "v1.23.0", "source": { "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "7e950b6366d4da90292c2e7fa820b3c1842b965a" + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "e66119f3de95efc359483f810c4c3e6436279436" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/7e950b6366d4da90292c2e7fa820b3c1842b965a", - "reference": "7e950b6366d4da90292c2e7fa820b3c1842b965a", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/e66119f3de95efc359483f810c4c3e6436279436", + "reference": "e66119f3de95efc359483f810c4c3e6436279436", "shasum": "" }, "require": { - "php": ">=7.1.3" + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-21T13:25:03+00:00" + }, + { + "name": "symfony/process", + "version": "v5.3.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "38f26c7d6ed535217ea393e05634cb0b244a1967" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/38f26c7d6ed535217ea393e05634cb0b244a1967", + "reference": "38f26c7d6ed535217ea393e05634cb0b244a1967", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" }, "type": "library", "autoload": { @@ -8143,6 +9612,9 @@ ], "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v5.3.7" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -8157,20 +9629,20 @@ "type": "tidelift" } ], - "time": "2021-01-27T09:09:26+00:00" + "time": "2021-08-04T21:20:46+00:00" }, { "name": "symfony/psr-http-message-bridge", - "version": "v2.1.0", + "version": "v2.1.1", "source": { "type": "git", "url": "https://github.com/symfony/psr-http-message-bridge.git", - "reference": "81db2d4ae86e9f0049828d9343a72b9523884e5d" + "reference": "c9012994c4b4fb23e7c57dd86b763a417a04feba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/81db2d4ae86e9f0049828d9343a72b9523884e5d", - "reference": "81db2d4ae86e9f0049828d9343a72b9523884e5d", + "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/c9012994c4b4fb23e7c57dd86b763a417a04feba", + "reference": "c9012994c4b4fb23e7c57dd86b763a417a04feba", "shasum": "" }, "require": { @@ -8180,7 +9652,7 @@ }, "require-dev": { "nyholm/psr7": "^1.1", - "psr/log": "^1.1", + "psr/log": "^1.1 || ^2 || ^3", "symfony/browser-kit": "^4.4 || ^5.0", "symfony/config": "^4.4 || ^5.0", "symfony/event-dispatcher": "^4.4 || ^5.0", @@ -8227,6 +9699,10 @@ "psr-17", "psr-7" ], + "support": { + "issues": "https://github.com/symfony/psr-http-message-bridge/issues", + "source": "https://github.com/symfony/psr-http-message-bridge/tree/v2.1.1" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -8241,41 +9717,43 @@ "type": "tidelift" } ], - "time": "2021-02-17T10:35:25+00:00" + "time": "2021-07-27T17:25:39+00:00" }, { "name": "symfony/routing", - "version": "v4.4.20", + "version": "v5.3.7", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "69919991c845b34626664ddc9b3aef9d09d2a5df" + "reference": "be865017746fe869007d94220ad3f5297951811b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/69919991c845b34626664ddc9b3aef9d09d2a5df", - "reference": "69919991c845b34626664ddc9b3aef9d09d2a5df", + "url": "https://api.github.com/repos/symfony/routing/zipball/be865017746fe869007d94220ad3f5297951811b", + "reference": "be865017746fe869007d94220ad3f5297951811b", "shasum": "" }, "require": { - "php": ">=7.1.3" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.16" }, "conflict": { - "symfony/config": "<4.2", - "symfony/dependency-injection": "<3.4", - "symfony/yaml": "<3.4" + "doctrine/annotations": "<1.12", + "symfony/config": "<5.3", + "symfony/dependency-injection": "<4.4", + "symfony/yaml": "<4.4" }, "require-dev": { - "doctrine/annotations": "^1.10.4", - "psr/log": "~1.0", - "symfony/config": "^4.2|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/http-foundation": "^3.4|^4.0|^5.0", - "symfony/yaml": "^3.4|^4.0|^5.0" + "doctrine/annotations": "^1.12", + "psr/log": "^1|^2|^3", + "symfony/config": "^5.3", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0" }, "suggest": { - "doctrine/annotations": "For using the annotation loader", "symfony/config": "For using the all-in-one router or any loader", "symfony/expression-language": "For using expression matching", "symfony/http-foundation": "For using a Symfony Request object", @@ -8312,6 +9790,9 @@ "uri", "url" ], + "support": { + "source": "https://github.com/symfony/routing/tree/v5.3.7" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -8326,25 +9807,25 @@ "type": "tidelift" } ], - "time": "2021-02-22T15:37:04+00:00" + "time": "2021-08-04T21:42:42+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.2.0", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1" + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d15da7ba4957ffb8f1747218be9e1a121fd298a1", - "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", "shasum": "" }, "require": { "php": ">=7.2.5", - "psr/container": "^1.0" + "psr/container": "^1.1" }, "suggest": { "symfony/service-implementation": "" @@ -8352,7 +9833,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.2-dev" + "dev-main": "2.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -8389,7 +9870,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/master" + "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" }, "funding": [ { @@ -8405,46 +9886,133 @@ "type": "tidelift" } ], - "time": "2020-09-07T11:33:47+00:00" + "time": "2021-04-01T10:43:52+00:00" }, { - "name": "symfony/translation", - "version": "v4.4.21", + "name": "symfony/string", + "version": "v5.3.7", "source": { "type": "git", - "url": "https://github.com/symfony/translation.git", - "reference": "eb8f5428cc3b40d6dffe303b195b084f1c5fbd14" + "url": "https://github.com/symfony/string.git", + "reference": "8d224396e28d30f81969f083a58763b8b9ceb0a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/eb8f5428cc3b40d6dffe303b195b084f1c5fbd14", - "reference": "eb8f5428cc3b40d6dffe303b195b084f1c5fbd14", + "url": "https://api.github.com/repos/symfony/string/zipball/8d224396e28d30f81969f083a58763b8b9ceb0a5", + "reference": "8d224396e28d30f81969f083a58763b8b9ceb0a5", "shasum": "" }, "require": { - "php": ">=7.1.3", + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", "symfony/polyfill-mbstring": "~1.0", - "symfony/translation-contracts": "^1.1.6|^2" - }, - "conflict": { - "symfony/config": "<3.4", - "symfony/dependency-injection": "<3.4", - "symfony/http-kernel": "<4.4", - "symfony/yaml": "<3.4" - }, - "provide": { - "symfony/translation-implementation": "1.0|2.0" + "symfony/polyfill-php80": "~1.15" }, "require-dev": { - "psr/log": "~1.0", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/console": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/finder": "~2.8|~3.0|~4.0|^5.0", - "symfony/http-kernel": "^4.4", - "symfony/intl": "^3.4|^4.0|^5.0", + "symfony/error-handler": "^4.4|^5.0", + "symfony/http-client": "^4.4|^5.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "files": [ + "Resources/functions.php" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v5.3.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-08-26T08:00:08+00:00" + }, + { + "name": "symfony/translation", + "version": "v5.3.9", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "6e69f3551c1a3356cf6ea8d019bf039a0f8b6886" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/6e69f3551c1a3356cf6ea8d019bf039a0f8b6886", + "reference": "6e69f3551c1a3356cf6ea8d019bf039a0f8b6886", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation-contracts": "^2.3" + }, + "conflict": { + "symfony/config": "<4.4", + "symfony/dependency-injection": "<5.0", + "symfony/http-kernel": "<5.0", + "symfony/twig-bundle": "<5.0", + "symfony/yaml": "<4.4" + }, + "provide": { + "symfony/translation-implementation": "2.3" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^4.4|^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/http-kernel": "^5.0", + "symfony/intl": "^4.4|^5.0", + "symfony/polyfill-intl-icu": "^1.21", "symfony/service-contracts": "^1.1.2|^2", - "symfony/yaml": "^3.4|^4.0|^5.0" + "symfony/yaml": "^4.4|^5.0" }, "suggest": { "psr/log-implementation": "To use logging capability in translator", @@ -8453,6 +10021,9 @@ }, "type": "library", "autoload": { + "files": [ + "Resources/functions.php" + ], "psr-4": { "Symfony\\Component\\Translation\\": "" }, @@ -8476,6 +10047,9 @@ ], "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v5.3.9" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -8490,20 +10064,20 @@ "type": "tidelift" } ], - "time": "2021-03-23T16:25:01+00:00" + "time": "2021-08-26T08:22:53+00:00" }, { "name": "symfony/translation-contracts", - "version": "v2.3.0", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "e2eaa60b558f26a4b0354e1bbb25636efaaad105" + "reference": "95c812666f3e91db75385749fe219c5e494c7f95" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/e2eaa60b558f26a4b0354e1bbb25636efaaad105", - "reference": "e2eaa60b558f26a4b0354e1bbb25636efaaad105", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/95c812666f3e91db75385749fe219c5e494c7f95", + "reference": "95c812666f3e91db75385749fe219c5e494c7f95", "shasum": "" }, "require": { @@ -8515,7 +10089,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.3-dev" + "dev-main": "2.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -8552,7 +10126,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v2.3.0" + "source": "https://github.com/symfony/translation-contracts/tree/v2.4.0" }, "funding": [ { @@ -8568,37 +10142,36 @@ "type": "tidelift" } ], - "time": "2020-09-28T13:05:58+00:00" + "time": "2021-03-23T23:28:01+00:00" }, { "name": "symfony/var-dumper", - "version": "v4.4.21", + "version": "v5.3.8", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "0da0e174f728996f5d5072d6a9f0a42259dbc806" + "reference": "eaaea4098be1c90c8285543e1356a09c8aa5c8da" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/0da0e174f728996f5d5072d6a9f0a42259dbc806", - "reference": "0da0e174f728996f5d5072d6a9f0a42259dbc806", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/eaaea4098be1c90c8285543e1356a09c8aa5c8da", + "reference": "eaaea4098be1c90c8285543e1356a09c8aa5c8da", "shasum": "" }, "require": { - "php": ">=7.1.3", + "php": ">=7.2.5", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php72": "~1.5", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.16" }, "conflict": { - "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", - "symfony/console": "<3.4" + "phpunit/phpunit": "<5.4.3", + "symfony/console": "<4.4" }, "require-dev": { "ext-iconv": "*", - "symfony/console": "^3.4|^4.0|^5.0", + "symfony/console": "^4.4|^5.0", "symfony/process": "^4.4|^5.0", - "twig/twig": "^1.43|^2.13|^3.0.4" + "twig/twig": "^2.13|^3.0.4" }, "suggest": { "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", @@ -8640,6 +10213,9 @@ "debug", "dump" ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v5.3.8" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -8654,7 +10230,7 @@ "type": "tidelift" } ], - "time": "2021-03-27T19:49:03+00:00" + "time": "2021-09-24T15:59:58+00:00" }, { "name": "tecnickcom/tc-lib-barcode", @@ -8742,6 +10318,10 @@ "tc-lib-barcode", "upc" ], + "support": { + "issues": "https://github.com/tecnickcom/tc-lib-barcode/issues", + "source": "https://github.com/tecnickcom/tc-lib-barcode/tree/1.17.6" + }, "funding": [ { "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_donations¤cy_code=GBP&business=paypal@tecnick.com&item_name=donation%20for%20tc-lib-barcode%20project", @@ -8809,6 +10389,10 @@ "tc-lib-color", "web" ], + "support": { + "issues": "https://github.com/tecnickcom/tc-lib-color/issues", + "source": "https://github.com/tecnickcom/tc-lib-color/tree/1.14.6" + }, "funding": [ { "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_donations¤cy_code=GBP&business=paypal@tecnick.com&item_name=donation%20for%20tc-lib-color%20project", @@ -8865,27 +10449,32 @@ "collection", "laravel" ], + "support": { + "issues": "https://github.com/tighten/collect/issues", + "source": "https://github.com/tighten/collect/tree/v8.34.0" + }, "time": "2021-03-29T21:29:00+00:00" }, { "name": "tightenco/ziggy", - "version": "0.9.4", + "version": "v1.2.0", "source": { "type": "git", "url": "https://github.com/tighten/ziggy.git", - "reference": "82ea6ec6cb6ab3545b0245310b2a424316fe48d8" + "reference": "147804d5f3e98b897fc1ed15efc2807f1099cf83" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tighten/ziggy/zipball/82ea6ec6cb6ab3545b0245310b2a424316fe48d8", - "reference": "82ea6ec6cb6ab3545b0245310b2a424316fe48d8", + "url": "https://api.github.com/repos/tighten/ziggy/zipball/147804d5f3e98b897fc1ed15efc2807f1099cf83", + "reference": "147804d5f3e98b897fc1ed15efc2807f1099cf83", "shasum": "" }, "require": { "laravel/framework": ">=5.4@dev" }, "require-dev": { - "orchestra/testbench": "^5.0" + "orchestra/testbench": "^6.0", + "phpunit/phpunit": "^9.2" }, "type": "library", "extra": { @@ -8912,10 +10501,14 @@ { "name": "Jake Bathman", "email": "jake@tighten.co" + }, + { + "name": "Jacob Baker-Kretzmar", + "email": "jacob@tighten.co" } ], "description": "Generates a Blade directive exporting all of your named Laravel routes. Also provides a nice route() helper function in JavaScript.", - "homepage": "https://github.com/tightenco/ziggy", + "homepage": "https://github.com/tighten/ziggy", "keywords": [ "Ziggy", "javascript", @@ -8924,9 +10517,9 @@ ], "support": { "issues": "https://github.com/tighten/ziggy/issues", - "source": "https://github.com/tighten/ziggy/tree/0.9.4" + "source": "https://github.com/tighten/ziggy/tree/v1.2.0" }, - "time": "2020-06-05T14:42:41+00:00" + "time": "2021-05-24T22:46:59+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -9047,36 +10640,39 @@ }, { "name": "vlucas/phpdotenv", - "version": "v3.6.8", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "5e679f7616db829358341e2d5cccbd18773bdab8" + "reference": "b3eac5c7ac896e52deab4a99068e3f4ab12d9e56" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/5e679f7616db829358341e2d5cccbd18773bdab8", - "reference": "5e679f7616db829358341e2d5cccbd18773bdab8", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/b3eac5c7ac896e52deab4a99068e3f4ab12d9e56", + "reference": "b3eac5c7ac896e52deab4a99068e3f4ab12d9e56", "shasum": "" }, "require": { - "php": "^5.4 || ^7.0 || ^8.0", - "phpoption/phpoption": "^1.5.2", - "symfony/polyfill-ctype": "^1.17" + "ext-pcre": "*", + "graham-campbell/result-type": "^1.0.1", + "php": "^7.1.3 || ^8.0", + "phpoption/phpoption": "^1.7.4", + "symfony/polyfill-ctype": "^1.17", + "symfony/polyfill-mbstring": "^1.17", + "symfony/polyfill-php80": "^1.17" }, "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", "ext-filter": "*", - "ext-pcre": "*", - "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20" + "phpunit/phpunit": "^7.5.20 || ^8.5.14 || ^9.5.1" }, "suggest": { - "ext-filter": "Required to use the boolean validator.", - "ext-pcre": "Required to use most of the library." + "ext-filter": "Required to use the boolean validator." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.6-dev" + "dev-master": "5.3-dev" } }, "autoload": { @@ -9108,7 +10704,7 @@ ], "support": { "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/v3.6.8" + "source": "https://github.com/vlucas/phpdotenv/tree/v5.3.0" }, "funding": [ { @@ -9120,33 +10716,107 @@ "type": "tidelift" } ], - "time": "2021-01-20T14:39:46+00:00" + "time": "2021-01-20T15:23:13+00:00" }, { - "name": "watson/validating", - "version": "4.0.0", + "name": "voku/portable-ascii", + "version": "1.5.6", "source": { "type": "git", - "url": "https://github.com/dwightwatson/validating.git", - "reference": "b8731af37eade6b25aac1fcec5e90fdfdb9de5f5" + "url": "https://github.com/voku/portable-ascii.git", + "reference": "80953678b19901e5165c56752d087fc11526017c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dwightwatson/validating/zipball/b8731af37eade6b25aac1fcec5e90fdfdb9de5f5", - "reference": "b8731af37eade6b25aac1fcec5e90fdfdb9de5f5", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/80953678b19901e5165c56752d087fc11526017c", + "reference": "80953678b19901e5165c56752d087fc11526017c", "shasum": "" }, "require": { - "illuminate/contracts": "~6.0", - "illuminate/database": "~6.0", - "illuminate/events": "~6.0", - "illuminate/support": "~6.0", - "illuminate/validation": "~6.0", - "php": "^7.2" + "php": ">=7.0.0" }, "require-dev": { - "mockery/mockery": "~1.0", - "phpunit/phpunit": "~8.0" + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/1.5.6" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2020-11-12T00:07:28+00:00" + }, + { + "name": "watson/validating", + "version": "6.1.1", + "source": { + "type": "git", + "url": "https://github.com/dwightwatson/validating.git", + "reference": "fda4daaf804ead4aef641e1fb3f3b40a8448167e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dwightwatson/validating/zipball/fda4daaf804ead4aef641e1fb3f3b40a8448167e", + "reference": "fda4daaf804ead4aef641e1fb3f3b40a8448167e", + "shasum": "" + }, + "require": { + "illuminate/contracts": "~8.0", + "illuminate/database": "~8.0", + "illuminate/events": "~8.0", + "illuminate/support": "~8.0", + "illuminate/validation": "~8.0", + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.3.1", + "phpunit/phpunit": "~9.0" }, "type": "library", "autoload": { @@ -9172,9 +10842,9 @@ ], "support": { "issues": "https://github.com/dwightwatson/validating/issues", - "source": "https://github.com/dwightwatson/validating/tree/4.0.0" + "source": "https://github.com/dwightwatson/validating/tree/6.1.1" }, - "time": "2019-10-02T23:15:31+00:00" + "time": "2021-09-10T23:13:21+00:00" }, { "name": "webmozart/assert", @@ -9228,6 +10898,10 @@ "check", "validate" ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.10.0" + }, "time": "2021-03-09T10:59:23+00:00" } ], @@ -9290,20 +10964,24 @@ "gherkin", "parser" ], + "support": { + "issues": "https://github.com/Behat/Gherkin/issues", + "source": "https://github.com/Behat/Gherkin/tree/v4.8.0" + }, "time": "2021-02-04T12:44:21+00:00" }, { "name": "codeception/codeception", - "version": "4.1.20", + "version": "4.1.22", "source": { "type": "git", "url": "https://github.com/Codeception/Codeception.git", - "reference": "d8b16e13e1781dbc3a7ae8292117d520c89a9c5a" + "reference": "9777ec3690ceedc4bce2ed13af7af4ca4ee3088f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/Codeception/zipball/d8b16e13e1781dbc3a7ae8292117d520c89a9c5a", - "reference": "d8b16e13e1781dbc3a7ae8292117d520c89a9c5a", + "url": "https://api.github.com/repos/Codeception/Codeception/zipball/9777ec3690ceedc4bce2ed13af7af4ca4ee3088f", + "reference": "9777ec3690ceedc4bce2ed13af7af4ca4ee3088f", "shasum": "" }, "require": { @@ -9314,7 +10992,7 @@ "ext-curl": "*", "ext-json": "*", "ext-mbstring": "*", - "guzzlehttp/psr7": "~1.4", + "guzzlehttp/psr7": "^1.4 | ^2.0", "php": ">=5.6.0 <9.0", "symfony/console": ">=2.7 <6.0", "symfony/css-selector": ">=2.7 <6.0", @@ -9323,11 +11001,11 @@ "symfony/yaml": ">=2.7 <6.0" }, "require-dev": { - "codeception/module-asserts": "*@dev", - "codeception/module-cli": "*@dev", - "codeception/module-db": "*@dev", - "codeception/module-filesystem": "*@dev", - "codeception/module-phpbrowser": "*@dev", + "codeception/module-asserts": "1.*@dev", + "codeception/module-cli": "1.*@dev", + "codeception/module-db": "1.*@dev", + "codeception/module-filesystem": "1.*@dev", + "codeception/module-phpbrowser": "1.*@dev", "codeception/specify": "~0.3", "codeception/util-universalframework": "*@dev", "monolog/monolog": "~1.8", @@ -9375,13 +11053,17 @@ "functional testing", "unit testing" ], + "support": { + "issues": "https://github.com/Codeception/Codeception/issues", + "source": "https://github.com/Codeception/Codeception/tree/4.1.22" + }, "funding": [ { "url": "https://opencollective.com/codeception", "type": "open_collective" } ], - "time": "2021-04-02T16:41:51+00:00" + "time": "2021-08-06T17:15:34+00:00" }, { "name": "codeception/lib-asserts", @@ -9439,20 +11121,20 @@ }, { "name": "codeception/lib-innerbrowser", - "version": "1.4.2", + "version": "1.5.1", "source": { "type": "git", "url": "https://github.com/Codeception/lib-innerbrowser.git", - "reference": "4ffb91c18e4cacd073ff2914c07e5ccaf5efe449" + "reference": "31b4b56ad53c3464fcb2c0a14d55a51a201bd3c2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/lib-innerbrowser/zipball/4ffb91c18e4cacd073ff2914c07e5ccaf5efe449", - "reference": "4ffb91c18e4cacd073ff2914c07e5ccaf5efe449", + "url": "https://api.github.com/repos/Codeception/lib-innerbrowser/zipball/31b4b56ad53c3464fcb2c0a14d55a51a201bd3c2", + "reference": "31b4b56ad53c3464fcb2c0a14d55a51a201bd3c2", "shasum": "" }, "require": { - "codeception/codeception": "*@dev", + "codeception/codeception": "4.*@dev", "ext-dom": "*", "ext-json": "*", "ext-mbstring": "*", @@ -9491,7 +11173,11 @@ "keywords": [ "codeception" ], - "time": "2021-04-06T05:26:49+00:00" + "support": { + "issues": "https://github.com/Codeception/lib-innerbrowser/issues", + "source": "https://github.com/Codeception/lib-innerbrowser/tree/1.5.1" + }, + "time": "2021-08-30T15:21:42+00:00" }, { "name": "codeception/module-asserts", @@ -9605,16 +11291,16 @@ }, { "name": "codeception/module-rest", - "version": "1.2.8", + "version": "1.3.1", "source": { "type": "git", "url": "https://github.com/Codeception/module-rest.git", - "reference": "4c8c6bd75f67a25ff91bdce0d6c135c5e7aa5e10" + "reference": "293a0103d5257b7c884ef276147a9a06914e878f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/module-rest/zipball/4c8c6bd75f67a25ff91bdce0d6c135c5e7aa5e10", - "reference": "4c8c6bd75f67a25ff91bdce0d6c135c5e7aa5e10", + "url": "https://api.github.com/repos/Codeception/module-rest/zipball/293a0103d5257b7c884ef276147a9a06914e878f", + "reference": "293a0103d5257b7c884ef276147a9a06914e878f", "shasum": "" }, "require": { @@ -9651,20 +11337,24 @@ "codeception", "rest" ], - "time": "2021-03-02T06:47:59+00:00" + "support": { + "issues": "https://github.com/Codeception/module-rest/issues", + "source": "https://github.com/Codeception/module-rest/tree/1.3.1" + }, + "time": "2021-04-23T08:12:24+00:00" }, { "name": "codeception/module-webdriver", - "version": "1.2.0", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/Codeception/module-webdriver.git", - "reference": "63ea08880a44df809bdfbca08597e1b68cee9f87" + "reference": "baa18b7bf70aa024012f967b5ce5021e1faa9151" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/module-webdriver/zipball/63ea08880a44df809bdfbca08597e1b68cee9f87", - "reference": "63ea08880a44df809bdfbca08597e1b68cee9f87", + "url": "https://api.github.com/repos/Codeception/module-webdriver/zipball/baa18b7bf70aa024012f967b5ce5021e1faa9151", + "reference": "baa18b7bf70aa024012f967b5ce5021e1faa9151", "shasum": "" }, "require": { @@ -9705,9 +11395,9 @@ ], "support": { "issues": "https://github.com/Codeception/module-webdriver/issues", - "source": "https://github.com/Codeception/module-webdriver/tree/1.2.0" + "source": "https://github.com/Codeception/module-webdriver/tree/1.4.0" }, - "time": "2021-01-17T19:23:20+00:00" + "time": "2021-09-02T12:01:02+00:00" }, { "name": "codeception/phpunit-wrapper", @@ -9848,16 +11538,16 @@ }, { "name": "justinrainbow/json-schema", - "version": "5.2.10", + "version": "5.2.11", "source": { "type": "git", "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b" + "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b", - "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ab6744b7296ded80f8cc4f9509abbff393399aa", + "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa", "shasum": "" }, "require": { @@ -9912,9 +11602,9 @@ ], "support": { "issues": "https://github.com/justinrainbow/json-schema/issues", - "source": "https://github.com/justinrainbow/json-schema/tree/5.2.10" + "source": "https://github.com/justinrainbow/json-schema/tree/5.2.11" }, - "time": "2020-05-27T16:41:55+00:00" + "time": "2021-07-22T09:24:00+00:00" }, { "name": "myclabs/deep-copy", @@ -9976,25 +11666,25 @@ }, { "name": "n98/junit-xml", - "version": "1.0.0", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/cmuench/junit-xml.git", - "reference": "7df0dbaf413fcaa1a63ffbcef18654e7a4cceb46" + "reference": "0017dd92ac8cb619f02e32f4cffd768cfe327c73" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cmuench/junit-xml/zipball/7df0dbaf413fcaa1a63ffbcef18654e7a4cceb46", - "reference": "7df0dbaf413fcaa1a63ffbcef18654e7a4cceb46", + "url": "https://api.github.com/repos/cmuench/junit-xml/zipball/0017dd92ac8cb619f02e32f4cffd768cfe327c73", + "reference": "0017dd92ac8cb619f02e32f4cffd768cfe327c73", "shasum": "" }, "require-dev": { - "phpunit/phpunit": "3.7.*" + "phpunit/phpunit": "^9.5.0" }, "type": "library", "autoload": { - "psr-0": { - "N98\\JUnitXml": "src/" + "psr-4": { + "N98\\JUnitXml\\": "src/N98/JUnitXml" } }, "notification-url": "https://packagist.org/downloads/", @@ -10010,27 +11700,27 @@ "description": "JUnit XML Document generation library", "support": { "issues": "https://github.com/cmuench/junit-xml/issues", - "source": "https://github.com/cmuench/junit-xml/tree/master" + "source": "https://github.com/cmuench/junit-xml/tree/1.1.0" }, - "time": "2013-11-23T13:11:26+00:00" + "time": "2020-12-25T09:08:58+00:00" }, { "name": "overtrue/phplint", - "version": "2.3.5", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/overtrue/phplint.git", - "reference": "fa2a2ba64f997f268171a5b12d141b2fe94e5ad0" + "reference": "2d68ee8ab9083041a297cb6897ccec6290814c88" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/overtrue/phplint/zipball/fa2a2ba64f997f268171a5b12d141b2fe94e5ad0", - "reference": "fa2a2ba64f997f268171a5b12d141b2fe94e5ad0", + "url": "https://api.github.com/repos/overtrue/phplint/zipball/2d68ee8ab9083041a297cb6897ccec6290814c88", + "reference": "2d68ee8ab9083041a297cb6897ccec6290814c88", "shasum": "" }, "require": { "ext-json": "*", - "n98/junit-xml": "1.0.0", + "n98/junit-xml": "1.1.0", "php": ">=5.5.9", "symfony/console": "^3.2|^4.0|^5.0", "symfony/finder": "^3.0|^4.0|^5.0", @@ -10080,22 +11770,22 @@ ], "support": { "issues": "https://github.com/overtrue/phplint/issues", - "source": "https://github.com/overtrue/phplint/tree/2.3.5" + "source": "https://github.com/overtrue/phplint/tree/3.0.0" }, - "time": "2020-12-11T17:27:13+00:00" + "time": "2021-06-02T13:27:41+00:00" }, { "name": "phar-io/manifest", - "version": "2.0.1", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/phar-io/manifest.git", - "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133" + "reference": "97803eca37d319dfa7826cc2437fc020857acb53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/85265efd3af7ba3ca4b2a2c34dbfc5788dd29133", - "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53", "shasum": "" }, "require": { @@ -10140,9 +11830,9 @@ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", "support": { "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/master" + "source": "https://github.com/phar-io/manifest/tree/2.0.3" }, - "time": "2020-06-27T14:33:11+00:00" + "time": "2021-07-20T11:28:43+00:00" }, { "name": "phar-io/version", @@ -10189,20 +11879,24 @@ } ], "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.1.0" + }, "time": "2021-02-23T14:00:09+00:00" }, { "name": "php-webdriver/webdriver", - "version": "1.10.0", + "version": "1.11.1", "source": { "type": "git", "url": "https://github.com/php-webdriver/php-webdriver.git", - "reference": "cd9290b95b7651d495bd69253d6e3ef469a7f211" + "reference": "da16e39968f8dd5cfb7d07eef91dc2b731c69880" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/cd9290b95b7651d495bd69253d6e3ef469a7f211", - "reference": "cd9290b95b7651d495bd69253d6e3ef469a7f211", + "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/da16e39968f8dd5cfb7d07eef91dc2b731c69880", + "reference": "da16e39968f8dd5cfb7d07eef91dc2b731c69880", "shasum": "" }, "require": { @@ -10230,11 +11924,6 @@ "ext-SimpleXML": "For Firefox profile creation" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.8.x-dev" - } - }, "autoload": { "psr-4": { "Facebook\\WebDriver\\": "lib/" @@ -10256,20 +11945,24 @@ "selenium", "webdriver" ], - "time": "2021-02-25T13:38:09+00:00" + "support": { + "issues": "https://github.com/php-webdriver/php-webdriver/issues", + "source": "https://github.com/php-webdriver/php-webdriver/tree/1.11.1" + }, + "time": "2021-05-21T15:12:49+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "7.0.14", + "version": "7.0.15", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "bb7c9a210c72e4709cdde67f8b7362f672f2225c" + "reference": "819f92bba8b001d4363065928088de22f25a3a48" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/bb7c9a210c72e4709cdde67f8b7362f672f2225c", - "reference": "bb7c9a210c72e4709cdde67f8b7362f672f2225c", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/819f92bba8b001d4363065928088de22f25a3a48", + "reference": "819f92bba8b001d4363065928088de22f25a3a48", "shasum": "" }, "require": { @@ -10278,7 +11971,7 @@ "php": ">=7.2", "phpunit/php-file-iterator": "^2.0.2", "phpunit/php-text-template": "^1.2.1", - "phpunit/php-token-stream": "^3.1.1 || ^4.0", + "phpunit/php-token-stream": "^3.1.3 || ^4.0", "sebastian/code-unit-reverse-lookup": "^1.0.1", "sebastian/environment": "^4.2.2", "sebastian/version": "^2.0.1", @@ -10321,7 +12014,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/7.0.14" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/7.0.15" }, "funding": [ { @@ -10329,20 +12022,20 @@ "type": "github" } ], - "time": "2020-12-02T13:39:03+00:00" + "time": "2021-07-26T12:20:09+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "2.0.3", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "4b49fb70f067272b659ef0174ff9ca40fdaa6357" + "reference": "28af674ff175d0768a5a978e6de83f697d4a7f05" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/4b49fb70f067272b659ef0174ff9ca40fdaa6357", - "reference": "4b49fb70f067272b659ef0174ff9ca40fdaa6357", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/28af674ff175d0768a5a978e6de83f697d4a7f05", + "reference": "28af674ff175d0768a5a978e6de83f697d4a7f05", "shasum": "" }, "require": { @@ -10381,7 +12074,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/2.0.3" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/2.0.4" }, "funding": [ { @@ -10389,7 +12082,7 @@ "type": "github" } ], - "time": "2020-11-30T08:25:21+00:00" + "time": "2021-07-19T06:46:01+00:00" }, { "name": "phpunit/php-text-template", @@ -10497,16 +12190,16 @@ }, { "name": "phpunit/php-token-stream", - "version": "3.1.2", + "version": "3.1.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "472b687829041c24b25f475e14c2f38a09edf1c2" + "reference": "9c1da83261628cb24b6a6df371b6e312b3954768" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/472b687829041c24b25f475e14c2f38a09edf1c2", - "reference": "472b687829041c24b25f475e14c2f38a09edf1c2", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/9c1da83261628cb24b6a6df371b6e312b3954768", + "reference": "9c1da83261628cb24b6a6df371b6e312b3954768", "shasum": "" }, "require": { @@ -10544,7 +12237,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-token-stream/issues", - "source": "https://github.com/sebastianbergmann/php-token-stream/tree/3.1.2" + "source": "https://github.com/sebastianbergmann/php-token-stream/tree/3.1.3" }, "funding": [ { @@ -10553,20 +12246,20 @@ } ], "abandoned": true, - "time": "2020-11-30T08:38:46+00:00" + "time": "2021-07-26T12:15:06+00:00" }, { "name": "phpunit/phpunit", - "version": "8.5.15", + "version": "8.5.21", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "038d4196d8e8cb405cd5e82cedfe413ad6eef9ef" + "reference": "50a58a60b85947b0bee4c8ecfe0f4bbdcf20e984" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/038d4196d8e8cb405cd5e82cedfe413ad6eef9ef", - "reference": "038d4196d8e8cb405cd5e82cedfe413ad6eef9ef", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/50a58a60b85947b0bee4c8ecfe0f4bbdcf20e984", + "reference": "50a58a60b85947b0bee4c8ecfe0f4bbdcf20e984", "shasum": "" }, "require": { @@ -10578,12 +12271,12 @@ "ext-xml": "*", "ext-xmlwriter": "*", "myclabs/deep-copy": "^1.10.0", - "phar-io/manifest": "^2.0.1", + "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", "php": ">=7.2", "phpspec/prophecy": "^1.10.3", "phpunit/php-code-coverage": "^7.0.12", - "phpunit/php-file-iterator": "^2.0.2", + "phpunit/php-file-iterator": "^2.0.4", "phpunit/php-text-template": "^1.2.1", "phpunit/php-timer": "^2.1.2", "sebastian/comparator": "^3.0.2", @@ -10636,6 +12329,10 @@ "testing", "xunit" ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "source": "https://github.com/sebastianbergmann/phpunit/tree/8.5.21" + }, "funding": [ { "url": "https://phpunit.de/donate.html", @@ -10646,7 +12343,7 @@ "type": "github" } ], - "time": "2021-03-17T07:27:54+00:00" + "time": "2021-09-25T07:37:20+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -11099,25 +12796,22 @@ }, { "name": "softcreatr/jsonpath", - "version": "0.7.3", + "version": "0.7.5", "source": { "type": "git", "url": "https://github.com/SoftCreatR/JSONPath.git", - "reference": "e3ae75112a5247e3b27a7e0e72155eae261d8c72" + "reference": "008569bf80aa3584834f7890781576bc7b65afa7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/SoftCreatR/JSONPath/zipball/e3ae75112a5247e3b27a7e0e72155eae261d8c72", - "reference": "e3ae75112a5247e3b27a7e0e72155eae261d8c72", + "url": "https://api.github.com/repos/SoftCreatR/JSONPath/zipball/008569bf80aa3584834f7890781576bc7b65afa7", + "reference": "008569bf80aa3584834f7890781576bc7b65afa7", "shasum": "" }, "require": { "ext-json": "*", "php": ">=7.1" }, - "conflict": { - "phpunit/phpunit": "<7.0 || >= 10.0" - }, "replace": { "flow/jsonpath": "*" }, @@ -11151,31 +12845,94 @@ } ], "description": "JSONPath implementation for parsing, searching and flattening arrays", + "support": { + "email": "hello@1-2.dev", + "forum": "https://github.com/SoftCreatR/JSONPath/discussions", + "issues": "https://github.com/SoftCreatR/JSONPath/issues", + "source": "https://github.com/SoftCreatR/JSONPath" + }, "funding": [ { "url": "https://github.com/softcreatr", "type": "github" } ], - "time": "2021-03-08T14:18:21+00:00" + "time": "2021-06-02T22:15:26+00:00" }, { - "name": "symfony/browser-kit", - "version": "v5.2.4", + "name": "squizlabs/php_codesniffer", + "version": "3.6.0", "source": { "type": "git", - "url": "https://github.com/symfony/browser-kit.git", - "reference": "3ca3a57ce9860318b20a924fec5daf5c6db44d93" + "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", + "reference": "ffced0d2c8fa8e6cdc4d695a743271fab6c38625" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/3ca3a57ce9860318b20a924fec5daf5c6db44d93", - "reference": "3ca3a57ce9860318b20a924fec5daf5c6db44d93", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/ffced0d2c8fa8e6cdc4d695a743271fab6c38625", + "reference": "ffced0d2c8fa8e6cdc4d695a743271fab6c38625", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "bin": [ + "bin/phpcs", + "bin/phpcbf" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "lead" + } + ], + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", + "keywords": [ + "phpcs", + "standards" + ], + "support": { + "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", + "source": "https://github.com/squizlabs/PHP_CodeSniffer", + "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" + }, + "time": "2021-04-09T00:54:41+00:00" + }, + { + "name": "symfony/browser-kit", + "version": "v5.3.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/browser-kit.git", + "reference": "c1e3f64fcc631c96e2c5843b666db66679ced11c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/c1e3f64fcc631c96e2c5843b666db66679ced11c", + "reference": "c1e3f64fcc631c96e2c5843b666db66679ced11c", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/dom-crawler": "^4.4|^5.0" + "symfony/dom-crawler": "^4.4|^5.0", + "symfony/polyfill-php80": "^1.16" }, "require-dev": { "symfony/css-selector": "^4.4|^5.0", @@ -11211,6 +12968,9 @@ ], "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/browser-kit/tree/v5.3.4" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -11225,26 +12985,27 @@ "type": "tidelift" } ], - "time": "2021-02-22T06:48:33+00:00" + "time": "2021-07-21T12:40:44+00:00" }, { "name": "symfony/dom-crawler", - "version": "v4.4.20", + "version": "v4.4.30", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "be133557f1b0e6672367325b508e65da5513a311" + "reference": "4632ae3567746c7e915c33c67a2fb6ab746090c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/be133557f1b0e6672367325b508e65da5513a311", - "reference": "be133557f1b0e6672367325b508e65da5513a311", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/4632ae3567746c7e915c33c67a2fb6ab746090c4", + "reference": "4632ae3567746c7e915c33c67a2fb6ab746090c4", "shasum": "" }, "require": { "php": ">=7.1.3", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.0" + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16" }, "conflict": { "masterminds/html5": "<2.6" @@ -11281,6 +13042,9 @@ ], "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/dom-crawler/tree/v4.4.30" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -11295,20 +13059,20 @@ "type": "tidelift" } ], - "time": "2021-02-14T12:29:41+00:00" + "time": "2021-08-28T15:40:01+00:00" }, { "name": "symfony/yaml", - "version": "v5.2.5", + "version": "v5.3.6", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "298a08ddda623485208506fcee08817807a251dd" + "reference": "4500fe63dc9c6ffc32d3b1cb0448c329f9c814b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/298a08ddda623485208506fcee08817807a251dd", - "reference": "298a08ddda623485208506fcee08817807a251dd", + "url": "https://api.github.com/repos/symfony/yaml/zipball/4500fe63dc9c6ffc32d3b1cb0448c329f9c814b7", + "reference": "4500fe63dc9c6ffc32d3b1cb0448c329f9c814b7", "shasum": "" }, "require": { @@ -11353,6 +13117,9 @@ ], "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v5.3.6" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -11367,20 +13134,20 @@ "type": "tidelift" } ], - "time": "2021-03-06T07:59:01+00:00" + "time": "2021-07-29T06:20:01+00:00" }, { "name": "theseer/tokenizer", - "version": "1.2.0", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "75a63c33a8577608444246075ea0af0d052e452a" + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a", - "reference": "75a63c33a8577608444246075ea0af0d052e452a", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", "shasum": "" }, "require": { @@ -11409,7 +13176,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/master" + "source": "https://github.com/theseer/tokenizer/tree/1.2.1" }, "funding": [ { @@ -11417,7 +13184,7 @@ "type": "github" } ], - "time": "2020-07-12T23:59:07+00:00" + "time": "2021-07-28T10:34:58+00:00" } ], "aliases": [], @@ -11426,7 +13193,7 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": "^7.2.5", + "php": "^7.3", "ext-curl": "*", "ext-fileinfo": "*", "ext-json": "*", @@ -11434,8 +13201,5 @@ "ext-pdo": "*" }, "platform-dev": [], - "platform-overrides": { - "php": "7.2.5" - }, - "plugin-api-version": "1.1.0" + "plugin-api-version": "2.1.0" } diff --git a/config/app.php b/config/app.php index 55184884dc..e8d1ebae49 100755 --- a/config/app.php +++ b/config/app.php @@ -8,7 +8,6 @@ | be modified directly. */ - return [ /* @@ -164,8 +163,8 @@ return [ | Logging Detail |-------------------------------------------------------------------------- | - | By default, Laravel writes all log levels to storage. However, in your - | production environment, you may wish to configure the minimum severity that + | By default, Laravel writes all log levels to storage. However, in your + | production environment, you may wish to configure the minimum severity that | should be logged by editing your APP_LOG_LEVEL env config. | | Laravel will log all levels greater than or equal to the specified severity. @@ -176,9 +175,8 @@ return [ | "debug", "info", "notice", "warning", "error", "critical", "alert", "emergency" | */ - - 'log_level' => env('APP_LOG_LEVEL', 'error'), + 'log_level' => env('APP_LOG_LEVEL', 'error'), /* |-------------------------------------------------------------------------- @@ -195,7 +193,6 @@ return [ 'private_uploads' => storage_path().'/private_uploads', - /* |-------------------------------------------------------------------------- | ALLOW I-FRAMING @@ -209,7 +206,6 @@ return [ 'allow_iframing' => env('ALLOW_IFRAMING', false), - /* |-------------------------------------------------------------------------- | ENABLE HTTP Strict Transport Security (HSTS) @@ -269,7 +265,6 @@ return [ 'lock_passwords' => env('APP_LOCKED', false), - /* |-------------------------------------------------------------------------- | Minimum PHP version @@ -346,7 +341,6 @@ return [ App\Providers\SettingsServiceProvider::class, App\Providers\ValidationServiceProvider::class, - /* * Custom service provider */ @@ -354,7 +348,6 @@ return [ App\Providers\LdapServiceProvider::class, App\Providers\SamlServiceProvider::class, - ], /* @@ -379,6 +372,7 @@ return [ 'Config' => Illuminate\Support\Facades\Config::class, 'Cookie' => Illuminate\Support\Facades\Cookie::class, 'Crypt' => Illuminate\Support\Facades\Crypt::class, + 'Date' => Illuminate\Support\Facades\Date::class, 'DB' => Illuminate\Support\Facades\DB::class, 'Eloquent' => Illuminate\Database\Eloquent\Model::class, 'Event' => Illuminate\Support\Facades\Event::class, @@ -407,6 +401,7 @@ return [ 'Google2FA' => PragmaRX\Google2FALaravel\Facade::class, 'Image' => Intervention\Image\ImageServiceProvider::class, 'Carbon' => Carbon\Carbon::class, + 'Helper' => App\Helpers\Helper::class, // makes it much easier to use 'Helper::blah' in blades (which is where we usually use this) ], diff --git a/config/auth.php b/config/auth.php index 24ecf6d184..4fc626a964 100644 --- a/config/auth.php +++ b/config/auth.php @@ -1,14 +1,5 @@ App\Models\User::class, ], + // 'users' => [ + // 'driver' => 'database', + // 'table' => 'users', + // ], ], /* @@ -103,10 +98,11 @@ return [ 'email' => 'auth.emails.password', 'table' => 'password_resets', 'expire' => env('RESET_PASSWORD_LINK_EXPIRES', 900), - 'throttle' => [ + 'throttle' => 60, 'max_attempts' => env('LOGIN_MAX_ATTEMPTS', 5), - 'lockout_duration' => env('LOGIN_LOCKOUT_DURATION', 60) - ], + + 'lockout_duration' => env('LOGIN_LOCKOUT_DURATION', 60), + ], ], @@ -123,5 +119,4 @@ return [ 'password_timeout' => 10800, - ]; diff --git a/config/backup.php b/config/backup.php index f63516c077..479b1db6aa 100644 --- a/config/backup.php +++ b/config/backup.php @@ -8,7 +8,6 @@ | be modified directly. */ - // This is janky, but necessary to figure out whether to include the .env in the backup $included_dirs = [ base_path('public/uploads'), @@ -18,7 +17,7 @@ $included_dirs = [ ]; -if (env('BACKUP_ENV')=='true') { +if (env('BACKUP_ENV') == 'true') { $included_dirs[] = base_path('.env'); } @@ -212,4 +211,4 @@ return [ ], ], -]; \ No newline at end of file +]; diff --git a/config/broadcasting.php b/config/broadcasting.php index e3f0576864..2d529820cc 100644 --- a/config/broadcasting.php +++ b/config/broadcasting.php @@ -1,15 +1,5 @@ env('BROADCAST_DRIVER', 'pusher'), + 'default' => env('BROADCAST_DRIVER', 'null'), /* |-------------------------------------------------------------------------- @@ -40,14 +32,20 @@ return [ 'pusher' => [ 'driver' => 'pusher', - 'key' => env('PUSHER_KEY'), - 'secret' => env('PUSHER_SECRET'), + 'key' => env('PUSHER_APP_KEY'), + 'secret' => env('PUSHER_APP_SECRET'), 'app_id' => env('PUSHER_APP_ID'), 'options' => [ - // + 'cluster' => env('PUSHER_APP_CLUSTER'), + 'useTLS' => true, ], ], + 'ably' => [ + 'driver' => 'ably', + 'key' => env('ABLY_KEY'), + ], + 'redis' => [ 'driver' => 'redis', 'connection' => 'default', @@ -57,6 +55,10 @@ return [ 'driver' => 'log', ], + 'null' => [ + 'driver' => 'null', + ], + ], ]; diff --git a/config/cache.php b/config/cache.php index c1af7b98ce..de0e53401f 100644 --- a/config/cache.php +++ b/config/cache.php @@ -1,14 +1,6 @@ [ @@ -44,12 +39,14 @@ return [ 'array' => [ 'driver' => 'array', + 'serialize' => false, ], 'database' => [ 'driver' => 'database', - 'table' => 'cache', + 'table' => 'cache', 'connection' => null, + 'lock_connection' => null, ], 'file' => [ @@ -58,7 +55,15 @@ return [ ], 'memcached' => [ - 'driver' => 'memcached', + 'driver' => 'memcached', + 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), + 'sasl' => [ + env('MEMCACHED_USERNAME'), + env('MEMCACHED_PASSWORD'), + ], + 'options' => [ + // Memcached::OPT_CONNECT_TIMEOUT => 2000, + ], 'servers' => [ [ 'host' => env('MEMCACHED_HOST', '127.0.0.1'), @@ -71,6 +76,16 @@ return [ 'redis' => [ 'driver' => 'redis', 'connection' => 'default', + 'lock_connection' => 'default', + ], + + 'dynamodb' => [ + 'driver' => 'dynamodb', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'), + 'endpoint' => env('DYNAMODB_ENDPOINT'), ], ], @@ -86,6 +101,6 @@ return [ | */ - 'prefix' => env('CACHE_PREFIX', 'snipeit'), + 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache'), ]; diff --git a/config/compile.php b/config/compile.php index f5fe56d0d5..086b36545a 100644 --- a/config/compile.php +++ b/config/compile.php @@ -8,8 +8,6 @@ | be modified directly. */ - - return [ /* diff --git a/config/cors.php b/config/cors.php index 0aa4b8cef4..f09ab4979f 100644 --- a/config/cors.php +++ b/config/cors.php @@ -1,48 +1,44 @@ false, - 'allowedOrigins' => $allowed_origins, - 'allowedOriginsPatterns' => [], + + 'allowedOrigins' => ['*'], + 'allowedHeaders' => ['*'], + 'allowedMethods' => ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'], - 'exposedHeaders' => [], + 'maxAge' => 0, + /* + |-------------------------------------------------------------------------- + | Cross-Origin Resource Sharing (CORS) Configuration + |-------------------------------------------------------------------------- + | + | Here you may configure your settings for cross-origin resource sharing + | or "CORS". This determines what cross-origin operations may execute + | in web browsers. You are free to adjust these settings as needed. + | + | To learn more: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS + | + */ + + 'paths' => ['api/*', 'sanctum/csrf-cookie'], + + 'allowed_methods' => ['*'], + + 'allowed_origins' => ['*'], + + 'allowed_origins_patterns' => [], + + 'allowed_headers' => ['*'], + + 'exposed_headers' => [], + + 'max_age' => 0, + + 'supports_credentials' => false, + ]; diff --git a/config/database.php b/config/database.php index f32810326a..9d94454db2 100755 --- a/config/database.php +++ b/config/database.php @@ -8,7 +8,6 @@ | be modified directly. */ - return [ /* @@ -79,7 +78,7 @@ return [ 'prefix' => env('DB_PREFIX', null), 'strict' => false, 'engine' => 'InnoDB', - 'unix_socket' => env('DB_SOCKET',''), + 'unix_socket' => env('DB_SOCKET', ''), 'dump' => [ 'dump_binary_path' => env('DB_DUMP_PATH', '/usr/local/bin'), // only the path, so without 'mysqldump' 'use_single_transaction' => false, @@ -96,8 +95,8 @@ return [ PDO::MYSQL_ATTR_SSL_KEY => env('DB_SSL_KEY_PATH'), // /path/to/key.pem PDO::MYSQL_ATTR_SSL_CERT => env('DB_SSL_CERT_PATH'), // /path/to/cert.pem PDO::MYSQL_ATTR_SSL_CA => env('DB_SSL_CA_PATH'), // /path/to/ca.pem - PDO::MYSQL_ATTR_SSL_CIPHER => env('DB_SSL_CIPHER') - ]) : [] + PDO::MYSQL_ATTR_SSL_CIPHER => env('DB_SSL_CIPHER'), + ]) : [], ], 'pgsql' => [ diff --git a/config/debugbar.php b/config/debugbar.php index aeb5005615..ca7848678c 100644 --- a/config/debugbar.php +++ b/config/debugbar.php @@ -1,6 +1,6 @@ array( + 'storage' => [ 'enabled' => true, 'driver' => 'file', // redis, file, pdo - 'path' => storage_path() . '/debugbar', // For file driver + 'path' => storage_path().'/debugbar', // For file driver 'connection' => null, // Leave null for default connection (Redis/PDO) - ), + ], /* |-------------------------------------------------------------------------- @@ -81,7 +81,7 @@ return array( | */ - 'collectors' => array( + 'collectors' => [ 'phpinfo' => true, // Php version 'messages' => true, // Messages 'time' => true, // Time Datalogger @@ -102,7 +102,7 @@ return array( 'auth' => true, // Display Laravel authentication status 'gate' => true, // Display Laravel Gate checks 'session' => true, // Display session data - ), + ], /* |-------------------------------------------------------------------------- @@ -113,33 +113,33 @@ return array( | */ - 'options' => array( - 'auth' => array( + 'options' => [ + 'auth' => [ 'show_name' => false, // Also show the users name/email in the debugbar - ), - 'db' => array( + ], + 'db' => [ 'with_params' => true, // Render SQL with the parameters substituted 'timeline' => true, // Add the queries to the timeline 'backtrace' => true, // EXPERIMENTAL: Use a backtrace to find the origin of the query in your files. - 'explain' => array( // EXPERIMENTAL: Show EXPLAIN output on queries + 'explain' => [ // EXPERIMENTAL: Show EXPLAIN output on queries 'enabled' => false, - 'types' => array('SELECT'), // array('SELECT', 'INSERT', 'UPDATE', 'DELETE'); for MySQL 5.6.3+ - ), + 'types' => ['SELECT'], // array('SELECT', 'INSERT', 'UPDATE', 'DELETE'); for MySQL 5.6.3+ + ], 'hints' => true, // Show hints for common mistakes - ), - 'mail' => array( - 'full_log' => false - ), - 'views' => array( + ], + 'mail' => [ + 'full_log' => false, + ], + 'views' => [ 'data' => false, //Note: Can slow down the application, because the data can be quite large.. - ), - 'route' => array( - 'label' => true // show complete route on bar - ), - 'logs' => array( - 'file' => null - ), - ), + ], + 'route' => [ + 'label' => true, // show complete route on bar + ], + 'logs' => [ + 'file' => null, + ], + ], /* |-------------------------------------------------------------------------- @@ -166,4 +166,4 @@ return array( */ 'route_prefix' => '_debugbar', -); +]; diff --git a/config/filesystems.php b/config/filesystems.php index b4bf6303e4..50b2675589 100644 --- a/config/filesystems.php +++ b/config/filesystems.php @@ -105,4 +105,4 @@ $config = [ // (by default, the PUBLIC_FILESYSTEM DISK is 'local_public', in the public/uploads directory) $config['disks']['public'] = $config['disks'][env('PUBLIC_FILESYSTEM_DISK','local_public')]; -return $config; +return $config; \ No newline at end of file diff --git a/config/image.php b/config/image.php index 1b9dbaaf06..9458b9c1cc 100644 --- a/config/image.php +++ b/config/image.php @@ -8,8 +8,7 @@ | be modified directly. */ - -return array( +return [ /* |-------------------------------------------------------------------------- @@ -26,4 +25,4 @@ return array( 'driver' => env('IMAGE_LIB', 'gd'), -); +]; diff --git a/config/logging.php b/config/logging.php index 1f6538e1b8..1aa06aa30f 100644 --- a/config/logging.php +++ b/config/logging.php @@ -1,8 +1,10 @@ env('LOG_CHANNEL', 'stack'), /* @@ -35,68 +38,68 @@ $config = [ 'stack' => [ 'driver' => 'stack', 'channels' => ['single'], + 'ignore_exceptions' => false, ], 'single' => [ 'driver' => 'single', 'path' => storage_path('logs/laravel.log'), - 'level' => env('APP_LOG_LEVEL', 'error'), + 'level' => env('LOG_LEVEL', 'debug'), ], - 'daily' => [ 'driver' => 'daily', 'path' => storage_path('logs/laravel.log'), - 'level' => 'debug', - 'days' => env('APP_LOG_MAX_FILES', 5), + 'level' => env('LOG_LEVEL', 'debug'), + 'days' => 14, ], - 'rollbar' => [ - 'driver' => 'monolog', - 'handler' => \Rollbar\Laravel\MonologHandler::class, - 'access_token' => env('ROLLBAR_TOKEN'), - 'level' => env('APP_LOG_LEVEL', 'debug'), - ], - - 'slack' => [ 'driver' => 'slack', 'url' => env('LOG_SLACK_WEBHOOK_URL'), 'username' => 'Laravel Log', 'emoji' => ':boom:', - 'level' => 'critical', + 'level' => env('LOG_LEVEL', 'critical'), + ], + + 'papertrail' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => SyslogUdpHandler::class, + 'handler_with' => [ + 'host' => env('PAPERTRAIL_URL'), + 'port' => env('PAPERTRAIL_PORT'), + ], ], 'stderr' => [ 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), 'handler' => StreamHandler::class, + 'formatter' => env('LOG_STDERR_FORMATTER'), 'with' => [ 'stream' => 'php://stderr', ], ], - 'stdout' => [ - 'driver' => 'monolog', - 'handler' => StreamHandler::class, - 'with' => [ 'stream' => 'php://stdout', ], - ], - 'syslog' => [ 'driver' => 'syslog', - 'level' => env('APP_LOG_LEVEL', 'error'), + 'level' => env('LOG_LEVEL', 'debug'), ], 'errorlog' => [ 'driver' => 'errorlog', - 'level' => env('APP_LOG_LEVEL', 'error'), + 'level' => env('LOG_LEVEL', 'debug'), + ], + + 'null' => [ + 'driver' => 'monolog', + 'handler' => NullHandler::class, + ], + + 'emergency' => [ + 'path' => storage_path('logs/laravel.log'), ], ], ]; - -if ((env('APP_ENV')=='production') && env('ROLLBAR_TOKEN')) { - array_push($config['channels']['stack']['channels'], 'rollbar'); -} - - -return $config; diff --git a/config/mail.php b/config/mail.php index 9c2aac439f..d47d182ed3 100755 --- a/config/mail.php +++ b/config/mail.php @@ -8,7 +8,6 @@ | be modified directly. */ - return [ /* @@ -70,13 +69,11 @@ return [ | */ - 'from' => - [ + 'from' => [ 'address' => env('MAIL_FROM_ADDR', null), - 'name' => env('MAIL_FROM_NAME', null) + 'name' => env('MAIL_FROM_NAME', null), ], - /* |-------------------------------------------------------------------------- | Global "Reply-To" Address @@ -84,13 +81,13 @@ return [ | | You may wish for all e-mails sent by your application to have a different "Reply-to" | address than the "From" address. If this is left blank, the application will use - | your MAIL_FROM information. + | your MAIL_FROM information. | */ 'reply_to' => [ - 'address' => env('MAIL_REPLYTO_ADDR',null), - 'name' => env('MAIL_REPLYTO_NAME', null) + 'address' => env('MAIL_REPLYTO_ADDR', null), + 'name' => env('MAIL_REPLYTO_NAME', null), ], /* @@ -145,7 +142,6 @@ return [ 'sendmail' => '/usr/sbin/sendmail -bs', - 'markdown' => [ 'theme' => 'default', 'paths' => [ diff --git a/config/passport.php b/config/passport.php index b8342a6b59..d410cfe20e 100644 --- a/config/passport.php +++ b/config/passport.php @@ -1,4 +1,5 @@ env('PASSPORT_PRIVATE_KEY'), 'public_key' => env('PASSPORT_PUBLIC_KEY'), 'expiration_years' => env('API_TOKEN_EXPIRATION_YEARS', 20), -]; \ No newline at end of file +]; diff --git a/config/permissions.php b/config/permissions.php index 0176dc13ba..57aa4a3232 100644 --- a/config/permissions.php +++ b/config/permissions.php @@ -6,639 +6,625 @@ |-------------------------------------------------------------------------- */ +return [ -return array( - - 'Global' => array( - array( + 'Global' => [ + [ 'permission' => 'superuser', 'label' => 'Super User', 'note' => 'Determines whether the user has full access to all aspects of the admin. This setting overrides any more specific permissions throughout the system. ', 'display' => true, - ), - ), + ], + ], - 'Admin' => array( - array( + 'Admin' => [ + [ 'permission' => 'admin', 'label' => '', 'note' => 'Determines whether the user has access to most aspects of the admin. ', 'display' => true, - ) - ), + ], + ], - 'CSV Import' => array( - array( + 'CSV Import' => [ + [ 'permission' => 'import', 'label' => '', 'note' => 'This will allow users to import even if access to users, assets, etc is denied elsewhere.', 'display' => true, - ) - ), + ], + ], - 'Reports' => array( - array( + 'Reports' => [ + [ 'permission' => 'reports.view', 'label' => 'View', 'note' => 'Determines whether the user has the ability to view reports.', 'display' => true, - ), - ), + ], + ], - 'Assets' => array( - array( + 'Assets' => [ + [ 'permission' => 'assets.view', 'label' => 'View ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'assets.create', 'label' => 'Create ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'assets.edit', 'label' => 'Edit ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'assets.delete', 'label' => 'Delete ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'assets.checkout', 'label' => 'Checkout ', 'note' => '', 'display' => false, - ), + ], - array( + [ 'permission' => 'assets.checkin', 'label' => 'Checkin ', 'note' => '', 'display' => true, - ), + ], - array( + [ 'permission' => 'assets.checkout', 'label' => 'Checkout ', 'note' => '', 'display' => true, - ), + ], - array( + [ 'permission' => 'assets.audit', 'label' => 'Audit ', 'note' => 'Allows the user to mark an asset as physically inventoried.', 'display' => true, - ), + ], - - array( + [ 'permission' => 'assets.view.requestable', 'label' => 'View Requestable Assets', 'note' => '', 'display' => true, - ), + ], - ), + ], - 'Accessories' => array( - array( + 'Accessories' => [ + [ 'permission' => 'accessories.view', 'label' => 'View ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'accessories.create', 'label' => 'Create ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'accessories.edit', 'label' => 'Edit ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'accessories.delete', 'label' => 'Delete ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'accessories.checkout', 'label' => 'Checkout ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'accessories.checkin', 'label' => 'Checkin ', 'note' => '', 'display' => true, - ), - ), + ], + ], - 'Consumables' => array( - array( + 'Consumables' => [ + [ 'permission' => 'consumables.view', 'label' => 'View', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'consumables.create', 'label' => 'Create ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'consumables.edit', 'label' => 'Edit ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'consumables.delete', 'label' => 'Delete ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'consumables.checkout', 'label' => 'Checkout ', 'note' => '', 'display' => true, - ), - ), + ], + ], - - 'Licenses' => array( - array( + 'Licenses' => [ + [ 'permission' => 'licenses.view', 'label' => 'View', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'licenses.create', 'label' => 'Create ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'licenses.edit', 'label' => 'Edit ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'licenses.delete', 'label' => 'Delete ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'licenses.checkout', 'label' => 'Checkout ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'licenses.keys', 'label' => 'View License Keys', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'licenses.files', 'label' => 'View and Modify License Files', 'note' => '', 'display' => true, - ), - ), + ], + ], - - 'Components' => array( - array( + 'Components' => [ + [ 'permission' => 'components.view', 'label' => 'View', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'components.create', 'label' => 'Create ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'components.edit', 'label' => 'Edit ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'components.delete', 'label' => 'Delete ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'components.checkout', 'label' => 'Checkout ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'components.checkin', 'label' => 'Checkin ', 'note' => '', 'display' => true, - ), + ], - ), + ], - 'Kits' => array( - array( + 'Kits' => [ + [ 'permission' => 'kits.view', 'label' => 'View ', 'note' => 'These are predefined kits that can be used to quickly checkout assets, licenses, etc.', 'display' => true, - ), - array( + ], + [ 'permission' => 'kits.create', 'label' => 'Create ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'kits.edit', 'label' => 'Edit ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'kits.delete', 'label' => 'Delete ', 'note' => '', 'display' => true, - ), + ], - array( + [ 'permission' => 'kits.checkout', 'label' => 'Checkout ', 'note' => '', 'display' => true, - ), - ), + ], + ], - - 'Users' => array( - array( + 'Users' => [ + [ 'permission' => 'users.view', 'label' => 'View ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'users.create', 'label' => 'Create Users', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'users.edit', 'label' => 'Edit Users', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'users.delete', 'label' => 'Delete Users', 'note' => '', 'display' => true, - ), + ], - ), + ], - - 'Models' => array( - array( + 'Models' => [ + [ 'permission' => 'models.view', 'label' => 'View ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'models.create', 'label' => 'Create ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'models.edit', 'label' => 'Edit ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'models.delete', 'label' => 'Delete ', 'note' => '', 'display' => true, - ), + ], - ), + ], - 'Categories' => array( - array( + 'Categories' => [ + [ 'permission' => 'categories.view', 'label' => 'View ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'categories.create', 'label' => 'Create ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'categories.edit', 'label' => 'Edit ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'categories.delete', 'label' => 'Delete ', 'note' => '', 'display' => true, - ), - ), + ], + ], - 'Departments' => array( - array( + 'Departments' => [ + [ 'permission' => 'departments.view', 'label' => 'View ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'departments.create', 'label' => 'Create ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'departments.edit', 'label' => 'Edit ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'departments.delete', 'label' => 'Delete ', 'note' => '', 'display' => true, - ), - ), + ], + ], - 'Status Labels' => array( - array( + 'Status Labels' => [ + [ 'permission' => 'statuslabels.view', 'label' => 'View ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'statuslabels.create', 'label' => 'Create ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'statuslabels.edit', 'label' => 'Edit ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'statuslabels.delete', 'label' => 'Delete ', 'note' => '', 'display' => true, - ), - ), + ], + ], - 'Custom Fields' => array( - array( + 'Custom Fields' => [ + [ 'permission' => 'customfields.view', 'label' => 'View', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'customfields.create', 'label' => 'Create', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'customfields.edit', 'label' => 'Edit', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'customfields.delete', 'label' => 'Delete', 'note' => '', 'display' => true, - ), - ), + ], + ], - 'Suppliers' => array( - array( + 'Suppliers' => [ + [ 'permission' => 'suppliers.view', 'label' => 'View ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'suppliers.create', 'label' => 'Create ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'suppliers.edit', 'label' => 'Edit ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'suppliers.delete', 'label' => 'Delete ', 'note' => '', 'display' => true, - ), - ), + ], + ], - - 'Manufacturers' => array( - array( + 'Manufacturers' => [ + [ 'permission' => 'manufacturers.view', 'label' => 'View ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'manufacturers.create', 'label' => 'Create ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'manufacturers.edit', 'label' => 'Edit ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'manufacturers.delete', 'label' => 'Delete ', 'note' => '', 'display' => true, - ), - ), + ], + ], - 'Depreciations' => array( - array( + 'Depreciations' => [ + [ 'permission' => 'depreciations.view', 'label' => 'View ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'depreciations.create', 'label' => 'Create ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'depreciations.edit', 'label' => 'Edit ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'depreciations.delete', 'label' => 'Delete ', 'note' => '', 'display' => true, - ), - ), + ], + ], - 'Locations' => array( - array( + 'Locations' => [ + [ 'permission' => 'locations.view', 'label' => 'View ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'locations.create', 'label' => 'Create ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'locations.edit', 'label' => 'Edit ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'locations.delete', 'label' => 'Delete ', 'note' => '', 'display' => true, - ), - ), + ], + ], - 'Companies' => array( - array( + 'Companies' => [ + [ 'permission' => 'companies.view', 'label' => 'View ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'companies.create', 'label' => 'Create ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'companies.edit', 'label' => 'Edit ', 'note' => '', 'display' => true, - ), - array( + ], + [ 'permission' => 'companies.delete', 'label' => 'Delete ', 'note' => '', 'display' => true, - ), - ), + ], + ], - - - - 'Self' => array( - array( + 'Self' => [ + [ 'permission' => 'self.two_factor', 'label' => 'Two-Factor Authentication', 'note' => 'The user may disable/enable two-factor authentication themselves if two-factor is enabled and set to selective.', 'display' => true, - ), + ], - array( + [ 'permission' => 'self.api', 'label' => 'Create API Keys', 'note' => 'The user create personal API keys to utilize the REST API.', 'display' => true, - ), + ], - array( + [ 'permission' => 'self.edit_location', 'label' => 'Profile Edit Location', 'note' => 'The user may update their own location in their profile. Note that this is not affected by any additional Users permissions you grant to this user or group.', 'display' => true, - ), + ], - array( + [ 'permission' => 'self.checkout_assets', 'label' => 'Self-Checkout', 'note' => 'This user may check out assets that are marked for self-checkout.', 'display' => true, - ), + ], - ), + ], - - - - -); +]; diff --git a/config/queue.php b/config/queue.php index 6c2b7d2e17..25ea5a8193 100644 --- a/config/queue.php +++ b/config/queue.php @@ -4,19 +4,16 @@ return [ /* |-------------------------------------------------------------------------- - | Default Queue Driver + | Default Queue Connection Name |-------------------------------------------------------------------------- | - | The Laravel queue API supports a variety of back-ends via an unified + | Laravel's queue API supports an assortment of back-ends via a single | API, giving you convenient access to each back-end using the same - | syntax for each one. Here you may set the default queue driver. - | - | Supported: "null", "sync", "database", "beanstalkd", - | "sqs", "redis" + | syntax for every one. Here you may define a default connection. | */ - 'default' => env('QUEUE_DRIVER', 'sync'), + 'default' => env('QUEUE_CONNECTION', 'sync'), /* |-------------------------------------------------------------------------- @@ -27,6 +24,8 @@ return [ | is used by your application. A default configuration has been added | for each back-end shipped with Laravel. You are free to add more. | + | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null" + | */ 'connections' => [ @@ -37,32 +36,39 @@ return [ 'database' => [ 'driver' => 'database', - 'table' => 'jobs', - 'queue' => 'default', - 'expire' => 60, + 'table' => 'jobs', + 'queue' => 'default', + 'retry_after' => 90, + 'after_commit' => false, ], 'beanstalkd' => [ 'driver' => 'beanstalkd', - 'host' => 'localhost', - 'queue' => 'default', - 'ttr' => 60, + 'host' => 'localhost', + 'queue' => 'default', + 'retry_after' => 90, + 'block_for' => 0, + 'after_commit' => false, ], 'sqs' => [ 'driver' => 'sqs', - 'key' => 'your-public-key', - 'secret' => 'your-secret-key', - 'prefix' => 'https://sqs.us-east-1.amazonaws.com/your-account-id', - 'queue' => 'your-queue-name', - 'region' => 'us-east-1', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), + 'queue' => env('SQS_QUEUE', 'default'), + 'suffix' => env('SQS_SUFFIX'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'after_commit' => false, ], 'redis' => [ - 'driver' => 'redis', + 'driver' => 'redis', 'connection' => 'default', - 'queue' => 'default', - 'expire' => 60, + 'queue' => env('REDIS_QUEUE', 'default'), + 'retry_after' => 90, + 'block_for' => null, + 'after_commit' => false, ], ], @@ -79,8 +85,9 @@ return [ */ 'failed' => [ + 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), 'database' => env('DB_CONNECTION', 'mysql'), - 'table' => 'failed_jobs', + 'table' => 'failed_jobs', ], ]; diff --git a/config/services.php b/config/services.php index c5eb915b55..dd594e67cb 100644 --- a/config/services.php +++ b/config/services.php @@ -8,7 +8,6 @@ | be modified directly. */ - return [ /* @@ -49,10 +48,9 @@ return [ 'app_key' => env('STUNNING_APP_KEY'), 'stripe_id' => env('STUNNING_STRIPE_ID'), ], - + 'google' => [ - 'maps_api_key' => env('GOOGLE_MAPS_API') + 'maps_api_key' => env('GOOGLE_MAPS_API'), ], - ]; diff --git a/config/session.php b/config/session.php index d6710975a6..d867229956 100644 --- a/config/session.php +++ b/config/session.php @@ -8,8 +8,6 @@ | be modified directly. */ - - return [ /* @@ -67,7 +65,7 @@ return [ | */ - 'files' => (env('SESSION_PATH')!='' ? env('SESSION_PATH') : storage_path('framework/sessions')), + 'files' => (env('SESSION_PATH') != '' ? env('SESSION_PATH') : storage_path('framework/sessions')), /* |-------------------------------------------------------------------------- @@ -158,6 +156,6 @@ return [ | */ - 'secure' => env('SECURE_COOKIES', false) + 'secure' => env('SECURE_COOKIES', false), ]; diff --git a/config/trustedproxy.php b/config/trustedproxy.php index 04e90ac2d2..a3d80418ba 100644 --- a/config/trustedproxy.php +++ b/config/trustedproxy.php @@ -8,7 +8,6 @@ | be modified directly. */ - return [ /* @@ -40,13 +39,13 @@ return [ * To trust one or more specific proxies that connect * directly to your server, use an array of IP addresses: */ - # 'proxies' => ['192.168.1.1'], + // 'proxies' => ['192.168.1.1'], /* * Or, to trust all proxies that connect * directly to your server, use a "*" */ - # 'proxies' => '*', + // 'proxies' => '*', /* * Which headers to use to detect proxy related data (For, Host, Proto, Port) @@ -60,5 +59,4 @@ return [ */ 'headers' => Illuminate\Http\Request::HEADER_X_FORWARDED_ALL, - ]; diff --git a/config/version.php b/config/version.php index 14f20c7a76..008ac13252 100644 --- a/config/version.php +++ b/config/version.php @@ -1,10 +1,10 @@ 'v5.1.5', - 'full_app_version' => 'v5.1.5 - build 6055-gd9d5b4d73', - 'build_version' => '6055', + 'app_version' => 'v6-pre-alpha', + 'full_app_version' => 'v6-pre-alpha - build 6109-gace7abc1a', + 'build_version' => '6109', 'prerelease_version' => '', - 'hash_version' => 'gd9d5b4d73', - 'full_hash' => 'v5.1.5-17-gd9d5b4d73', - 'branch' => 'master', + 'hash_version' => 'gace7abc1a', + 'full_hash' => 'v6-pre-alpha-71-gace7abc1a', + 'branch' => 'develop-v6-integration', ); \ No newline at end of file diff --git a/database/factories/AccessoryFactory.php b/database/factories/AccessoryFactory.php index 9e69004862..84edcb705c 100644 --- a/database/factories/AccessoryFactory.php +++ b/database/factories/AccessoryFactory.php @@ -1,5 +1,9 @@ define(App\Models\Accessory::class, function (Faker\Generator $faker) { - return [ - 'user_id' => 1, - 'model_number' => $faker->numberBetween(1000000, 50000000), - 'location_id' => rand(1,5), - ]; -}); +class AccessoryFactory extends Factory +{ + /** + * The name of the factory's corresponding model. + * + * @var string + */ + protected $model = \App\Models\Accessory::class; -$factory->state(App\Models\Accessory::class, 'apple-bt-keyboard', function ($faker) { + /** + * Define the model's default state. + * + * @return array + */ + public function definition() + { + return [ + 'user_id' => 1, + 'model_number' => $this->faker->numberBetween(1000000, 50000000), + 'location_id' => rand(1, 5), + ]; + } - return [ - 'name' => 'Bluetooth Keyboard', - 'image' => 'bluetooth.jpg', - 'category_id' => 8, - 'manufacturer_id' => 1, - 'qty' => 10, - 'min_amt' => 2, - 'supplier_id' => rand(1,5) - ]; + public function appleBtKeyboard() + { + return $this->state(function () { + return [ + 'name' => 'Bluetooth Keyboard', + 'image' => 'bluetooth.jpg', + 'category_id' => 8, + 'manufacturer_id' => 1, + 'qty' => 10, + 'min_amt' => 2, + 'supplier_id' => rand(1, 5), + ]; + }); + } -}); + public function appleUsbKeyboard() + { + return $this->state(function () { + return [ + 'name' => 'USB Keyboard', + 'image' => 'usb-keyboard.jpg', + 'category_id' => 8, + 'manufacturer_id' => 1, + 'qty' => 15, + 'min_amt' => 2, + 'supplier_id' => rand(1, 5), + ]; + }); + } -$factory->state(App\Models\Accessory::class, 'apple-usb-keyboard', function ($faker) { - - return [ - 'name' => 'USB Keyboard', - 'image' => 'usb-keyboard.jpg', - 'category_id' => 8, - 'manufacturer_id' => 1, - 'qty' => 15, - 'min_amt' => 2, - 'supplier_id' => rand(1,5) - ]; - -}); - -$factory->state(App\Models\Accessory::class, 'apple-mouse', function ($faker) { - - return [ - 'name' => 'Magic Mouse', - 'image' => 'magic-mouse.jpg', - 'category_id' => 9, - 'manufacturer_id' => 1, - 'qty' => 13, - 'min_amt' => 2, - 'supplier_id' => rand(1,5) - ]; - -}); - -$factory->state(App\Models\Accessory::class, 'microsoft-mouse', function ($faker) { - - return [ - 'name' => 'Sculpt Comfort Mouse', - 'image' => 'comfort-mouse.jpg', - 'category_id' => 9, - 'manufacturer_id' => 2, - 'qty' => 13, - 'min_amt' => 2 - ]; - -}); + public function appleMouse() + { + return $this->state(function () { + return [ + 'name' => 'Magic Mouse', + 'image' => 'magic-mouse.jpg', + 'category_id' => 9, + 'manufacturer_id' => 1, + 'qty' => 13, + 'min_amt' => 2, + 'supplier_id' => rand(1, 5), + ]; + }); + } + public function microsoftMouse() + { + return $this->state(function () { + return [ + 'name' => 'Sculpt Comfort Mouse', + 'image' => 'comfort-mouse.jpg', + 'category_id' => 9, + 'manufacturer_id' => 2, + 'qty' => 13, + 'min_amt' => 2, + ]; + }); + } +} diff --git a/database/factories/ActionLogFactory.php b/database/factories/ActionLogFactory.php deleted file mode 100644 index d1a8ece7dd..0000000000 --- a/database/factories/ActionLogFactory.php +++ /dev/null @@ -1,151 +0,0 @@ -define(Actionlog::class, function (Faker\Generator $faker) { - return [ - 'note' => 'Sample checkout from DB seeder!', - ]; -}); - - -$factory->defineAs(App\Models\Actionlog::class, 'asset-upload', function ($faker) { - $asset = factory(App\Models\Asset::class)->create(); - return [ - 'item_type' => get_class($asset), - 'item_id' => 1, - 'user_id' => 1, - 'filename' => $faker->word, - 'action_type' => 'uploaded' - ]; -}); - - -$factory->defineAs(Actionlog::class, 'asset-checkout-user', function (Faker\Generator $faker) { - $target = User::inRandomOrder()->first(); - $item = Asset::inRandomOrder()->RTD()->first(); - $user_id = rand(1,2); // keep it simple - make it one of the two superadmins - $asset = App\Models\Asset::where('id', $item->id) - ->update( - [ - 'assigned_to' => $target->id, - 'assigned_type' => App\Models\User::class, - 'assigned_to' => $target->location_id, - ] - ); - - return [ - 'created_at' => $faker->dateTimeBetween('-1 years','now', date_default_timezone_get()), - 'user_id' => $user_id, - 'action_type' => 'checkout', - 'item_id' => $item->id, - 'item_type' => App\Models\Asset::class, - 'target_id' => $target->id, - 'target_type' => get_class($target), - - - ]; -}); - -$factory->defineAs(Actionlog::class, 'asset-checkout-location', function (Faker\Generator $faker) { - $target = Location::inRandomOrder()->first(); - $item = Asset::inRandomOrder()->RTD()->first(); - $user_id = rand(1,2); // keep it simple - make it one of the two superadmins - $asset = App\Models\Asset::where('id', $item->id) - ->update( - [ - 'assigned_to' => $target->id, - 'assigned_type' => App\Models\Location::class, - 'assigned_to' => $target->id, - ] - ); - - return [ - 'created_at' => $faker->dateTimeBetween('-1 years','now', date_default_timezone_get()), - 'user_id' => $user_id, - 'action_type' => 'checkout', - 'item_id' => $item->id, - 'item_type' => App\Models\Asset::class, - 'target_id' => $target->id, - 'target_type' => get_class($target), - ]; -}); - -// This doesn't work - we need to assign a seat -$factory->defineAs(Actionlog::class, 'license-checkout-asset', function (Faker\Generator $faker) { - $target = Asset::inRandomOrder()->RTD()->first(); - $item = License::inRandomOrder()->first(); - $user_id = rand(1,2); // keep it simple - make it one of the two superadmins - - return [ - 'user_id' => $user_id, - 'action_type' => 'checkout', - 'item_id' => $item->id, - 'item_type' => get_class($item), - 'target_id' => $target->id, - 'target_type' => get_class($target), - 'created_at' => $faker->dateTime(), - 'note' => $faker->sentence - ]; -}); - - -$factory->defineAs(Actionlog::class, 'accessory-checkout', function (Faker\Generator $faker) { - $target = Asset::inRandomOrder()->RTD()->first(); - $item = Accessory::inRandomOrder()->first(); - $user_id = rand(1,2); // keep it simple - make it one of the two superadmins - - return [ - 'user_id' => $user_id, - 'action_type' => 'checkout', - 'item_id' => $item->id, - 'item_type' => get_class($item), - 'target_id' => $target->id, - 'target_type' => get_class($target), - 'created_at' => $faker->dateTime(), - 'note' => $faker->sentence - ]; -}); - -$factory->defineAs(Actionlog::class, 'consumable-checkout', function (Faker\Generator $faker) { - $company = factory(App\Models\Company::class)->create(); - $user = factory(App\Models\User::class)->create(['company_id' => $company->id]); - $target = factory(App\Models\User::class)->create(['company_id' => $company->id]); - $item = factory(App\Models\Consumable::class)->create(['company_id' => $company->id]); - - return [ - 'user_id' => $user->id, - 'action_type' => 'checkout', - 'item_id' => $item->id, - 'item_type' => get_class($item), - 'target_id' => $target->id, - 'target_type' => get_class($target), - 'created_at' => $faker->dateTime(), - 'note' => $faker->sentence, - 'company_id' => $company->id - ]; -}); - -$factory->defineAs(Actionlog::class, 'component-checkout', function (Faker\Generator $faker) { - $company = factory(App\Models\Company::class)->create(); - $user = factory(App\Models\User::class)->create(['company_id' => $company->id]); - $target = factory(App\Models\User::class)->create(['company_id' => $company->id]); - $item = factory(App\Models\Component::class)->create(['company_id' => $company->id]); - - return [ - 'user_id' => $user->id, - 'action_type' => 'checkout', - 'item_id' => $item->id, - 'item_type' => get_class($item), - 'target_id' => $target->id, - 'target_type' => get_class($target), - 'created_at' => $faker->dateTime(), - 'note' => $faker->sentence, - 'company_id' => $company->id - ]; -}); diff --git a/database/factories/ActionlogFactory.php b/database/factories/ActionlogFactory.php new file mode 100644 index 0000000000..005e975de4 --- /dev/null +++ b/database/factories/ActionlogFactory.php @@ -0,0 +1,105 @@ +create(); + return [ + 'item_type' => get_class($asset), + 'item_id' => 1, + 'user_id' => 1, + 'filename' => $this->faker->word, + 'action_type' => 'uploaded', + ]; + } + + + public function assetCheckoutToUser() + { + return $this->state(function () { + $target = \App\Models\User::inRandomOrder()->first(); + $item = \App\Models\Asset::inRandomOrder()->RTD()->first(); + $user_id = rand(1, 2); // keep it simple - make it one of the two superadmins + $asset = Asset::where('id', $item->id) + ->update( + [ + 'assigned_to' => $target->id, + 'assigned_type' => \App\Models\User::class, + 'assigned_to' => $target->location_id, + ] + ); + + return [ + 'created_at' => $this->faker->dateTimeBetween('-1 years', 'now', date_default_timezone_get()), + 'user_id' => $user_id, + 'action_type' => 'checkout', + 'item_id' => $item->id, + 'item_type' => \App\Models\Asset::class, + 'target_id' => $target->id, + 'target_type' => get_class($target), + + ]; + }); + } + + + public function assetCheckoutToLocation() + { + return $this->state(function () { + $target = \App\Models\Location::inRandomOrder()->first(); + $item = \App\Models\Asset::inRandomOrder()->RTD()->first(); + $user_id = rand(1, 2); // keep it simple - make it one of the two superadmins + $asset = \App\Models\Asset::where('id', $item->id) + ->update( + [ + 'assigned_to' => $target->id, + 'assigned_type' => \App\Models\Location::class, + 'assigned_to' => $target->id, + ] + ); + + return [ + 'created_at' => $this->faker->dateTimeBetween('-1 years', 'now', date_default_timezone_get()), + 'user_id' => $user_id, + 'action_type' => 'checkout', + 'item_id' => $item->id, + 'item_type' => \App\Models\Asset::class, + 'target_id' => $target->id, + 'target_type' => get_class($target), + ]; + }); + } + + +} diff --git a/database/factories/AssetFactory.php b/database/factories/AssetFactory.php index e028127c89..d52d25962b 100644 --- a/database/factories/AssetFactory.php +++ b/database/factories/AssetFactory.php @@ -1,8 +1,11 @@ define(Asset::class, function (Faker\Generator $faker) { - return [ - 'name' => null, - 'rtd_location_id' => rand(1,10), - 'serial' => $faker->uuid, - 'status_id' => 1, - 'user_id' => 1, - 'asset_tag' => $faker->unixTime('now'), - 'notes' => 'Created by DB seeder', - 'purchase_date' => $faker->dateTimeBetween('-1 years','now', date_default_timezone_get()), - 'purchase_cost' => $faker->randomFloat(2, '299.99', '2999.99'), - 'order_number' => $faker->numberBetween(1000000, 50000000), - 'supplier_id' => 1, - 'requestable' => $faker->boolean(), - 'assigned_to' => null, - 'assigned_type' => null, - 'next_audit_date' => null, - 'last_checkout' => null, - ]; -}); - - - - -$factory->state(Asset::class, 'laptop-mbp', function ($faker) { - return [ - 'model_id' => 1 - ]; -}); - -$factory->state(Asset::class, 'laptop-mbp-pending', function ($faker) { - return [ - 'model_id' => 1, - 'status_id' => 2, - ]; -}); - -$factory->state(Asset::class, 'laptop-mbp-archived', function ($faker) { - return [ - 'model_id' => 1, - 'status_id' => 3, - ]; -}); - -$factory->state(Asset::class, 'laptop-air', function ($faker) { - return [ - 'model_id' => 2 - ]; -}); - -$factory->state(Asset::class, 'laptop-surface', function ($faker) { - return [ - 'model_id' => 3 - ]; -}); - -$factory->state(Asset::class, 'laptop-xps', function ($faker) { - return [ - 'model_id' => 4 - ]; -}); - -$factory->state(Asset::class, 'laptop-spectre', function ($faker) { - return [ - 'model_id' => 5 - ]; -}); - -$factory->state(Asset::class, 'laptop-zenbook', function ($faker) { - return [ - 'model_id' => 6 - ]; -}); - -$factory->state(Asset::class, 'laptop-yoga', function ($faker) { - return [ - 'model_id' => 7 - ]; -}); - -$factory->state(Asset::class, 'desktop-macpro', function ($faker) { - return [ - 'model_id' => 8 - ]; -}); - -$factory->state(Asset::class, 'desktop-lenovo-i5', function ($faker) { - return [ - 'model_id' => 9 - ]; -}); - -$factory->state(Asset::class, 'desktop-optiplex', function ($faker) { - return [ - 'model_id' => 10 - ]; -}); - -$factory->state(Asset::class, 'conf-polycom', function ($faker) { - return [ - 'model_id' => 11 - ]; -}); - -$factory->state(Asset::class, 'conf-polycomcx', function ($faker) { - return [ - 'model_id' => 12 - ]; -}); - -$factory->state(Asset::class, 'tablet-ipad', function ($faker) { - return [ - 'model_id' => 13 - ]; -}); - -$factory->state(Asset::class, 'tablet-tab3', function ($faker) { - return [ - 'model_id' => 14 - ]; -}); - -$factory->state(Asset::class, 'phone-iphone6s', function ($faker) { - return [ - 'model_id' => 15 - ]; -}); - -$factory->state(Asset::class, 'phone-iphone7', function ($faker) { - return [ - 'model_id' => 16 - ]; -}); - -$factory->state(Asset::class, 'ultrafine', function ($faker) { - return [ - 'model_id' => 17 - ]; -}); - -$factory->state(Asset::class, 'ultrasharp', function ($faker) { - return [ - 'model_id' => 18 - ]; -}); - - // These are just for unit tests, not to generate data -$factory->state(Asset::class, 'assigned-to-user', function ($faker) { - return [ - 'model_id' => 1, - 'assigned_to' => factory(App\Models\User::class)->create()->id, - 'assigned_type' => App\Models\User::class, - ]; -}); -$factory->state(Asset::class, 'assigned-to-location', function ($faker) { - return [ - 'model_id' => 1, - 'assigned_to' => factory(App\Models\Location::class)->create()->id, - 'assigned_type' => App\Models\Location::class, - ]; -}); -$factory->state(Asset::class, 'assigned-to-asset', function ($faker) { - return [ - 'model_id' => 1, - 'assigned_to' => factory(App\Models\Asset::class)->create()->id, - 'assigned_type' => App\Models\Asset::class, - ]; -}); +class AssetFactory extends Factory +{ + /** + * The name of the factory's corresponding model. + * + * @var string + */ + protected $model = Asset::class; -$factory->state(Asset::class, 'requires-acceptance', function ($faker) { - return [ - 'model_id' => 1, - ]; -}); + /** + * Define the model's default state. + * + * @return array + */ + public function definition() + { + return [ + 'name' => null, + 'rtd_location_id' => rand(1, 10), + 'serial' => $this->faker->uuid, + 'status_id' => 1, + 'user_id' => 1, + 'asset_tag' => $this->faker->unixTime('now'), + 'notes' => 'Created by DB seeder', + 'purchase_date' => $this->faker->dateTimeBetween('-1 years', 'now', date_default_timezone_get()), + 'purchase_cost' => $this->faker->randomFloat(2, '299.99', '2999.99'), + 'order_number' => $this->faker->numberBetween(1000000, 50000000), + 'supplier_id' => 1, + 'requestable' => $this->faker->boolean(), + 'assigned_to' => null, + 'assigned_type' => null, + 'next_audit_date' => null, + 'last_checkout' => null, + ]; + } + public function laptopMbp() + { + return $this->state(function () { + return [ + 'model_id' => 1, + ]; + }); + } -$factory->state(Asset::class, 'deleted', function ($faker) { - return [ - 'model_id' => 1, - 'deleted_at' => $faker->dateTime() - ]; -}); + public function laptopMbpPending() + { + return $this->state(function () { + return [ + 'model_id' => 1, + 'status_id' => 2, + ]; + }); + } + public function laptopMbpArchived() + { + return $this->state(function () { + return [ + 'model_id' => 1, + 'status_id' => 3, + ]; + }); + } -$factory->define(App\Models\AssetMaintenance::class, function (Faker\Generator $faker) { - return [ - 'asset_id' => function () { - return factory(App\Models\Asset::class)->create()->id; - }, - 'supplier_id' => function () { - return factory(App\Models\Supplier::class)->create()->id; - }, - 'asset_maintenance_type' => $faker->randomElement(['maintenance', 'repair', 'upgrade']), - 'title' => $faker->sentence, - 'start_date' => $faker->date(), - 'is_warranty' => $faker->boolean(), - 'notes' => $faker->paragraph(), - ]; -}); + public function laptopAir() + { + return $this->state(function () { + return [ + 'model_id' => 2, + ]; + }); + } + + public function laptopSurface() + { + return $this->state(function () { + return [ + 'model_id' => 3, + ]; + }); + } + + public function laptopXps() + { + return $this->state(function () { + return [ + 'model_id' => 4, + ]; + }); + } + + public function laptopSpectre() + { + return $this->state(function () { + return [ + 'model_id' => 5, + ]; + }); + } + + public function laptopZenbook() + { + return $this->state(function () { + return [ + 'model_id' => 6, + ]; + }); + } + + public function laptopYoga() + { + return $this->state(function () { + return [ + 'model_id' => 7, + ]; + }); + } + + public function desktopMacpro() + { + return $this->state(function () { + return [ + 'model_id' => 8, + ]; + }); + } + + public function desktopLenovoI5() + { + return $this->state(function () { + return [ + 'model_id' => 9, + ]; + }); + } + + public function desktopOptiplex() + { + return $this->state(function () { + return [ + 'model_id' => 10, + ]; + }); + } + + public function confPolycom() + { + return $this->state(function () { + return [ + 'model_id' => 11, + ]; + }); + } + + public function confPolycomcx() + { + return $this->state(function () { + return [ + 'model_id' => 12, + ]; + }); + } + + public function tabletIpad() + { + return $this->state(function () { + return [ + 'model_id' => 13, + ]; + }); + } + + public function tabletTab3() + { + return $this->state(function () { + return [ + 'model_id' => 14, + ]; + }); + } + + public function phoneIphone11() + { + return $this->state(function () { + return [ + 'model_id' => 15, + ]; + }); + } + + public function phoneIphone12() + { + return $this->state(function () { + return [ + 'model_id' => 16, + ]; + }); + } + + public function ultrafine() + { + return $this->state(function () { + return [ + 'model_id' => 17, + ]; + }); + } + + public function ultrasharp() + { + return $this->state(function () { + return [ + 'model_id' => 18, + ]; + }); + } + + public function assignedToUser() + { + return $this->state(function () { + return [ + 'model_id' => 1, + 'assigned_to' => \App\Models\User::factory()->create()->id, + 'assigned_type' => \App\Models\User::class, + ]; + }); + } + + public function assignedToLocation() + { + return $this->state(function () { + return [ + 'model_id' => 1, + 'assigned_to' => \App\Models\Location::factory()->create()->id, + 'assigned_type' => \App\Models\Location::class, + ]; + }); + } + + public function assignedToAsset() + { + return $this->state(function () { + return [ + 'model_id' => 1, + 'assigned_to' => \App\Models\Asset::factory()->create()->id, + 'assigned_type' => \App\Models\Asset::class, + ]; + }); + } + + public function requiresAcceptance() + { + return $this->state(function () { + return [ + 'model_id' => 1, + ]; + }); + } + + public function deleted() + { + return $this->state(function () { + return [ + 'model_id' => 1, + 'deleted_at' => $this->faker->dateTime(), + ]; + }); + } +} diff --git a/database/factories/AssetMaintenanceFactory.php b/database/factories/AssetMaintenanceFactory.php new file mode 100644 index 0000000000..f9351f5188 --- /dev/null +++ b/database/factories/AssetMaintenanceFactory.php @@ -0,0 +1,49 @@ + function () { + return \App\Models\Asset::factory()->create()->id; + }, + 'supplier_id' => function () { + return \App\Models\Supplier::factory()->create()->id; + }, + 'asset_maintenance_type' => $this->faker->randomElement(['maintenance', 'repair', 'upgrade']), + 'title' => $this->faker->sentence, + 'start_date' => $this->faker->date(), + 'is_warranty' => $this->faker->boolean(), + 'notes' => $this->faker->paragraph(), + ]; + } +} diff --git a/database/factories/AssetModelFactory.php b/database/factories/AssetModelFactory.php index 89cb21578c..63c659fbf8 100644 --- a/database/factories/AssetModelFactory.php +++ b/database/factories/AssetModelFactory.php @@ -1,5 +1,9 @@ define(App\Models\AssetModel::class, function (Faker\Generator $faker) { - return [ - 'user_id' => 1, - 'model_number' => $faker->creditCardNumber(), - 'notes' => 'Created by demo seeder', - - ]; -}); - // 1 -$factory->state(App\Models\AssetModel::class, 'mbp-13-model', function ($faker) { - return [ - 'name' => 'Macbook Pro 13"', - 'category_id' => 1, - 'manufacturer_id' => 1, - 'eol' => '36', - 'depreciation_id' => 1, - 'image' => 'mbp.jpg', - 'fieldset_id' => 2, - ]; -}); // 2 -$factory->state(App\Models\AssetModel::class, 'mbp-air-model', function ($faker) { - return [ - 'name' => 'Macbook Air', - 'category_id' => 1, - 'manufacturer_id' => 1, - 'eol' => '36', - 'depreciation_id' => 1, - 'image' => 'macbookair.jpg', - 'fieldset_id' => 2, - ]; -}); // 3 -$factory->state(App\Models\AssetModel::class, 'surface-model', function ($faker) { - return [ - 'name' => 'Surface', - 'category_id' => 1, - 'manufacturer_id' => 2, - 'eol' => '36', - 'depreciation_id' => 1, - 'image' => 'surface.jpg', - 'fieldset_id' => 2, - ]; -}); // 4 -$factory->state(App\Models\AssetModel::class, 'xps13-model', function ($faker) { - return [ - 'name' => 'XPS 13', - 'category_id' => 1, - 'manufacturer_id' => 3, - 'eol' => '36', - 'depreciation_id' => 1, - 'image' => 'xps.jpg', - 'fieldset_id' => 2, - ]; -}); // 5 -$factory->state(App\Models\AssetModel::class, 'zenbook-model', function ($faker) { - return [ - 'name' => 'ZenBook UX310', - 'category_id' => 1, - 'manufacturer_id' => 4, - 'eol' => '36', - 'depreciation_id' => 1, - 'image' => 'zenbook.jpg', - 'fieldset_id' => 2, - ]; -}); // 6 -$factory->state(App\Models\AssetModel::class, 'spectre-model', function ($faker) { - return [ - 'name' => 'Spectre', - 'category_id' => 1, - 'manufacturer_id' => 5, - 'eol' => '36', - 'depreciation_id' => 1, - 'image' => 'spectre.jpg', - 'fieldset_id' => 2, - ]; -}); // 7 -$factory->state(App\Models\AssetModel::class, 'yoga-model', function ($faker) { - return [ - 'name' => 'Yoga 910', - 'category_id' => 1, - 'manufacturer_id' => 6, - 'eol' => '36', - 'depreciation_id' => 1, - 'image' => 'yoga.png', - 'fieldset_id' => 2, - ]; -}); /* |-------------------------------------------------------------------------- @@ -121,165 +39,316 @@ $factory->state(App\Models\AssetModel::class, 'yoga-model', function ($faker) { |-------------------------------------------------------------------------- */ - -$factory->state(App\Models\AssetModel::class, 'macpro-model', function ($faker) { - return [ - 'name' => 'iMac Pro', - 'category_id' => 2, - 'manufacturer_id' => 1, - 'eol' => '24', - 'depreciation_id' => 1, - 'image' => 'imacpro.jpg', - 'fieldset_id' => 2, - ]; -}); - -$factory->state(App\Models\AssetModel::class, 'lenovo-i5-model', function ($faker) { - return [ - 'name' => 'Lenovo Intel Core i5', - 'category_id' => 2, - 'manufacturer_id' => 6, - 'eol' => '24', - 'depreciation_id' => 1, - 'image' => 'lenovoi5.png', - 'fieldset_id' => 2, - ]; -}); - -$factory->state(App\Models\AssetModel::class, 'optiplex-model', function ($faker) { - return [ - 'name' => 'OptiPlex', - 'category_id' => 2, - 'manufacturer_id' => 3, - 'model_number' => '5040 (MRR81)', - 'eol' => '24', - 'depreciation_id' => 1, - 'image' => 'optiplex.jpg', - 'fieldset_id' => 2, - ]; -}); - - /* |-------------------------------------------------------------------------- | Conference Phones |-------------------------------------------------------------------------- */ - -$factory->state(App\Models\AssetModel::class, 'polycom-model', function ($faker) { - return [ - 'name' => 'SoundStation 2', - 'category_id' => 6, - 'manufacturer_id' => 8, - 'eol' => '12', - 'depreciation_id' => 1, - 'image' => 'soundstation.jpg', - ]; -}); - -$factory->state(App\Models\AssetModel::class, 'polycomcx-model', function ($faker) { - return [ - 'name' => 'Polycom CX3000 IP Conference Phone', - 'category_id' => 6, - 'manufacturer_id' => 8, - 'eol' => '12', - 'depreciation_id' => 1, - 'image' => 'cx3000.png', - ]; -}); - - /* |-------------------------------------------------------------------------- | Tablets |-------------------------------------------------------------------------- */ -$factory->state(App\Models\AssetModel::class, 'ipad-model', function ($faker) { - return [ - 'name' => 'iPad Pro', - 'category_id' => 3, - 'manufacturer_id' => 1, - 'eol' => '12', - 'depreciation_id' => 1, - 'image' => 'ipad.jpg', - ]; -}); - - -$factory->state(App\Models\AssetModel::class, 'tab3-model', function ($faker) { - return [ - 'name' => 'Tab3', - 'category_id' => 3, - 'manufacturer_id' => 6, - 'eol' => '12', - 'depreciation_id' => 1, - 'image' => 'tab3.png', - ]; -}); - - /* |-------------------------------------------------------------------------- | Mobile Phones |-------------------------------------------------------------------------- */ -$factory->state(App\Models\AssetModel::class, 'iphone6s-model', function ($faker) { - return [ - 'name' => 'iPhone 6s', - 'category_id' => 4, - 'manufacturer_id' => 1, - 'eol' => '12', - 'depreciation_id' => 3, - 'image' => 'iphone6.jpg', - 'fieldset_id' => 1, - ]; -}); - -$factory->state(App\Models\AssetModel::class, 'iphone7-model', function ($faker) { - return [ - 'name' => 'iPhone 7', - 'category_id' => 4, - 'manufacturer_id' => 1, - 'eol' => '12', - 'depreciation_id' => 1, - 'image' => 'iphone7.jpg', - 'fieldset_id' => 1, - ]; -}); - /* |-------------------------------------------------------------------------- | Displays |-------------------------------------------------------------------------- */ -$factory->state(App\Models\AssetModel::class, 'ultrafine', function ($faker) { - return [ - 'name' => 'Ultrafine 4k', - 'category_id' => 5, - 'manufacturer_id' => 7, - 'eol' => '12', - 'depreciation_id' => 2, - 'image' => 'ultrafine.jpg', - ]; -}); +class AssetModelFactory extends Factory +{ + /** + * The name of the factory's corresponding model. + * + * @var string + */ + protected $model = \App\Models\AssetModel::class; -$factory->state(App\Models\AssetModel::class, 'ultrasharp', function ($faker) { - return [ - 'name' => 'Ultrasharp U2415', - 'category_id' => 5, - 'manufacturer_id' => 3, - 'eol' => '12', - 'depreciation_id' => 2, - 'image' => 'ultrasharp.jpg', - ]; -}); + /** + * Define the model's default state. + * + * @return array + */ + public function definition() + { + return [ + 'user_id' => 1, + 'model_number' => $this->faker->creditCardNumber(), + 'notes' => 'Created by demo seeder', + ]; + } + public function mbp13Model() + { + return $this->state(function () { + return [ + 'name' => 'Macbook Pro 13"', + 'category_id' => 1, + 'manufacturer_id' => 1, + 'eol' => '36', + 'depreciation_id' => 1, + 'image' => 'mbp.jpg', + 'fieldset_id' => 2, + ]; + }); + } + public function mbpAirModel() + { + return $this->state(function () { + return [ + 'name' => 'Macbook Air', + 'category_id' => 1, + 'manufacturer_id' => 1, + 'eol' => '36', + 'depreciation_id' => 1, + 'image' => 'macbookair.jpg', + 'fieldset_id' => 2, + ]; + }); + } + public function surfaceModel() + { + return $this->state(function () { + return [ + 'name' => 'Surface', + 'category_id' => 1, + 'manufacturer_id' => 2, + 'eol' => '36', + 'depreciation_id' => 1, + 'image' => 'surface.jpg', + 'fieldset_id' => 2, + ]; + }); + } + public function xps13Model() + { + return $this->state(function () { + return [ + 'name' => 'XPS 13', + 'category_id' => 1, + 'manufacturer_id' => 3, + 'eol' => '36', + 'depreciation_id' => 1, + 'image' => 'xps.jpg', + 'fieldset_id' => 2, + ]; + }); + } + public function zenbookModel() + { + return $this->state(function () { + return [ + 'name' => 'ZenBook UX310', + 'category_id' => 1, + 'manufacturer_id' => 4, + 'eol' => '36', + 'depreciation_id' => 1, + 'image' => 'zenbook.jpg', + 'fieldset_id' => 2, + ]; + }); + } + + public function spectreModel() + { + return $this->state(function () { + return [ + 'name' => 'Spectre', + 'category_id' => 1, + 'manufacturer_id' => 5, + 'eol' => '36', + 'depreciation_id' => 1, + 'image' => 'spectre.jpg', + 'fieldset_id' => 2, + ]; + }); + } + + public function yogaModel() + { + return $this->state(function () { + return [ + 'name' => 'Yoga 910', + 'category_id' => 1, + 'manufacturer_id' => 6, + 'eol' => '36', + 'depreciation_id' => 1, + 'image' => 'yoga.png', + 'fieldset_id' => 2, + ]; + }); + } + + public function macproModel() + { + return $this->state(function () { + return [ + 'name' => 'iMac Pro', + 'category_id' => 2, + 'manufacturer_id' => 1, + 'eol' => '24', + 'depreciation_id' => 1, + 'image' => 'imacpro.jpg', + 'fieldset_id' => 2, + ]; + }); + } + + public function lenovoI5Model() + { + return $this->state(function () { + return [ + 'name' => 'Lenovo Intel Core i5', + 'category_id' => 2, + 'manufacturer_id' => 6, + 'eol' => '24', + 'depreciation_id' => 1, + 'image' => 'lenovoi5.png', + 'fieldset_id' => 2, + ]; + }); + } + + public function optiplexModel() + { + return $this->state(function () { + return [ + 'name' => 'OptiPlex', + 'category_id' => 2, + 'manufacturer_id' => 3, + 'model_number' => '5040 (MRR81)', + 'eol' => '24', + 'depreciation_id' => 1, + 'image' => 'optiplex.jpg', + 'fieldset_id' => 2, + ]; + }); + } + + public function polycomModel() + { + return $this->state(function () { + return [ + 'name' => 'SoundStation 2', + 'category_id' => 6, + 'manufacturer_id' => 8, + 'eol' => '12', + 'depreciation_id' => 1, + 'image' => 'soundstation.jpg', + ]; + }); + } + + public function polycomcxModel() + { + return $this->state(function () { + return [ + 'name' => 'Polycom CX3000 IP Conference Phone', + 'category_id' => 6, + 'manufacturer_id' => 8, + 'eol' => '12', + 'depreciation_id' => 1, + 'image' => 'cx3000.png', + ]; + }); + } + + public function ipadModel() + { + return $this->state(function () { + return [ + 'name' => 'iPad Pro', + 'category_id' => 3, + 'manufacturer_id' => 1, + 'eol' => '12', + 'depreciation_id' => 1, + 'image' => 'ipad.jpg', + ]; + }); + } + + public function tab3Model() + { + return $this->state(function () { + return [ + 'name' => 'Tab3', + 'category_id' => 3, + 'manufacturer_id' => 6, + 'eol' => '12', + 'depreciation_id' => 1, + 'image' => 'tab3.png', + ]; + }); + } + + public function iphone11Model() + { + return $this->state(function () { + return [ + 'name' => 'iPhone 11', + 'category_id' => 4, + 'manufacturer_id' => 1, + 'eol' => '12', + 'depreciation_id' => 3, + 'image' => 'iphone11.jpeg', + 'fieldset_id' => 1, + ]; + }); + } + + public function iphone12Model() + { + return $this->state(function () { + return [ + 'name' => 'iPhone 12', + 'category_id' => 4, + 'manufacturer_id' => 1, + 'eol' => '12', + 'depreciation_id' => 1, + 'image' => 'iphone12.jpeg', + 'fieldset_id' => 1, + ]; + }); + } + + public function ultrafine() + { + return $this->state(function () { + return [ + 'name' => 'Ultrafine 4k', + 'category_id' => 5, + 'manufacturer_id' => 7, + 'eol' => '12', + 'depreciation_id' => 2, + 'image' => 'ultrafine.jpg', + ]; + }); + } + + public function ultrasharp() + { + return $this->state(function () { + return [ + 'name' => 'Ultrasharp U2415', + 'category_id' => 5, + 'manufacturer_id' => 3, + 'eol' => '12', + 'depreciation_id' => 2, + 'image' => 'ultrasharp.jpg', + ]; + }); + } +} diff --git a/database/factories/CategoryFactory.php b/database/factories/CategoryFactory.php index 26b59ffac2..3001c6001e 100644 --- a/database/factories/CategoryFactory.php +++ b/database/factories/CategoryFactory.php @@ -1,5 +1,9 @@ define(App\Models\Category::class, function (Faker\Generator $faker) { - return [ - 'checkin_email' => $faker->boolean(), - 'eula_text' => $faker->paragraph(), - 'require_acceptance' => false, - 'use_default_eula' => $faker->boolean(), - 'user_id' => 1, - ]; -}); + /** + * Define the model's default state. + * + * @return array + */ + public function definition() + { + return [ + 'checkin_email' => $this->faker->boolean(), + 'eula_text' => $this->faker->paragraph(), + 'require_acceptance' => false, + 'use_default_eula' => $this->faker->boolean(), + 'user_id' => 1, + ]; + } -$factory->state(App\Models\Category::class, 'asset-laptop-category', function ($faker) { - return [ - 'name' => 'Laptops', - 'category_type' => 'asset', - 'require_acceptance' => true, - ]; -}); + public function assetLaptopCategory() + { + return $this->state(function () { + return [ + 'name' => 'Laptops', + 'category_type' => 'asset', + 'require_acceptance' => true, + ]; + }); + } -$factory->state(App\Models\Category::class, 'asset-desktop-category', function ($faker) { - return [ - 'name' => 'Desktops', - 'category_type' => 'asset', - ]; -}); + public function assetDesktopCategory() + { + return $this->state(function () { + return [ + 'name' => 'Desktops', + 'category_type' => 'asset', + ]; + }); + } -$factory->state(App\Models\Category::class, 'asset-display-category', function ($faker) { - return [ - 'name' => 'Displays', - 'category_type' => 'asset', - ]; -}); + public function assetDisplayCategory() + { + return $this->state(function () { + return [ + 'name' => 'Displays', + 'category_type' => 'asset', + ]; + }); + } -$factory->state(App\Models\Category::class, 'asset-tablet-category', function ($faker) { - return [ - 'name' => 'Tablets', - 'category_type' => 'asset', - ]; -}); + public function assetTabletCategory() + { + return $this->state(function () { + return [ + 'name' => 'Tablets', + 'category_type' => 'asset', + ]; + }); + } -$factory->state(App\Models\Category::class, 'asset-mobile-category', function ($faker) { - return [ - 'name' => 'Mobile Phones', - 'category_type' => 'asset', - ]; -}); + public function assetMobileCategory() + { + return $this->state(function () { + return [ + 'name' => 'Mobile Phones', + 'category_type' => 'asset', + ]; + }); + } -$factory->state(App\Models\Category::class, 'asset-conference-category', function ($faker) { - return [ - 'name' => 'Conference Phones', - 'category_type' => 'asset', - ]; -}); + public function assetConferenceCategory() + { + return $this->state(function () { + return [ + 'name' => 'Conference Phones', + 'category_type' => 'asset', + ]; + }); + } -$factory->state(App\Models\Category::class, 'asset-voip-category', function ($faker) { - return [ - 'name' => 'VOIP Phones', - 'category_type' => 'asset', - ]; -}); + public function assetVoipCategory() + { + return $this->state(function () { + return [ + 'name' => 'VOIP Phones', + 'category_type' => 'asset', + ]; + }); + } + public function accessoryKeyboardCategory() + { + return $this->state(function () { + return [ + 'name' => 'Keyboards', + 'category_type' => 'accessory', + ]; + }); + } -$factory->state(App\Models\Category::class, 'accessory-keyboard-category', function ($faker) { - return [ - 'name' => 'Keyboards', - 'category_type' => 'accessory', - ]; -}); + public function accessoryMouseCategory() + { + return $this->state(function () { + return [ + 'name' => 'Mouse', + 'category_type' => 'accessory', + ]; + }); + } -$factory->state(App\Models\Category::class, 'accessory-mouse-category', function ($faker) { - return [ - 'name' => 'Mouse', - 'category_type' => 'accessory', - ]; -}); + public function componentHddCategory() + { + return $this->state(function () { + return [ + 'name' => 'HDD/SSD', + 'category_type' => 'component', + ]; + }); + } + public function componentRamCategory() + { + return $this->state(function () { + return [ + 'name' => 'RAM', + 'category_type' => 'component', + ]; + }); + } -$factory->state(App\Models\Category::class, 'component-hdd-category', function ($faker) { - return [ - 'name' => 'HDD/SSD', - 'category_type' => 'component', - ]; -}); + public function consumablePaperCategory() + { + return $this->state(function () { + return [ + 'name' => 'Printer Paper', + 'category_type' => 'consumable', + ]; + }); + } -$factory->state(App\Models\Category::class, 'component-ram-category', function ($faker) { - return [ - 'name' => 'RAM', - 'category_type' => 'component', - ]; -}); + public function consumableInkCategory() + { + return $this->state(function () { + return [ + 'name' => 'Printer Ink', + 'category_type' => 'consumable', + ]; + }); + } -$factory->state(App\Models\Category::class, 'consumable-paper-category', function ($faker) { - return [ - 'name' => 'Printer Paper', - 'category_type' => 'consumable', - ]; -}); + public function licenseGraphicsCategory() + { + return $this->state(function () { + return [ + 'name' => 'Graphics Software', + 'category_type' => 'license', + ]; + }); + } -$factory->state(App\Models\Category::class, 'consumable-ink-category', function ($faker) { - return [ - 'name' => 'Printer Ink', - 'category_type' => 'consumable', - ]; -}); - - -$factory->state(App\Models\Category::class, 'license-graphics-category', function ($faker) { - return [ - 'name' => 'Graphics Software', - 'category_type' => 'license', - ]; -}); - - -$factory->state(App\Models\Category::class, 'license-office-category', function ($faker) { - return [ - 'name' => 'Office Software', - 'category_type' => 'license', - ]; -}); + public function licenseOfficeCategory() + { + return $this->state(function () { + return [ + 'name' => 'Office Software', + 'category_type' => 'license', + ]; + }); + } +} diff --git a/database/factories/CompanyFactory.php b/database/factories/CompanyFactory.php new file mode 100644 index 0000000000..695a2dbdb5 --- /dev/null +++ b/database/factories/CompanyFactory.php @@ -0,0 +1,45 @@ + $this->faker->company, + ]; + } +} diff --git a/database/factories/ComponentFactory.php b/database/factories/ComponentFactory.php new file mode 100644 index 0000000000..bd971162ab --- /dev/null +++ b/database/factories/ComponentFactory.php @@ -0,0 +1,101 @@ + $this->faker->text(20), + 'category_id' => function () { + return \App\Models\Category::factory()->create()->id; + }, + 'location_id' => 1, + 'serial' => $this->faker->uuid, + 'qty' => $this->faker->numberBetween(3, 10), + 'order_number' => $this->faker->numberBetween(1000000, 50000000), + 'purchase_date' => $this->faker->dateTime(), + 'purchase_cost' => $this->faker->randomFloat(2), + 'min_amt' => $this->faker->numberBetween($min = 1, $max = 2), + 'company_id' => function () { + return \App\Models\Company::factory()->create()->id; + }, + ]; + } + + public function ramCrucial4() + { + return $this->state(function () { + return [ + 'name' => 'Crucial 4GB DDR3L-1600 SODIMM', + 'category_id' => 13, + 'qty' => 10, + 'min_amt' => 2, + 'location_id' => 3, + 'company_id' => 2, + ]; + }); + } + + public function ramCrucial8() + { + return $this->state(function () { + return [ + 'name' => 'Crucial 8GB DDR3L-1600 SODIMM Memory for Mac', + 'category_id' => 13, + 'qty' => 10, + 'min_amt' => 2, + ]; + }); + } + + public function ssdCrucial120() + { + return $this->state(function () { + return [ + 'name' => 'Crucial BX300 120GB SATA Internal SSD', + 'category_id' => 12, + 'qty' => 10, + 'min_amt' => 2, + ]; + }); + } + + public function ssdCrucial240() + { + return $this->state(function () { + return [ + 'name' => 'Crucial BX300 240GB SATA Internal SSD', + 'category_id' => 12, + 'qty' => 10, + 'min_amt' => 2, + ]; + }); + } + + +} diff --git a/database/factories/ComponentsFactory.php b/database/factories/ComponentsFactory.php deleted file mode 100644 index c550493c2b..0000000000 --- a/database/factories/ComponentsFactory.php +++ /dev/null @@ -1,66 +0,0 @@ -define(App\Models\Component::class, function (Faker\Generator $faker) { - return [ - 'user_id' => 1, - 'order_number' => $faker->numberBetween(1000000, 50000000), - 'purchase_date' => $faker->dateTimeBetween('-1 years','now', date_default_timezone_get()), - 'purchase_cost' => $faker->randomFloat(2, 1, 50), - 'qty' => $faker->numberBetween(5, 10), - 'min_amt' => $faker->numberBetween($min = 1, $max = 2), - ]; -}); - -$factory->state(App\Models\Component::class, 'ram-crucial4', function ($faker) { - - return [ - 'name' => 'Crucial 4GB DDR3L-1600 SODIMM', - 'category_id' => 13, - 'qty' => 10, - 'min_amt' => 2, - 'location_id' => 3, - 'company_id' => 2 - ]; -}); - -$factory->state(App\Models\Component::class, 'ram-crucial8', function ($faker) { - - return [ - 'name' => 'Crucial 8GB DDR3L-1600 SODIMM Memory for Mac', - 'category_id' => 13, - 'qty' => 10, - 'min_amt' => 2 - ]; -}); - -$factory->state(App\Models\Component::class, 'ssd-crucial120', function ($faker) { - - return [ - 'name' => 'Crucial BX300 120GB SATA Internal SSD', - 'category_id' => 12, - 'qty' => 10, - 'min_amt' => 2 - ]; -}); - -$factory->state(App\Models\Component::class, 'ssd-crucial240', function ($faker) { - - return [ - 'name' => 'Crucial BX300 240GB SATA Internal SSD', - 'category_id' => 12, - 'qty' => 10, - 'min_amt' => 2 - ]; -}); - - - diff --git a/database/factories/ConsumableFactory.php b/database/factories/ConsumableFactory.php index 41ddcf42a8..50a9db0ba2 100644 --- a/database/factories/ConsumableFactory.php +++ b/database/factories/ConsumableFactory.php @@ -1,5 +1,9 @@ define(App\Models\Consumable::class, function (Faker\Generator $faker) { - return [ - 'user_id' => 1, - 'item_no' => $faker->numberBetween(1000000, 50000000), - 'order_number' => $faker->numberBetween(1000000, 50000000), - 'purchase_date' => $faker->dateTimeBetween('-1 years','now', date_default_timezone_get()), - 'purchase_cost' => $faker->randomFloat(2, 1, 50), - 'qty' => $faker->numberBetween(5, 10), - 'min_amt' => $faker->numberBetween($min = 1, $max = 2), - ]; -}); +class ConsumableFactory extends Factory +{ + /** + * The name of the factory's corresponding model. + * + * @var string + */ + protected $model = \App\Models\Consumable::class; -$factory->state(App\Models\Consumable::class, 'cardstock', function ($faker) { - - return [ - 'name' => 'Cardstock (White)', - 'category_id' => 10, - 'manufacturer_id' => 10, - 'qty' => 10, - 'min_amt' => 2, - 'company_id' => 3 - ]; -}); - -$factory->state(App\Models\Consumable::class, 'paper', function ($faker) { - - return [ - 'name' => 'Laserjet Paper (Ream)', - 'category_id' => 10, - 'manufacturer_id' => 10, - 'qty' => 20, - 'min_amt' => 2 - ]; -}); - -$factory->state(App\Models\Consumable::class, 'ink', function ($faker) { - - return [ - 'name' => 'Laserjet Toner (black)', - 'category_id' => 11, - 'manufacturer_id' => 5, - 'qty' => 20, - 'min_amt' => 2 - ]; -}); + /** + * Define the model's default state. + * + * @return array + */ + public function definition() + { + return [ + 'user_id' => 1, + 'item_no' => $this->faker->numberBetween(1000000, 50000000), + 'order_number' => $this->faker->numberBetween(1000000, 50000000), + 'purchase_date' => $this->faker->dateTimeBetween('-1 years', 'now', date_default_timezone_get()), + 'purchase_cost' => $this->faker->randomFloat(2, 1, 50), + 'qty' => $this->faker->numberBetween(5, 10), + 'min_amt' => $this->faker->numberBetween($min = 1, $max = 2), + ]; + } + public function cardstock() + { + return $this->state(function () { + return [ + 'name' => 'Cardstock (White)', + 'category_id' => 10, + 'manufacturer_id' => 10, + 'qty' => 10, + 'min_amt' => 2, + 'company_id' => 3, + ]; + }); + } + public function paper() + { + return $this->state(function () { + return [ + 'name' => 'Laserjet Paper (Ream)', + 'category_id' => 10, + 'manufacturer_id' => 10, + 'qty' => 20, + 'min_amt' => 2, + ]; + }); + } + public function ink() + { + return $this->state(function () { + return [ + 'name' => 'Laserjet Toner (black)', + 'category_id' => 11, + 'manufacturer_id' => 5, + 'qty' => 20, + 'min_amt' => 2, + ]; + }); + } +} diff --git a/database/factories/CustomFieldFactory.php b/database/factories/CustomFieldFactory.php new file mode 100644 index 0000000000..c964ea44d1 --- /dev/null +++ b/database/factories/CustomFieldFactory.php @@ -0,0 +1,80 @@ + $this->faker->catchPhrase, + 'format' => '', + 'element' => 'text', + ]; + } + + public function imei() + { + return $this->state(function () { + return [ + 'name' => 'IMEI', + 'help_text' => 'The IMEI number for this device.', + 'format' => 'regex:/^[0-9]{15}$/', + ]; + }); + } + + public function phone() + { + return $this->state(function () { + return [ + 'name' => 'Phone Number', + 'help_text' => 'Enter the phone number for this device.', + ]; + }); + } + + public function ram() + { + return $this->state(function () { + return [ + 'name' => 'RAM', + 'help_text' => 'The amount of RAM this device has.', + ]; + }); + } + + public function cpu() + { + return $this->state(function () { + return [ + 'name' => 'CPU', + 'help_text' => 'The speed of the processor on this device.', + ]; + }); + } + + public function macAddress() + { + return $this->state(function () { + return [ + 'name' => 'MAC Address', + 'format' => 'regex:/^([0-9a-fA-F]{2}[:-]){5}[0-9a-fA-F]{2}$/', + ]; + }); + } +} diff --git a/database/factories/CustomFieldsFactory.php b/database/factories/CustomFieldsFactory.php deleted file mode 100644 index 7840014fd0..0000000000 --- a/database/factories/CustomFieldsFactory.php +++ /dev/null @@ -1,48 +0,0 @@ -define(App\Models\CustomField::class, function (Faker\Generator $faker) { - return [ - 'name' => $faker->catchPhrase, - 'format' => '', - 'element' => 'text', - ]; -}); - -$factory->state(App\Models\CustomField::class, 'imei', function ($faker) { - return [ - 'name' => 'IMEI', - 'help_text' => 'The IMEI number for this device.', - 'format' => 'regex:/^[0-9]{15}$/', - ]; -}); - -$factory->state(App\Models\CustomField::class, 'phone', function ($faker) { - return [ - 'name' => 'Phone Number', - 'help_text' => 'Enter the phone number for this device.', - ]; -}); - -$factory->state(App\Models\CustomField::class, 'ram', function ($faker) { - return [ - 'name' => 'RAM', - 'help_text' => 'The amount of RAM this device has.', - ]; -}); - -$factory->state(App\Models\CustomField::class, 'cpu', function ($faker) { - return [ - 'name' => 'CPU', - 'help_text' => 'The speed of the processor on this device.', - ]; -}); - - -$factory->state(App\Models\CustomField::class, 'mac-address', function ($faker) { - return [ - 'name' => 'MAC Address', - 'format' => 'regex:/^([0-9a-fA-F]{2}[:-]){5}[0-9a-fA-F]{2}$/', - ]; -}); - diff --git a/database/factories/CustomFieldsetFactory.php b/database/factories/CustomFieldsetFactory.php index bab8cbe58f..1dd834d052 100644 --- a/database/factories/CustomFieldsetFactory.php +++ b/database/factories/CustomFieldsetFactory.php @@ -1,23 +1,45 @@ define(App\Models\CustomFieldset::class, function (Faker\Generator $faker) { - return [ - 'name' => $faker->catchPhrase, - ]; -}); +use Illuminate\Database\Eloquent\Factories\Factory; -$factory->state(App\Models\CustomFieldset::class, 'mobile', function ($faker) { - return [ - 'name' => 'Mobile Devices', - ]; -}); - -$factory->state(App\Models\CustomFieldset::class, 'computer', function ($faker) { - return [ - 'name' => 'Laptops and Desktops', - ]; -}); +class CustomFieldsetFactory extends Factory +{ + /** + * The name of the factory's corresponding model. + * + * @var string + */ + protected $model = \App\Models\CustomFieldset::class; + /** + * Define the model's default state. + * + * @return array + */ + public function definition() + { + return [ + 'name' => $this->faker->catchPhrase, + ]; + } + public function mobile() + { + return $this->state(function () { + return [ + 'name' => 'Mobile Devices', + ]; + }); + } + public function computer() + { + return $this->state(function () { + return [ + 'name' => 'Laptops and Desktops', + ]; + }); + } +} diff --git a/database/factories/DepartmentFactory.php b/database/factories/DepartmentFactory.php new file mode 100644 index 0000000000..ad80d32841 --- /dev/null +++ b/database/factories/DepartmentFactory.php @@ -0,0 +1,100 @@ + 1, + 'location_id' => rand(1, 5), + ]; + } + + public function hr() + { + return $this->state(function () { + return [ + 'name' => 'Human Resources', + ]; + }); + } + + public function engineering() + { + return $this->state(function () { + return [ + 'name' => 'Engineering', + ]; + }); + } + + public function marketing() + { + return $this->state(function () { + return [ + 'name' => 'Marketing', + ]; + }); + } + + public function client() + { + return $this->state(function () { + return [ + 'name' => 'Client Services', + ]; + }); + } + + public function design() + { + return $this->state(function () { + return [ + 'name' => 'Graphic Design', + ]; + }); + } + + public function product() + { + return $this->state(function () { + return [ + 'name' => 'Product Management', + ]; + }); + } + + public function silly() + { + return $this->state(function () { + return [ + 'name' => 'Dept of Silly Walks', + ]; + }); + } +} diff --git a/database/factories/DepartmentsFactory.php b/database/factories/DepartmentsFactory.php deleted file mode 100644 index 8b4d0f357a..0000000000 --- a/database/factories/DepartmentsFactory.php +++ /dev/null @@ -1,62 +0,0 @@ -define(App\Models\Department::class, function (Faker\Generator $faker) { - return [ - 'user_id' => 1, - 'location_id' => rand(1,5), - ]; -}); - -$factory->state(App\Models\Department::class, 'hr', function ($faker) { - return [ - 'name' => 'Human Resources', - ]; -}); - -$factory->state(App\Models\Department::class, 'engineering', function ($faker) { - return [ - 'name' => 'Engineering', - ]; -}); - -$factory->state(App\Models\Department::class, 'marketing', function ($faker) { - return [ - 'name' => 'Marketing', - ]; -}); - -$factory->state(App\Models\Department::class, 'client', function ($faker) { - return [ - 'name' => 'Client Services', - ]; -}); - -$factory->state(App\Models\Department::class, 'design', function ($faker) { - return [ - 'name' => 'Graphic Design', - ]; -}); - -$factory->state(App\Models\Department::class, 'product', function ($faker) { - return [ - 'name' => 'Product Management', - ]; -}); - -$factory->state(App\Models\Department::class, 'silly', function ($faker) { - return [ - 'name' => 'Dept of Silly Walks', - ]; -}); - - - diff --git a/database/factories/DepreciationFactory.php b/database/factories/DepreciationFactory.php index e1df63dab2..2a1bfe4cd2 100644 --- a/database/factories/DepreciationFactory.php +++ b/database/factories/DepreciationFactory.php @@ -1,5 +1,9 @@ define(App\Models\Depreciation::class, function (Faker\Generator $faker) { - return [ - 'user_id' => 1, - ]; -}); - -$factory->state(App\Models\Depreciation::class, 'computer', function ($faker) { - return [ - 'name' => 'Computer Depreciation', - 'months' => 36, - ]; -}); - -$factory->state(App\Models\Depreciation::class, 'display', function ($faker) { - return [ - 'name' => 'Display Depreciation', - 'months' => 12, - ]; -}); - -$factory->state(App\Models\Depreciation::class, 'mobile-phones', function ($faker) { - return [ - 'name' => 'Mobile Phone Depreciation', - 'months' => 24, - ]; -}); +class DepreciationFactory extends Factory +{ + /** + * The name of the factory's corresponding model. + * + * @var string + */ + protected $model = \App\Models\Depreciation::class; + /** + * Define the model's default state. + * + * @return array + */ + public function definition() + { + return [ + 'user_id' => 1, + ]; + } + public function computer() + { + return $this->state(function () { + return [ + 'name' => 'Computer Depreciation', + 'months' => 36, + ]; + }); + } + public function display() + { + return $this->state(function () { + return [ + 'name' => 'Display Depreciation', + 'months' => 12, + ]; + }); + } + public function mobilePhones() + { + return $this->state(function () { + return [ + 'name' => 'Mobile Phone Depreciation', + 'months' => 24, + ]; + }); + } +} diff --git a/database/factories/GroupFactory.php b/database/factories/GroupFactory.php new file mode 100644 index 0000000000..17f3493c2b --- /dev/null +++ b/database/factories/GroupFactory.php @@ -0,0 +1,45 @@ + $this->faker->name, + ]; + } +} diff --git a/database/factories/LicenseFactory.php b/database/factories/LicenseFactory.php index b4b440f45c..7b4c1bc787 100644 --- a/database/factories/LicenseFactory.php +++ b/database/factories/LicenseFactory.php @@ -1,5 +1,9 @@ define(App\Models\License::class, function (Faker\Generator $faker) { - - return [ - 'user_id' => 1, - 'license_name' => $faker->name, - 'license_email' => $faker->safeEmail, - 'serial' => $faker->uuid, - 'notes' => 'Created by DB seeder', - 'purchase_date' => $faker->dateTimeBetween('-1 years','now', date_default_timezone_get()), - 'order_number' => $faker->numberBetween(1000000, 50000000), - 'expiration_date' => $faker->dateTimeBetween('now', '+3 years', date_default_timezone_get())->format('Y-m-d H:i:s'), - 'reassignable' => $faker->boolean(), - 'termination_date' => $faker->dateTimeBetween('-1 years','now', date_default_timezone_get())->format('Y-m-d H:i:s'), - 'supplier_id' => $faker->numberBetween(1,5), - ]; -}); - // 1 -$factory->state(App\Models\License::class, 'photoshop', function ($faker) { - $data = [ - 'name' => 'Photoshop', - 'manufacturer_id' => 9, - 'purchase_cost' => '299.99', - 'seats' => 10, - 'purchase_order' => '13503Q', - 'maintained' => true, - 'category_id' => 14, - ]; - - return $data; - -}); // 2 -$factory->state(App\Models\License::class, 'acrobat', function ($faker) { - - $data = [ - 'name' => 'Acrobat', - 'manufacturer_id' => 9, - 'purchase_cost' => '29.99', - 'seats' => 10, - 'category_id' => 14, - ]; - - - return $data; -}); // 3 -$factory->state(App\Models\License::class, 'indesign', function ($faker) { - $data = [ - 'name' => 'InDesign', - 'manufacturer_id' => 9, - 'purchase_cost' => '199.99', - 'seats' => 10, - 'category_id' => 14, - ]; - - - return $data; -}); - // 4 -$factory->state(App\Models\License::class, 'office', function ($faker) { - $data = [ - 'name' => 'Office', - 'manufacturer_id' => 2, - 'purchase_cost' => '49.99', - 'seats' => 20, - 'category_id' => 15, - ]; +class LicenseFactory extends Factory +{ + /** + * The name of the factory's corresponding model. + * + * @var string + */ + protected $model = \App\Models\License::class; - return $data; -}); + /** + * Define the model's default state. + * + * @return array + */ + public function definition() + { + return [ + 'user_id' => 1, + 'license_name' => $this->faker->name, + 'license_email' => $this->faker->safeEmail, + 'serial' => $this->faker->uuid, + 'notes' => 'Created by DB seeder', + 'purchase_date' => $this->faker->dateTimeBetween('-1 years', 'now', date_default_timezone_get()), + 'order_number' => $this->faker->numberBetween(1000000, 50000000), + 'expiration_date' => $this->faker->dateTimeBetween('now', '+3 years', date_default_timezone_get())->format('Y-m-d H:i:s'), + 'reassignable' => $this->faker->boolean(), + 'termination_date' => $this->faker->dateTimeBetween('-1 years', 'now', date_default_timezone_get())->format('Y-m-d H:i:s'), + 'supplier_id' => $this->faker->numberBetween(1, 5), + ]; + } + public function photoshop() + { + return $this->state(function () { + $data = [ + 'name' => 'Photoshop', + 'manufacturer_id' => 9, + 'purchase_cost' => '299.99', + 'seats' => 10, + 'purchase_order' => '13503Q', + 'maintained' => true, + 'category_id' => 14, + ]; + return $data; + }); + } + + public function acrobat() + { + return $this->state(function () { + $data = [ + 'name' => 'Acrobat', + 'manufacturer_id' => 9, + 'purchase_cost' => '29.99', + 'seats' => 10, + 'category_id' => 14, + ]; + + return $data; + }); + } + + public function indesign() + { + return $this->state(function () { + $data = [ + 'name' => 'InDesign', + 'manufacturer_id' => 9, + 'purchase_cost' => '199.99', + 'seats' => 10, + 'category_id' => 14, + ]; + + return $data; + }); + } + + public function office() + { + return $this->state(function () { + $data = [ + 'name' => 'Office', + 'manufacturer_id' => 2, + 'purchase_cost' => '49.99', + 'seats' => 20, + 'category_id' => 15, + ]; + + return $data; + }); + } +} diff --git a/database/factories/LocationFactory.php b/database/factories/LocationFactory.php new file mode 100644 index 0000000000..ef90f006a9 --- /dev/null +++ b/database/factories/LocationFactory.php @@ -0,0 +1,53 @@ + $this->faker->city, + 'address' => $this->faker->streetAddress, + 'address2' => $this->faker->secondaryAddress, + 'city' => $this->faker->city, + 'state' => $this->faker->stateAbbr, + 'country' => $this->faker->countryCode, + 'currency' => $this->faker->currencyCode, + 'zip' => $this->faker->postcode, + 'image' => rand(1, 9).'.jpg', + ]; + } +} diff --git a/database/factories/ManufacturerFactory.php b/database/factories/ManufacturerFactory.php index ff1ab4645f..427cd0b6db 100644 --- a/database/factories/ManufacturerFactory.php +++ b/database/factories/ManufacturerFactory.php @@ -1,5 +1,9 @@ define(App\Models\Manufacturer::class, function (Faker\Generator $faker) { - return [ - 'user_id' => 1, - 'support_phone' => $faker->phoneNumber(), - 'url' => $faker->url(), - 'support_email' => $faker->safeEmail(), - ]; -}); - - // 1 -$factory->state(App\Models\Manufacturer::class, 'apple', function ($faker) { - return [ - 'name' => 'Apple', - 'url' => 'https://apple.com', - 'support_url' => 'https://support.apple.com', - 'image' => 'apple.jpg', - ]; -}); // 2 -$factory->state(App\Models\Manufacturer::class, 'microsoft', function ($faker) { - return [ - 'name' => 'Microsoft', - 'url' => 'https://microsoft.com', - 'support_url' => 'https://support.microsoft.com', - 'image' => 'microsoft.png', - ]; -}); // 3 -$factory->state(App\Models\Manufacturer::class, 'dell', function ($faker) { - return [ - 'name' => 'Dell', - 'url' => 'https://dell.com', - 'support_url' => 'https://support.dell.com', - 'image' => 'dell.png', - ]; -}); // 4 -$factory->state(App\Models\Manufacturer::class, 'asus', function ($faker) { - return [ - 'name' => 'Asus', - 'url' => 'https://asus.com', - 'support_url' => 'https://support.asus.com', - 'image' => 'asus.png', - ]; -}); // 5 -$factory->state(App\Models\Manufacturer::class, 'hp', function ($faker) { - return [ - 'name' => 'HP', - 'url' => 'https://hp.com', - 'support_url' => 'https://support.hp.com', - 'image' => 'hp.png', - ]; -}); // 6 -$factory->state(App\Models\Manufacturer::class, 'lenovo', function ($faker) { - return [ - 'name' => 'Lenovo', - 'url' => 'https://lenovo.com', - 'support_url' => 'https://support.lenovo.com', - 'image' => 'lenovo.jpg', - ]; -}); // 7 -$factory->state(App\Models\Manufacturer::class, 'lg', function ($faker) { - return [ - 'name' => 'LG', - 'url' => 'https://lg.com', - 'support_url' => 'https://support.lg.com', - 'image' => 'lg.jpg', - ]; -}); // 8 -$factory->state(App\Models\Manufacturer::class, 'polycom', function ($faker) { - return [ - 'name' => 'Polycom', - 'url' => 'https://polycom.com', - 'support_url' => 'https://support.polycom.com', - 'image' => 'polycom.png', - ]; -}); // 9 -$factory->state(App\Models\Manufacturer::class, 'adobe', function ($faker) { - return [ - 'name' => 'Adobe', - 'url' => 'https://adobe.com', - 'support_url' => 'https://support.adobe.com', - 'image' => 'adobe.jpg', - ]; -}); - // 10 -$factory->state(App\Models\Manufacturer::class, 'avery', function ($faker) { - return [ - 'name' => 'Avery', - 'url' => 'https://avery.com', - 'support_url' => 'https://support.avery.com', - 'image' => 'avery.png', - ]; -}); // 11 -$factory->state(App\Models\Manufacturer::class, 'crucial', function ($faker) { - return [ - 'name' => 'Crucial', - 'url' => 'https://crucial.com', - 'support_url' => 'https://support.crucial.com', - 'image' => 'crucial.jpg', - ]; -}); +class ManufacturerFactory extends Factory +{ + /** + * The name of the factory's corresponding model. + * + * @var string + */ + protected $model = \App\Models\Manufacturer::class; + /** + * Define the model's default state. + * + * @return array + */ + public function definition() + { + return [ + 'user_id' => 1, + 'support_phone' => $this->faker->phoneNumber(), + 'url' => $this->faker->url(), + 'support_email' => $this->faker->safeEmail(), + ]; + } + public function apple() + { + return $this->state(function () { + return [ + 'name' => 'Apple', + 'url' => 'https://apple.com', + 'support_url' => 'https://support.apple.com', + 'image' => 'apple.jpg', + ]; + }); + } + + public function microsoft() + { + return $this->state(function () { + return [ + 'name' => 'Microsoft', + 'url' => 'https://microsoft.com', + 'support_url' => 'https://support.microsoft.com', + 'image' => 'microsoft.png', + ]; + }); + } + + public function dell() + { + return $this->state(function () { + return [ + 'name' => 'Dell', + 'url' => 'https://dell.com', + 'support_url' => 'https://support.dell.com', + 'image' => 'dell.png', + ]; + }); + } + + public function asus() + { + return $this->state(function () { + return [ + 'name' => 'Asus', + 'url' => 'https://asus.com', + 'support_url' => 'https://support.asus.com', + 'image' => 'asus.png', + ]; + }); + } + + public function hp() + { + return $this->state(function () { + return [ + 'name' => 'HP', + 'url' => 'https://hp.com', + 'support_url' => 'https://support.hp.com', + 'image' => 'hp.png', + ]; + }); + } + + public function lenovo() + { + return $this->state(function () { + return [ + 'name' => 'Lenovo', + 'url' => 'https://lenovo.com', + 'support_url' => 'https://support.lenovo.com', + 'image' => 'lenovo.jpg', + ]; + }); + } + + public function lg() + { + return $this->state(function () { + return [ + 'name' => 'LG', + 'url' => 'https://lg.com', + 'support_url' => 'https://support.lg.com', + 'image' => 'lg.jpg', + ]; + }); + } + + public function polycom() + { + return $this->state(function () { + return [ + 'name' => 'Polycom', + 'url' => 'https://polycom.com', + 'support_url' => 'https://support.polycom.com', + 'image' => 'polycom.png', + ]; + }); + } + + public function adobe() + { + return $this->state(function () { + return [ + 'name' => 'Adobe', + 'url' => 'https://adobe.com', + 'support_url' => 'https://support.adobe.com', + 'image' => 'adobe.jpg', + ]; + }); + } + + public function avery() + { + return $this->state(function () { + return [ + 'name' => 'Avery', + 'url' => 'https://avery.com', + 'support_url' => 'https://support.avery.com', + 'image' => 'avery.png', + ]; + }); + } + + public function crucial() + { + return $this->state(function () { + return [ + 'name' => 'Crucial', + 'url' => 'https://crucial.com', + 'support_url' => 'https://support.crucial.com', + 'image' => 'crucial.jpg', + ]; + }); + } +} diff --git a/database/factories/ModelFactory.php b/database/factories/ModelFactory.php deleted file mode 100644 index ad903e33ba..0000000000 --- a/database/factories/ModelFactory.php +++ /dev/null @@ -1,101 +0,0 @@ -define(App\Models\Company::class, function (Faker\Generator $faker) { - return [ - 'name' => $faker->company, - ]; -}); - -$factory->define(App\Models\Component::class, function (Faker\Generator $faker) { - return [ - 'name' => $faker->text(20), - 'category_id' => function () { - return factory(App\Models\Category::class)->create()->id; - }, - 'location_id' => 1, - 'serial' => $faker->uuid, - 'qty' => $faker->numberBetween(3, 10), - 'order_number' => $faker->numberBetween(1000000, 50000000), - 'purchase_date' => $faker->dateTime(), - 'purchase_cost' => $faker->randomFloat(2), - 'min_amt' => $faker->numberBetween($min = 1, $max = 2), - 'company_id' => function () { - return factory(App\Models\Company::class)->create()->id; - }, - ]; -}); - -$factory->define(App\Models\Group::class, function (Faker\Generator $faker) { - return [ - 'name' => $faker->name, - ]; -}); - -$factory->define(App\Models\Location::class, function (Faker\Generator $faker) { - return [ - 'name' => $faker->city, - 'address' => $faker->streetAddress, - 'address2' => $faker->secondaryAddress, - 'city' => $faker->city, - 'state' => $faker->stateAbbr, - 'country' => $faker->countryCode, - 'currency' => $faker->currencyCode, - 'zip' => $faker->postcode, - 'image' => rand(1,9).'.jpg', - ]; -}); - - -$factory->define(App\Models\Supplier::class, function (Faker\Generator $faker) { - return [ - 'name' => $faker->company, - 'address' => $faker->streetAddress, - 'address2' => $faker->secondaryAddress, - 'city' => $faker->city, - 'state' => $faker->stateAbbr, - 'zip' => $faker->postCode, - 'country' => $faker->countryCode, - 'contact' => $faker->name, - 'phone' => $faker->phoneNumber, - 'fax' => $faker->phoneNumber, - 'email' => $faker->safeEmail, - 'url' => $faker->url, - 'notes' => $faker->text(191) // Supplier notes can be a max of 255 characters. - ]; -}); - -$factory->define(App\Models\Setting::class, function ($faker) { - return [ - 'user_id' => 1, - 'per_page' => 20, - 'site_name' => $faker->sentence, - 'auto_increment_assets' => false, - 'alert_email' => $faker->safeEmail(), - 'alerts_enabled' => true, - 'brand' => 1, - 'default_currency' => $faker->currencyCode, - 'locale' => $faker->locale, - 'pwd_secure_min' => 10, // Match web setup - 'email_domain' => 'test.com', - ]; -}); diff --git a/database/factories/SettingFactory.php b/database/factories/SettingFactory.php new file mode 100644 index 0000000000..d5858e1931 --- /dev/null +++ b/database/factories/SettingFactory.php @@ -0,0 +1,55 @@ + 1, + 'per_page' => 20, + 'site_name' => $this->faker->sentence, + 'auto_increment_assets' => false, + 'alert_email' => $this->faker->safeEmail(), + 'alerts_enabled' => true, + 'brand' => 1, + 'default_currency' => $this->faker->currencyCode, + 'locale' => $this->faker->locale, + 'pwd_secure_min' => 10, // Match web setup + 'email_domain' => 'test.com', + ]; + } +} diff --git a/database/factories/StatusLabelFactory.php b/database/factories/StatusLabelFactory.php deleted file mode 100644 index ac4d07d6e0..0000000000 --- a/database/factories/StatusLabelFactory.php +++ /dev/null @@ -1,67 +0,0 @@ -define(Statuslabel::class, function (Faker\Generator $faker) { - return [ - 'name' => $faker->sentence, - 'created_at' => $faker->dateTime(), - 'updated_at' => $faker->dateTime(), - 'user_id' => 1, - 'deleted_at' => null, - 'deployable' => 0, - 'pending' => 0, - 'archived' => 0, - 'notes' => '' - ]; -}); -$factory->state(Statuslabel::class, 'rtd', function (Faker\Generator $faker) { - return [ - 'notes' => $faker->sentence, - 'deployable' => 1, - 'default_label' => 1, - ]; -}); -$factory->state(Statuslabel::class, 'pending', function (Faker\Generator $faker) { - return [ - 'notes' => $faker->sentence, - 'pending' => 1, - 'default_label' => 1, - ]; -}); - -$factory->state(Statuslabel::class, 'archived', function (Faker\Generator $faker) { - return [ - 'notes' => 'These assets are permanently undeployable', - 'archived' => 1, - 'default_label' => 0, - ]; -}); - -$factory->state(Statuslabel::class, 'out_for_diagnostics', function (Faker\Generator $faker) { - return [ - 'name' => 'Out for Diagnostics', - 'default_label' => 0, - ]; -}); - -$factory->state(Statuslabel::class, 'out_for_repair', function (Faker\Generator $faker) { - return [ - 'name' => 'Out for Repair', - 'default_label' => 0, - ]; -}); - -$factory->state(Statuslabel::class, 'broken', function (Faker\Generator $faker) { - return [ - 'name' => 'Broken - Not Fixable', - 'default_label' => 0, - ]; -}); - -$factory->state(Statuslabel::class, 'lost', function (Faker\Generator $faker) { - return [ - 'name' => 'Lost/Stolen', - 'default_label' => 0, - ]; -}); diff --git a/database/factories/StatuslabelFactory.php b/database/factories/StatuslabelFactory.php new file mode 100644 index 0000000000..051e8131ee --- /dev/null +++ b/database/factories/StatuslabelFactory.php @@ -0,0 +1,109 @@ + $this->faker->sentence, + 'created_at' => $this->faker->dateTime(), + 'updated_at' => $this->faker->dateTime(), + 'user_id' => 1, + 'deleted_at' => null, + 'deployable' => 0, + 'pending' => 0, + 'archived' => 0, + 'notes' => '', + ]; + } + + public function rtd() + { + return $this->state(function () { + return [ + 'notes' => $this->faker->sentence, + 'deployable' => 1, + 'default_label' => 1, + ]; + }); + } + + public function pending() + { + return $this->state(function () { + return [ + 'notes' => $this->faker->sentence, + 'pending' => 1, + 'default_label' => 1, + ]; + }); + } + + public function archived() + { + return $this->state(function () { + return [ + 'notes' => 'These assets are permanently undeployable', + 'archived' => 1, + 'default_label' => 0, + ]; + }); + } + + public function outForDiagnostics() + { + return $this->state(function () { + return [ + 'name' => 'Out for Diagnostics', + 'default_label' => 0, + ]; + }); + } + + public function outForRepair() + { + return $this->state(function () { + return [ + 'name' => 'Out for Repair', + 'default_label' => 0, + ]; + }); + } + + public function broken() + { + return $this->state(function () { + return [ + 'name' => 'Broken - Not Fixable', + 'default_label' => 0, + ]; + }); + } + + public function lost() + { + return $this->state(function () { + return [ + 'name' => 'Lost/Stolen', + 'default_label' => 0, + ]; + }); + } +} diff --git a/database/factories/SupplierFactory.php b/database/factories/SupplierFactory.php new file mode 100644 index 0000000000..344dfe7d5b --- /dev/null +++ b/database/factories/SupplierFactory.php @@ -0,0 +1,57 @@ + $this->faker->company, + 'address' => $this->faker->streetAddress, + 'address2' => $this->faker->secondaryAddress, + 'city' => $this->faker->city, + 'state' => $this->faker->stateAbbr, + 'zip' => $this->faker->postCode, + 'country' => $this->faker->countryCode, + 'contact' => $this->faker->name, + 'phone' => $this->faker->phoneNumber, + 'fax' => $this->faker->phoneNumber, + 'email' => $this->faker->safeEmail, + 'url' => $this->faker->url, + 'notes' => $this->faker->text(191), // Supplier notes can be a max of 255 characters. + ]; + } +} diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php index a26897817c..30a502db52 100644 --- a/database/factories/UserFactory.php +++ b/database/factories/UserFactory.php @@ -1,280 +1,410 @@ define(App\Models\User::class, function (Faker\Generator $faker) use ($password) { - return [ - 'activated' => 1, - 'address' => $faker->address, - 'city' => $faker->city, - 'company_id' => rand(1,4), - 'country' => $faker->country, - 'department_id' => rand(1,6), - 'email' => $faker->safeEmail, - 'employee_num' => $faker->numberBetween(3500, 35050), - 'first_name' => $faker->firstName, - 'jobtitle' => $faker->jobTitle, - 'last_name' => $faker->lastName, - 'locale' => $faker->locale, - 'location_id' => rand(1,5), - 'notes' => 'Created by DB seeder', - 'password' => $password, - 'permissions' => '{"user":"0"}', - 'phone' => $faker->phoneNumber, - 'state' => $faker->stateAbbr, - 'username' => $faker->username, - 'zip' => $faker->postcode - ]; -}); +use Illuminate\Database\Eloquent\Factories\Factory; -$factory->state(App\Models\User::class, 'first-admin', function ($faker) { - return [ - 'first_name' => 'Admin', - 'last_name' => 'User', - 'username' => 'admin', - 'permissions' => '{"superuser":"1"}', - ]; -}); +class UserFactory extends Factory +{ + /** + * The name of the factory's corresponding model. + * + * @var string + */ + protected $model = \App\Models\User::class; -$factory->state(App\Models\User::class, 'snipe-admin', function ($faker) { - return [ - 'first_name' => 'Snipe E.', - 'last_name' => 'Head', - 'username' => 'snipe', - 'email' => 'snipe@snipe.net', - 'permissions' => '{"superuser":"1"}', - ]; -}); + /** + * Define the model's default state. + * + * @return array + */ + public function definition() + { + $password = bcrypt('password'); + return [ + 'activated' => 1, + 'address' => $this->faker->address, + 'city' => $this->faker->city, + 'company_id' => rand(1, 4), + 'country' => $this->faker->country, + 'department_id' => rand(1, 6), + 'email' => $this->faker->safeEmail, + 'employee_num' => $this->faker->numberBetween(3500, 35050), + 'first_name' => $this->faker->firstName, + 'jobtitle' => $this->faker->jobTitle, + 'last_name' => $this->faker->lastName, + 'locale' => $this->faker->locale, + 'location_id' => rand(1, 5), + 'notes' => 'Created by DB seeder', + 'password' => $password, + 'permissions' => '{"user":"0"}', + 'phone' => $this->faker->phoneNumber, + 'state' => $this->faker->stateAbbr, + 'username' => $this->faker->username, + 'zip' => $this->faker->postcode, + ]; + } + public function firstAdmin() + { + return $this->state(function () { + return [ + 'first_name' => 'Admin', + 'last_name' => 'User', + 'username' => 'admin', + 'avatar' => '1.jpg', + 'permissions' => '{"superuser":"1"}', + ]; + }); + } -// USER GLOBAL PERMISSION STATES -$factory->state(App\Models\User::class, 'superuser', function ($faker) { - return [ - 'permissions' => '{"superuser":"1"}', - ]; -}); + public function snipeAdmin() + { + return $this->state(function () { + return [ + 'first_name' => 'Snipe E.', + 'last_name' => 'Head', + 'username' => 'snipe', + 'avatar' => '2.jpg', + 'email' => 'snipe@snipe.net', + 'permissions' => '{"superuser":"1"}', + ]; + }); + } -$factory->state(App\Models\User::class, 'admin', function ($faker) { - return [ - 'permissions' => '{"admin":"1"}', - 'manager_id' => rand(1,2), - ]; -}); -// USER ASSET PERMISSION STATES -$factory->state(App\Models\User::class, 'view-assets', function ($faker) { - return [ - 'permissions' => '{"assets.view":"1"}', - ]; -}); + public function superuser() + { + return $this->state(function () { + return [ + 'permissions' => '{"superuser":"1"}', + ]; + }); + } -$factory->state(App\Models\User::class, 'create-assets', function ($faker) { - return [ - 'permissions' => '{"assets.create":"1"}', - ]; -}); + public function admin() + { + return $this->state(function () { + return [ + 'permissions' => '{"admin":"1"}', + 'manager_id' => rand(1, 2), + ]; + }); + } -$factory->state(App\Models\User::class, 'edit-assets', function ($faker) { - return [ - 'permissions' => '{"assets.edit":"1"}', - ]; -}); + public function viewAssets() + { + return $this->state(function () { + return [ + 'permissions' => '{"assets.view":"1"}', + ]; + }); + } -$factory->state(App\Models\User::class, 'delete-assets', function ($faker) { - return [ - 'permissions' => '{"assets.delete":"1"}', - ]; -}); + public function createAssets() + { + return $this->state(function () { + return [ + 'permissions' => '{"assets.create":"1"}', + ]; + }); + } -$factory->state(App\Models\User::class, 'checkin-assets', function ($faker) { - return [ - 'permissions' => '{"assets.checkin":"1"}', - ]; -}); + public function editAssets() + { + return $this->state(function () { + return [ + 'permissions' => '{"assets.edit":"1"}', + ]; + }); + } -$factory->state(App\Models\User::class, 'checkout-assets', function ($faker) { - return [ - 'permissions' => '{"assets.checkout":"1"}', - ]; -}); + public function deleteAssets() + { + return $this->state(function () { + return [ + 'permissions' => '{"assets.delete":"1"}', + ]; + }); + } -$factory->state(App\Models\User::class, 'view-requestable-assets', function ($faker) { - return [ - 'permissions' => '{"assets.view.requestable":"1"}', - ]; -}); + public function checkinAssets() + { + return $this->state(function () { + return [ + 'permissions' => '{"assets.checkin":"1"}', + ]; + }); + } -// USER ACCESSORY PERMISSION STATES -$factory->state(App\Models\User::class, 'view-accessories', function ($faker) { - return [ - 'permissions' => '{"accessories.view":"1"}', - ]; -}); + public function checkoutAssets() + { + return $this->state(function () { + return [ + 'permissions' => '{"assets.checkout":"1"}', + ]; + }); + } -$factory->state(App\Models\User::class, 'create-accessories', function ($faker) { - return [ - 'permissions' => '{"accessories.create":"1"}', - ]; -}); + public function viewRequestableAssets() + { + return $this->state(function () { + return [ + 'permissions' => '{"assets.view.requestable":"1"}', + ]; + }); + } -$factory->state(App\Models\User::class, 'edit-accessories', function ($faker) { - return [ - 'permissions' => '{"accessories.edit":"1"}', - ]; -}); + public function viewAccessories() + { + return $this->state(function () { + return [ + 'permissions' => '{"accessories.view":"1"}', + ]; + }); + } -$factory->state(App\Models\User::class, 'delete-accessories', function ($faker) { - return [ - 'permissions' => '{"accessories.delete":"1"}', - ]; -}); + public function createAccessories() + { + return $this->state(function () { + return [ + 'permissions' => '{"accessories.create":"1"}', + ]; + }); + } -$factory->state(App\Models\User::class, 'checkin-accessories', function ($faker) { - return [ - 'permissions' => '{"accessories.checkin":"1"}', - ]; -}); + public function editAccessories() + { + return $this->state(function () { + return [ + 'permissions' => '{"accessories.edit":"1"}', + ]; + }); + } -$factory->state(App\Models\User::class, 'checkout-accessories', function ($faker) { - return [ - 'permissions' => '{"accessories.checkout":"1"}', - ]; -}); + public function deleteAccessories() + { + return $this->state(function () { + return [ + 'permissions' => '{"accessories.delete":"1"}', + ]; + }); + } -// USER CONSUMABLE PERMISSION STATES -$factory->state(App\Models\User::class, 'view-consumables', function ($faker) { - return [ - 'permissions' => '{"consumables.view":"1"}', - ]; -}); + public function checkinAccessories() + { + return $this->state(function () { + return [ + 'permissions' => '{"accessories.checkin":"1"}', + ]; + }); + } -$factory->state(App\Models\User::class, 'create-consumables', function ($faker) { - return [ - 'permissions' => '{"consumables.create":"1"}', - ]; -}); + public function checkoutAccessories() + { + return $this->state(function () { + return [ + 'permissions' => '{"accessories.checkout":"1"}', + ]; + }); + } -$factory->state(App\Models\User::class, 'edit-consumables', function ($faker) { - return [ - 'permissions' => '{"consumables.edit":"1"}', - ]; -}); + public function viewConsumables() + { + return $this->state(function () { + return [ + 'permissions' => '{"consumables.view":"1"}', + ]; + }); + } -$factory->state(App\Models\User::class, 'delete-consumables', function ($faker) { - return [ - 'permissions' => '{"consumables.delete":"1"}', - ]; -}); + public function createConsumables() + { + return $this->state(function () { + return [ + 'permissions' => '{"consumables.create":"1"}', + ]; + }); + } -$factory->state(App\Models\User::class, 'checkin-consumables', function ($faker) { - return [ - 'permissions' => '{"consumables.checkin":"1"}', - ]; -}); + public function editConsumables() + { + return $this->state(function () { + return [ + 'permissions' => '{"consumables.edit":"1"}', + ]; + }); + } -$factory->state(App\Models\User::class, 'checkout-consumables', function ($faker) { - return [ - 'permissions' => '{"consumables.checkout":"1"}', - ]; -}); + public function deleteConsumables() + { + return $this->state(function () { + return [ + 'permissions' => '{"consumables.delete":"1"}', + ]; + }); + } -// USER LICENSE PERMISSION STATES -$factory->state(App\Models\User::class, 'view-licenses', function ($faker) { - return [ - 'permissions' => '{"licenses.view":"1"}', - ]; -}); + public function checkinConsumables() + { + return $this->state(function () { + return [ + 'permissions' => '{"consumables.checkin":"1"}', + ]; + }); + } -$factory->state(App\Models\User::class, 'create-licenses', function ($faker) { - return [ - 'permissions' => '{"licenses.create":"1"}', - ]; -}); + public function checkoutConsumables() + { + return $this->state(function () { + return [ + 'permissions' => '{"consumables.checkout":"1"}', + ]; + }); + } -$factory->state(App\Models\User::class, 'edit-licenses', function ($faker) { - return [ - 'permissions' => '{"licenses.edit":"1"}', - ]; -}); + public function viewLicenses() + { + return $this->state(function () { + return [ + 'permissions' => '{"licenses.view":"1"}', + ]; + }); + } -$factory->state(App\Models\User::class, 'delete-licenses', function ($faker) { - return [ - 'permissions' => '{"licenses.delete":"1"}', - ]; -}); + public function createLicenses() + { + return $this->state(function () { + return [ + 'permissions' => '{"licenses.create":"1"}', + ]; + }); + } -$factory->state(App\Models\User::class, 'checkout-licenses', function ($faker) { - return [ - 'permissions' => '{"licenses.checkout":"1"}', - ]; -}); + public function editLicenses() + { + return $this->state(function () { + return [ + 'permissions' => '{"licenses.edit":"1"}', + ]; + }); + } -$factory->state(App\Models\User::class, 'view-keys-licenses', function ($faker) { - return [ - 'permissions' => '{"licenses.keys":"1"}', - ]; -}); + public function deleteLicenses() + { + return $this->state(function () { + return [ + 'permissions' => '{"licenses.delete":"1"}', + ]; + }); + } -// USER COMPONENTS PERMISSION STATES -$factory->state(App\Models\User::class, 'view-components', function ($faker) { - return [ - 'permissions' => '{"components.view":"1"}', - ]; -}); + public function checkoutLicenses() + { + return $this->state(function () { + return [ + 'permissions' => '{"licenses.checkout":"1"}', + ]; + }); + } -$factory->state(App\Models\User::class, 'create-components', function ($faker) { - return [ - 'permissions' => '{"components.create":"1"}', - ]; -}); + public function viewKeysLicenses() + { + return $this->state(function () { + return [ + 'permissions' => '{"licenses.keys":"1"}', + ]; + }); + } -$factory->state(App\Models\User::class, 'edit-components', function ($faker) { - return [ - 'permissions' => '{"components.edit":"1"}', - ]; -}); + public function viewComponents() + { + return $this->state(function () { + return [ + 'permissions' => '{"components.view":"1"}', + ]; + }); + } -$factory->state(App\Models\User::class, 'delete-components', function ($faker) { - return [ - 'permissions' => '{"components.delete":"1"}', - ]; -}); + public function createComponents() + { + return $this->state(function () { + return [ + 'permissions' => '{"components.create":"1"}', + ]; + }); + } -$factory->state(App\Models\User::class, 'checkin-components', function ($faker) { - return [ - 'permissions' => '{"components.checkin":"1"}', - ]; -}); + public function editComponents() + { + return $this->state(function () { + return [ + 'permissions' => '{"components.edit":"1"}', + ]; + }); + } -$factory->state(App\Models\User::class, 'checkout-components', function ($faker) { - return [ - 'permissions' => '{"components.checkout":"1"}', - ]; -}); + public function deleteComponents() + { + return $this->state(function () { + return [ + 'permissions' => '{"components.delete":"1"}', + ]; + }); + } -// USER USER PERMISSION STATES -$factory->state(App\Models\User::class, 'view-users', function ($faker) { - return [ - 'permissions' => '{"users.view":"1"}', - ]; -}); + public function checkinComponents() + { + return $this->state(function () { + return [ + 'permissions' => '{"components.checkin":"1"}', + ]; + }); + } -$factory->state(App\Models\User::class, 'create-users', function ($faker) { - return [ - 'permissions' => '{"users.create":"1"}', - ]; -}); + public function checkoutComponents() + { + return $this->state(function () { + return [ + 'permissions' => '{"components.checkout":"1"}', + ]; + }); + } -$factory->state(App\Models\User::class, 'edit-users', function ($faker) { - return [ - 'permissions' => '{"users.edit":"1"}', - ]; -}); + public function viewUsers() + { + return $this->state(function () { + return [ + 'permissions' => '{"users.view":"1"}', + ]; + }); + } -$factory->state(App\Models\User::class, 'delete-users', function ($faker) { - return [ - 'permissions' => '{"users.delete":"1"}', - ]; -}); + public function createUsers() + { + return $this->state(function () { + return [ + 'permissions' => '{"users.create":"1"}', + ]; + }); + } + + public function editUsers() + { + return $this->state(function () { + return [ + 'permissions' => '{"users.edit":"1"}', + ]; + }); + } + + public function deleteUsers() + { + return $this->state(function () { + return [ + 'permissions' => '{"users.delete":"1"}', + ]; + }); + } +} diff --git a/database/migrations/2012_12_06_225921_migration_cartalyst_sentry_install_users.php b/database/migrations/2012_12_06_225921_migration_cartalyst_sentry_install_users.php index bee5d9370c..c4518f7926 100644 --- a/database/migrations/2012_12_06_225921_migration_cartalyst_sentry_install_users.php +++ b/database/migrations/2012_12_06_225921_migration_cartalyst_sentry_install_users.php @@ -10,7 +10,6 @@ * bundled with this package in the LICENSE file. It is also available at * the following URL: http://www.opensource.org/licenses/BSD-3-Clause * - * @package Sentry * @version 2.0.0 * @author Cartalyst LLC * @license BSD License (3-clause) @@ -20,48 +19,46 @@ use Illuminate\Database\Migrations\Migration; -class MigrationCartalystSentryInstallUsers extends Migration { +class MigrationCartalystSentryInstallUsers extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::create('users', function ($table) { + $table->increments('id'); + $table->string('email'); + $table->string('password'); + $table->text('permissions')->nullable(); + $table->boolean('activated')->default(0); + $table->string('activation_code')->nullable(); + $table->timestamp('activated_at')->nullable(); + $table->timestamp('last_login')->nullable(); + $table->string('persist_code')->nullable(); + $table->string('reset_password_code')->nullable(); + $table->string('first_name')->nullable(); + $table->string('last_name')->nullable(); + $table->timestamps(); - /** - * Run the migrations. - * - * @return void - */ - public function up() - { - Schema::create('users', function($table) - { - $table->increments('id'); - $table->string('email'); - $table->string('password'); - $table->text('permissions')->nullable(); - $table->boolean('activated')->default(0); - $table->string('activation_code')->nullable(); - $table->timestamp('activated_at')->nullable(); - $table->timestamp('last_login')->nullable(); - $table->string('persist_code')->nullable(); - $table->string('reset_password_code')->nullable(); - $table->string('first_name')->nullable(); - $table->string('last_name')->nullable(); - $table->timestamps(); - - // We'll need to ensure that MySQL uses the InnoDB engine to - // support the indexes, other engines aren't affected. - $table->engine = 'InnoDB'; - $table->unique('email'); - $table->index('activation_code'); - $table->index('reset_password_code'); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::drop('users'); - } + // We'll need to ensure that MySQL uses the InnoDB engine to + // support the indexes, other engines aren't affected. + $table->engine = 'InnoDB'; + $table->unique('email'); + $table->index('activation_code'); + $table->index('reset_password_code'); + }); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('users'); + } } diff --git a/database/migrations/2012_12_06_225929_migration_cartalyst_sentry_install_groups.php b/database/migrations/2012_12_06_225929_migration_cartalyst_sentry_install_groups.php index d929a62707..cd45847bc7 100644 --- a/database/migrations/2012_12_06_225929_migration_cartalyst_sentry_install_groups.php +++ b/database/migrations/2012_12_06_225929_migration_cartalyst_sentry_install_groups.php @@ -10,7 +10,6 @@ * bundled with this package in the LICENSE file. It is also available at * the following URL: http://www.opensource.org/licenses/BSD-3-Clause * - * @package Sentry * @version 2.0.0 * @author Cartalyst LLC * @license BSD License (3-clause) @@ -20,33 +19,31 @@ use Illuminate\Database\Migrations\Migration; -class MigrationCartalystSentryInstallGroups extends Migration { - - /** - * Run the migrations. - * - * @return void - */ - public function up() - { - Schema::create('permission_groups', function($table) - { - $table->increments('id'); - $table->string('name'); - $table->text('permissions')->nullable(); - $table->timestamps(); - $table->engine = 'InnoDB'; - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::drop('permission_groups'); - } +class MigrationCartalystSentryInstallGroups extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::create('permission_groups', function ($table) { + $table->increments('id'); + $table->string('name'); + $table->text('permissions')->nullable(); + $table->timestamps(); + $table->engine = 'InnoDB'; + }); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('permission_groups'); + } } diff --git a/database/migrations/2012_12_06_225945_migration_cartalyst_sentry_install_users_groups_pivot.php b/database/migrations/2012_12_06_225945_migration_cartalyst_sentry_install_users_groups_pivot.php index 012873c6c0..d5ecbe35dd 100644 --- a/database/migrations/2012_12_06_225945_migration_cartalyst_sentry_install_users_groups_pivot.php +++ b/database/migrations/2012_12_06_225945_migration_cartalyst_sentry_install_users_groups_pivot.php @@ -10,7 +10,6 @@ * bundled with this package in the LICENSE file. It is also available at * the following URL: http://www.opensource.org/licenses/BSD-3-Clause * - * @package Sentry * @version 2.0.0 * @author Cartalyst LLC * @license BSD License (3-clause) @@ -20,35 +19,33 @@ use Illuminate\Database\Migrations\Migration; -class MigrationCartalystSentryInstallUsersGroupsPivot extends Migration { +class MigrationCartalystSentryInstallUsersGroupsPivot extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::create('users_groups', function ($table) { + $table->integer('user_id')->unsigned(); + $table->integer('group_id')->unsigned(); - /** - * Run the migrations. - * - * @return void - */ - public function up() - { - Schema::create('users_groups', function($table) - { - $table->integer('user_id')->unsigned(); - $table->integer('group_id')->unsigned(); - - // We'll need to ensure that MySQL uses the InnoDB engine to - // support the indexes, other engines aren't affected. - $table->engine = 'InnoDB'; - $table->primary(array('user_id', 'group_id')); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::drop('users_groups'); - } + // We'll need to ensure that MySQL uses the InnoDB engine to + // support the indexes, other engines aren't affected. + $table->engine = 'InnoDB'; + $table->primary(['user_id', 'group_id']); + }); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('users_groups'); + } } diff --git a/database/migrations/2012_12_06_225988_migration_cartalyst_sentry_install_throttle.php b/database/migrations/2012_12_06_225988_migration_cartalyst_sentry_install_throttle.php index 07c1d27a68..641e3187b5 100644 --- a/database/migrations/2012_12_06_225988_migration_cartalyst_sentry_install_throttle.php +++ b/database/migrations/2012_12_06_225988_migration_cartalyst_sentry_install_throttle.php @@ -10,7 +10,6 @@ * bundled with this package in the LICENSE file. It is also available at * the following URL: http://www.opensource.org/licenses/BSD-3-Clause * - * @package Sentry * @version 2.0.0 * @author Cartalyst LLC * @license BSD License (3-clause) @@ -20,42 +19,40 @@ use Illuminate\Database\Migrations\Migration; -class MigrationCartalystSentryInstallThrottle extends Migration { +class MigrationCartalystSentryInstallThrottle extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::create('throttle', function ($table) { + $table->increments('id'); + $table->integer('user_id')->unsigned()->nullable(); + $table->string('ip_address')->nullable(); + $table->integer('attempts')->default(0); + $table->boolean('suspended')->default(0); + $table->boolean('banned')->default(0); + $table->timestamp('last_attempt_at')->nullable(); + $table->timestamp('suspended_at')->nullable(); + $table->timestamp('banned_at')->nullable(); - /** - * Run the migrations. - * - * @return void - */ - public function up() - { - Schema::create('throttle', function($table) - { - $table->increments('id'); - $table->integer('user_id')->unsigned()->nullable(); - $table->string('ip_address')->nullable(); - $table->integer('attempts')->default(0); - $table->boolean('suspended')->default(0); - $table->boolean('banned')->default(0); - $table->timestamp('last_attempt_at')->nullable(); - $table->timestamp('suspended_at')->nullable(); - $table->timestamp('banned_at')->nullable(); - - // We'll need to ensure that MySQL uses the InnoDB engine to - // support the indexes, other engines aren't affected. - $table->engine = 'InnoDB'; - $table->index('user_id'); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::drop('throttle'); - } + // We'll need to ensure that MySQL uses the InnoDB engine to + // support the indexes, other engines aren't affected. + $table->engine = 'InnoDB'; + $table->index('user_id'); + }); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('throttle'); + } } diff --git a/database/migrations/2013_03_23_193214_update_users_table.php b/database/migrations/2013_03_23_193214_update_users_table.php index eed98d12ee..9c95a0c858 100755 --- a/database/migrations/2013_03_23_193214_update_users_table.php +++ b/database/migrations/2013_03_23_193214_update_users_table.php @@ -32,5 +32,4 @@ class UpdateUsersTable extends Migration $table->dropColumn('deleted_at', 'website', 'country', 'gravatar'); }); } - } diff --git a/database/migrations/2013_11_13_075318_create_models_table.php b/database/migrations/2013_11_13_075318_create_models_table.php index 393cbcf9a1..cd2d9dfc70 100755 --- a/database/migrations/2013_11_13_075318_create_models_table.php +++ b/database/migrations/2013_11_13_075318_create_models_table.php @@ -11,7 +11,7 @@ class CreateModelsTable extends Migration */ public function up() { - Schema::create('models', function ($table) { + Schema::create('models', function ($table) { $table->increments('id'); $table->string('name'); $table->string('modelno')->nullable(); @@ -31,5 +31,4 @@ class CreateModelsTable extends Migration { Schema::drop('models'); } - } diff --git a/database/migrations/2013_11_13_075335_create_categories_table.php b/database/migrations/2013_11_13_075335_create_categories_table.php index bb64d87cb0..280c2f48a8 100755 --- a/database/migrations/2013_11_13_075335_create_categories_table.php +++ b/database/migrations/2013_11_13_075335_create_categories_table.php @@ -4,7 +4,7 @@ use Illuminate\Database\Migrations\Migration; class CreateCategoriesTable extends Migration { -/** + /** * Run the migrations. * * @return void @@ -29,5 +29,4 @@ class CreateCategoriesTable extends Migration { Schema::drop('categories'); } - } diff --git a/database/migrations/2013_11_13_075347_create_manufacturers_table.php b/database/migrations/2013_11_13_075347_create_manufacturers_table.php index 3f2426ea6d..827ee7da7c 100755 --- a/database/migrations/2013_11_13_075347_create_manufacturers_table.php +++ b/database/migrations/2013_11_13_075347_create_manufacturers_table.php @@ -28,5 +28,4 @@ class CreateManufacturersTable extends Migration { Schema::drop('manufacturers'); } - } diff --git a/database/migrations/2013_11_15_015858_add_user_id_to_categories.php b/database/migrations/2013_11_15_015858_add_user_id_to_categories.php index a4744877ba..935362ab52 100755 --- a/database/migrations/2013_11_15_015858_add_user_id_to_categories.php +++ b/database/migrations/2013_11_15_015858_add_user_id_to_categories.php @@ -25,5 +25,4 @@ class AddUserIdToCategories extends Migration { // } - } diff --git a/database/migrations/2013_11_15_112701_add_user_id_to_manufacturers.php b/database/migrations/2013_11_15_112701_add_user_id_to_manufacturers.php index a21ad59277..fee43b0ba8 100755 --- a/database/migrations/2013_11_15_112701_add_user_id_to_manufacturers.php +++ b/database/migrations/2013_11_15_112701_add_user_id_to_manufacturers.php @@ -25,5 +25,4 @@ class AddUserIdToManufacturers extends Migration { // } - } diff --git a/database/migrations/2013_11_15_190327_create_assets_table.php b/database/migrations/2013_11_15_190327_create_assets_table.php index 12f906fa27..a66a933025 100755 --- a/database/migrations/2013_11_15_190327_create_assets_table.php +++ b/database/migrations/2013_11_15_190327_create_assets_table.php @@ -38,5 +38,4 @@ class CreateAssetsTable extends Migration { Schema::drop('assets'); } - } diff --git a/database/migrations/2013_11_15_190357_create_licenses_table.php b/database/migrations/2013_11_15_190357_create_licenses_table.php deleted file mode 100755 index d6e01cac39..0000000000 --- a/database/migrations/2013_11_15_190357_create_licenses_table.php +++ /dev/null @@ -1,42 +0,0 @@ -increments('id'); - $table->string('name'); - $table->integer('model_id'); - $table->text('serial'); - $table->string('license_email'); - $table->string('license_name'); - $table->date('purchase_date')->nullable(); - $table->decimal('purchase_cost', 8, 2)->nullable(); - $table->string('order_number'); - $table->integer('assigned_to'); - $table->text('notes'); - $table->integer('user_id')->nullable(); - $table->timestamps(); - $table->engine = 'InnoDB'; - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::dropIfExists('licenses'); - } - -} diff --git a/database/migrations/2013_11_15_190357_create_temp_licenses_table.php b/database/migrations/2013_11_15_190357_create_temp_licenses_table.php new file mode 100755 index 0000000000..afb6d05402 --- /dev/null +++ b/database/migrations/2013_11_15_190357_create_temp_licenses_table.php @@ -0,0 +1,46 @@ +increments('id'); + $table->string('name'); + $table->integer('model_id'); + $table->text('serial'); + $table->string('license_email'); + $table->string('license_name'); + $table->date('purchase_date')->nullable(); + $table->decimal('purchase_cost', 8, 2)->nullable(); + $table->string('order_number'); + $table->integer('assigned_to'); + $table->text('notes'); + $table->integer('user_id')->nullable(); + $table->timestamps(); + $table->engine = 'InnoDB'; + }); + } + + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('licenses'); + } +} diff --git a/database/migrations/2013_11_15_201848_add_license_name_to_licenses.php b/database/migrations/2013_11_15_201848_add_license_name_to_licenses.php index 50b0a1ff05..f9094c4f02 100755 --- a/database/migrations/2013_11_15_201848_add_license_name_to_licenses.php +++ b/database/migrations/2013_11_15_201848_add_license_name_to_licenses.php @@ -11,7 +11,6 @@ class AddLicenseNameToLicenses extends Migration */ public function up() { - } /** @@ -23,5 +22,4 @@ class AddLicenseNameToLicenses extends Migration { // } - } diff --git a/database/migrations/2013_11_16_040323_create_depreciations_table.php b/database/migrations/2013_11_16_040323_create_depreciations_table.php index 620b5299a4..b35a04fee3 100755 --- a/database/migrations/2013_11_16_040323_create_depreciations_table.php +++ b/database/migrations/2013_11_16_040323_create_depreciations_table.php @@ -31,5 +31,4 @@ class CreateDepreciationsTable extends Migration { Schema::drop('depreciations'); } - } diff --git a/database/migrations/2013_11_16_042851_add_depreciation_id_to_models.php b/database/migrations/2013_11_16_042851_add_depreciation_id_to_models.php index a9e9dbd496..0e5e0db18a 100755 --- a/database/migrations/2013_11_16_042851_add_depreciation_id_to_models.php +++ b/database/migrations/2013_11_16_042851_add_depreciation_id_to_models.php @@ -25,5 +25,4 @@ class AddDepreciationIdToModels extends Migration { // } - } diff --git a/database/migrations/2013_11_16_084923_add_user_id_to_models.php b/database/migrations/2013_11_16_084923_add_user_id_to_models.php index b14f40be2e..070a5feb9f 100755 --- a/database/migrations/2013_11_16_084923_add_user_id_to_models.php +++ b/database/migrations/2013_11_16_084923_add_user_id_to_models.php @@ -25,5 +25,4 @@ class AddUserIdToModels extends Migration { // } - } diff --git a/database/migrations/2013_11_16_103258_create_locations_table.php b/database/migrations/2013_11_16_103258_create_locations_table.php index d87a273e35..2bbc1cce4f 100755 --- a/database/migrations/2013_11_16_103258_create_locations_table.php +++ b/database/migrations/2013_11_16_103258_create_locations_table.php @@ -15,8 +15,8 @@ class CreateLocationsTable extends Migration $table->increments('id'); $table->string('name')->nullable(); $table->string('city')->nullable(); - $table->string('state',2)->nullable(); - $table->string('country',2)->nullable(); + $table->string('state', 2)->nullable(); + $table->string('country', 2)->nullable(); $table->timestamps(); $table->integer('user_id')->nullable(); $table->engine = 'InnoDB'; @@ -32,5 +32,4 @@ class CreateLocationsTable extends Migration { Schema::drop('locations'); } - } diff --git a/database/migrations/2013_11_16_103336_add_location_id_to_assets.php b/database/migrations/2013_11_16_103336_add_location_id_to_assets.php index fbaee98b3e..11c462ec92 100755 --- a/database/migrations/2013_11_16_103336_add_location_id_to_assets.php +++ b/database/migrations/2013_11_16_103336_add_location_id_to_assets.php @@ -25,5 +25,4 @@ class AddLocationIdToAssets extends Migration { // } - } diff --git a/database/migrations/2013_11_16_103407_add_checkedout_to_to_assets.php b/database/migrations/2013_11_16_103407_add_checkedout_to_to_assets.php index 8fdb112f03..9e3594b746 100755 --- a/database/migrations/2013_11_16_103407_add_checkedout_to_to_assets.php +++ b/database/migrations/2013_11_16_103407_add_checkedout_to_to_assets.php @@ -25,5 +25,4 @@ class AddCheckedoutToToAssets extends Migration { // } - } diff --git a/database/migrations/2013_11_16_103425_create_history_table.php b/database/migrations/2013_11_16_103425_create_history_table.php index 3e5d6ba84d..d3d84f3843 100755 --- a/database/migrations/2013_11_16_103425_create_history_table.php +++ b/database/migrations/2013_11_16_103425_create_history_table.php @@ -30,5 +30,4 @@ class CreateHistoryTable extends Migration { //Schema::drop('history'); } - } diff --git a/database/migrations/2013_11_17_054359_drop_licenses_table.php b/database/migrations/2013_11_17_054359_drop_licenses_table.php index 353dcc6944..e8c3d6b078 100755 --- a/database/migrations/2013_11_17_054359_drop_licenses_table.php +++ b/database/migrations/2013_11_17_054359_drop_licenses_table.php @@ -11,7 +11,7 @@ class DropLicensesTable extends Migration */ public function up() { - Schema::drop('licenses'); + Schema::dropIfExists('licenses'); } /** @@ -23,5 +23,4 @@ class DropLicensesTable extends Migration { // } - } diff --git a/database/migrations/2013_11_17_054526_add_physical_to_assets.php b/database/migrations/2013_11_17_054526_add_physical_to_assets.php index 725d1e900b..2ccc7c43dc 100755 --- a/database/migrations/2013_11_17_054526_add_physical_to_assets.php +++ b/database/migrations/2013_11_17_054526_add_physical_to_assets.php @@ -1,6 +1,7 @@ dropColumn('physical'); } - } diff --git a/database/migrations/2013_11_17_055126_create_settings_table.php b/database/migrations/2013_11_17_055126_create_settings_table.php index 0bedd659bf..5e36add8c0 100755 --- a/database/migrations/2013_11_17_055126_create_settings_table.php +++ b/database/migrations/2013_11_17_055126_create_settings_table.php @@ -31,5 +31,4 @@ class CreateSettingsTable extends Migration { Schema::drop('settings'); } - } diff --git a/database/migrations/2013_11_17_062634_add_license_to_assets.php b/database/migrations/2013_11_17_062634_add_license_to_assets.php index 7766b34f2c..fbc81fae1e 100755 --- a/database/migrations/2013_11_17_062634_add_license_to_assets.php +++ b/database/migrations/2013_11_17_062634_add_license_to_assets.php @@ -26,5 +26,4 @@ class AddLicenseToAssets extends Migration { // } - } diff --git a/database/migrations/2013_11_18_134332_add_contacts_to_users.php b/database/migrations/2013_11_18_134332_add_contacts_to_users.php index bf6d482d37..acff0b75a5 100755 --- a/database/migrations/2013_11_18_134332_add_contacts_to_users.php +++ b/database/migrations/2013_11_18_134332_add_contacts_to_users.php @@ -15,7 +15,6 @@ class AddContactsToUsers extends Migration $table->integer('location_id')->nullable(); $table->string('phone')->nullable(); $table->string('jobtitle')->nullable(); - }); } @@ -30,9 +29,6 @@ class AddContactsToUsers extends Migration $table->dropColumn('location_id'); $table->dropColumn('phone'); $table->dropColumn('jobtitle'); - }); - } - } diff --git a/database/migrations/2013_11_18_142847_add_info_to_locations.php b/database/migrations/2013_11_18_142847_add_info_to_locations.php index 07f85b6116..9cd240a0bf 100755 --- a/database/migrations/2013_11_18_142847_add_info_to_locations.php +++ b/database/migrations/2013_11_18_142847_add_info_to_locations.php @@ -12,11 +12,9 @@ class AddInfoToLocations extends Migration public function up() { Schema::table('locations', function ($table) { - $table->string('address', 80)->nullable(); $table->string('address2', 80)->nullable(); $table->string('zip', 10)->nullable(); - }); } @@ -28,12 +26,9 @@ class AddInfoToLocations extends Migration public function down() { Schema::table('locations', function ($table) { - $table->dropColumn('address'); $table->dropColumn('address2'); $table->dropColumn('zip'); - }); } - } diff --git a/database/migrations/2013_11_18_152942_remove_location_id_from_asset.php b/database/migrations/2013_11_18_152942_remove_location_id_from_asset.php index 07ef525fe4..f7450cdb59 100755 --- a/database/migrations/2013_11_18_152942_remove_location_id_from_asset.php +++ b/database/migrations/2013_11_18_152942_remove_location_id_from_asset.php @@ -27,5 +27,4 @@ class RemoveLocationIdFromAsset extends Migration $table->integer('location_id')->nullable(); }); } - } diff --git a/database/migrations/2013_11_18_164423_set_nullvalues_for_user.php b/database/migrations/2013_11_18_164423_set_nullvalues_for_user.php index 6665934587..6f52b47ee4 100755 --- a/database/migrations/2013_11_18_164423_set_nullvalues_for_user.php +++ b/database/migrations/2013_11_18_164423_set_nullvalues_for_user.php @@ -9,14 +9,12 @@ class SetNullvaluesForUser extends Migration * * @return void */ - public function up() { // - // $prefix = DB::getTablePrefix(); + // $prefix = DB::getTablePrefix(); // DB::statement('ALTER TABLE '.$prefix.'users MODIFY phone varchar(20) null'); // DB::statement('ALTER TABLE '.$prefix.'users MODIFY jobtitle varchar(50) null'); - } /** @@ -28,5 +26,4 @@ class SetNullvaluesForUser extends Migration { // } - } diff --git a/database/migrations/2013_11_19_013337_create_asset_logs_table.php b/database/migrations/2013_11_19_013337_create_asset_logs_table.php index 3bdf3f9bae..51aebacbd4 100755 --- a/database/migrations/2013_11_19_013337_create_asset_logs_table.php +++ b/database/migrations/2013_11_19_013337_create_asset_logs_table.php @@ -32,5 +32,4 @@ class CreateAssetLogsTable extends Migration { Schema::drop('asset_logs'); } - } diff --git a/database/migrations/2013_11_19_061409_edit_added_on_asset_logs_table.php b/database/migrations/2013_11_19_061409_edit_added_on_asset_logs_table.php index b1c8a848b3..57ce195e93 100755 --- a/database/migrations/2013_11_19_061409_edit_added_on_asset_logs_table.php +++ b/database/migrations/2013_11_19_061409_edit_added_on_asset_logs_table.php @@ -12,7 +12,6 @@ class EditAddedOnAssetLogsTable extends Migration public function up() { // DB::statement('ALTER TABLE ' . DB::getTablePrefix() . 'asset_logs MODIFY added_on timestamp null'); - } /** @@ -24,5 +23,4 @@ class EditAddedOnAssetLogsTable extends Migration { // } - } diff --git a/database/migrations/2013_11_19_062250_edit_location_id_asset_logs_table.php b/database/migrations/2013_11_19_062250_edit_location_id_asset_logs_table.php index 02d1118eea..9ea493b34e 100755 --- a/database/migrations/2013_11_19_062250_edit_location_id_asset_logs_table.php +++ b/database/migrations/2013_11_19_062250_edit_location_id_asset_logs_table.php @@ -16,8 +16,6 @@ class EditLocationIdAssetLogsTable extends Migration // $table->string('location_id')->nullable()->change(); // $table->dateTime('added_on',11)->nullable()->default(DB::raw('CURRENT_TIMESTAMP(0)'))->change(); // }); - - } /** @@ -29,5 +27,4 @@ class EditLocationIdAssetLogsTable extends Migration { // } - } diff --git a/database/migrations/2013_11_20_055822_add_soft_delete_on_assets.php b/database/migrations/2013_11_20_055822_add_soft_delete_on_assets.php index c729376383..2405878d5f 100755 --- a/database/migrations/2013_11_20_055822_add_soft_delete_on_assets.php +++ b/database/migrations/2013_11_20_055822_add_soft_delete_on_assets.php @@ -25,5 +25,4 @@ class AddSoftDeleteOnAssets extends Migration { // } - } diff --git a/database/migrations/2013_11_20_121404_add_soft_delete_on_locations.php b/database/migrations/2013_11_20_121404_add_soft_delete_on_locations.php index afdc9e2aa2..33a3577a9f 100755 --- a/database/migrations/2013_11_20_121404_add_soft_delete_on_locations.php +++ b/database/migrations/2013_11_20_121404_add_soft_delete_on_locations.php @@ -25,5 +25,4 @@ class AddSoftDeleteOnLocations extends Migration { // } - } diff --git a/database/migrations/2013_11_20_123137_add_soft_delete_on_manufacturers.php b/database/migrations/2013_11_20_123137_add_soft_delete_on_manufacturers.php index 04cb01d15d..0ba42701fa 100755 --- a/database/migrations/2013_11_20_123137_add_soft_delete_on_manufacturers.php +++ b/database/migrations/2013_11_20_123137_add_soft_delete_on_manufacturers.php @@ -25,5 +25,4 @@ class AddSoftDeleteOnManufacturers extends Migration { // } - } diff --git a/database/migrations/2013_11_20_123725_add_soft_delete_on_categories.php b/database/migrations/2013_11_20_123725_add_soft_delete_on_categories.php index a17045bf79..8da8d8dccb 100755 --- a/database/migrations/2013_11_20_123725_add_soft_delete_on_categories.php +++ b/database/migrations/2013_11_20_123725_add_soft_delete_on_categories.php @@ -25,5 +25,4 @@ class AddSoftDeleteOnCategories extends Migration { // } - } diff --git a/database/migrations/2013_11_20_130248_create_status_labels.php b/database/migrations/2013_11_20_130248_create_status_labels.php index 7bdfb8a6f6..5b7634682f 100755 --- a/database/migrations/2013_11_20_130248_create_status_labels.php +++ b/database/migrations/2013_11_20_130248_create_status_labels.php @@ -13,7 +13,7 @@ class CreateStatusLabels extends Migration { Schema::create('status_labels', function ($table) { $table->increments('id'); - $table->string('name',100)->nullable(); + $table->string('name', 100)->nullable(); $table->integer('user_id')->nullable(); $table->timestamps(); $table->softDeletes(); @@ -30,5 +30,4 @@ class CreateStatusLabels extends Migration { Schema::drop('status_labels'); } - } diff --git a/database/migrations/2013_11_20_130830_add_status_id_on_assets_table.php b/database/migrations/2013_11_20_130830_add_status_id_on_assets_table.php index 01b24c5a04..ac561efa71 100755 --- a/database/migrations/2013_11_20_130830_add_status_id_on_assets_table.php +++ b/database/migrations/2013_11_20_130830_add_status_id_on_assets_table.php @@ -27,5 +27,4 @@ class AddStatusIdOnAssetsTable extends Migration $table->dropColumn('status_id'); }); } - } diff --git a/database/migrations/2013_11_20_131544_add_status_type_on_status_labels.php b/database/migrations/2013_11_20_131544_add_status_type_on_status_labels.php index 2a8cfcd229..70ad31f9c4 100755 --- a/database/migrations/2013_11_20_131544_add_status_type_on_status_labels.php +++ b/database/migrations/2013_11_20_131544_add_status_type_on_status_labels.php @@ -27,5 +27,4 @@ class AddStatusTypeOnStatusLabels extends Migration $table->dropColumn('deployable'); }); } - } diff --git a/database/migrations/2013_11_20_134103_add_archived_to_assets.php b/database/migrations/2013_11_20_134103_add_archived_to_assets.php index 4623f67d7e..dd00382ac9 100755 --- a/database/migrations/2013_11_20_134103_add_archived_to_assets.php +++ b/database/migrations/2013_11_20_134103_add_archived_to_assets.php @@ -27,5 +27,4 @@ class AddArchivedToAssets extends Migration $table->dropColumn('archived'); }); } - } diff --git a/database/migrations/2013_11_21_002321_add_uploads_table.php b/database/migrations/2013_11_21_002321_add_uploads_table.php index d54d5e5d76..233416e2bc 100755 --- a/database/migrations/2013_11_21_002321_add_uploads_table.php +++ b/database/migrations/2013_11_21_002321_add_uploads_table.php @@ -32,5 +32,4 @@ class AddUploadsTable extends Migration { Schema::drop('asset_uploads'); } - } diff --git a/database/migrations/2013_11_21_024531_remove_deployable_boolean_from_status_labels.php b/database/migrations/2013_11_21_024531_remove_deployable_boolean_from_status_labels.php index 574c7bd8ec..3db9e2f1d3 100755 --- a/database/migrations/2013_11_21_024531_remove_deployable_boolean_from_status_labels.php +++ b/database/migrations/2013_11_21_024531_remove_deployable_boolean_from_status_labels.php @@ -27,5 +27,4 @@ class RemoveDeployableBooleanFromStatusLabels extends Migration $table->boolean('deployable'); }); } - } diff --git a/database/migrations/2013_11_22_075308_add_option_label_to_settings_table.php b/database/migrations/2013_11_22_075308_add_option_label_to_settings_table.php index 9e007850d0..803edfe1ee 100755 --- a/database/migrations/2013_11_22_075308_add_option_label_to_settings_table.php +++ b/database/migrations/2013_11_22_075308_add_option_label_to_settings_table.php @@ -27,5 +27,4 @@ class AddOptionLabelToSettingsTable extends Migration // $table->dropColumn('option_label'); // }); } - } diff --git a/database/migrations/2013_11_22_213400_edits_to_settings_table.php b/database/migrations/2013_11_22_213400_edits_to_settings_table.php index e689e5cd0a..942c82d3df 100755 --- a/database/migrations/2013_11_22_213400_edits_to_settings_table.php +++ b/database/migrations/2013_11_22_213400_edits_to_settings_table.php @@ -16,10 +16,8 @@ class EditsToSettingsTable extends Migration //$table->dropColumn('option_name'); // $table->dropColumn('option_value'); $table->integer('per_page')->default(20); - $table->string('site_name','100')->default("Snipe IT Asset Management"); + $table->string('site_name', '100')->default('Snipe IT Asset Management'); }); - - } /** @@ -31,5 +29,4 @@ class EditsToSettingsTable extends Migration { // } - } diff --git a/database/migrations/2013_11_25_013244_create_licenses_table.php b/database/migrations/2013_11_25_013244_recreate_licenses_table.php similarity index 99% rename from database/migrations/2013_11_25_013244_create_licenses_table.php rename to database/migrations/2013_11_25_013244_recreate_licenses_table.php index 38c2f6f68e..404a37228b 100755 --- a/database/migrations/2013_11_25_013244_create_licenses_table.php +++ b/database/migrations/2013_11_25_013244_recreate_licenses_table.php @@ -39,5 +39,4 @@ class ReCreateLicensesTable extends Migration // Schema::drop('licenses'); } - } diff --git a/database/migrations/2013_11_25_031458_create_license_seats_table.php b/database/migrations/2013_11_25_031458_create_license_seats_table.php index acd101e3f8..466ef00870 100755 --- a/database/migrations/2013_11_25_031458_create_license_seats_table.php +++ b/database/migrations/2013_11_25_031458_create_license_seats_table.php @@ -33,5 +33,4 @@ class CreateLicenseSeatsTable extends Migration { // } - } diff --git a/database/migrations/2013_11_25_032022_add_type_to_actionlog_table.php b/database/migrations/2013_11_25_032022_add_type_to_actionlog_table.php index 4edfc94091..73fd422355 100755 --- a/database/migrations/2013_11_25_032022_add_type_to_actionlog_table.php +++ b/database/migrations/2013_11_25_032022_add_type_to_actionlog_table.php @@ -29,5 +29,4 @@ class AddTypeToActionlogTable extends Migration $table->dropColumn('asset_type'); }); } - } diff --git a/database/migrations/2013_11_25_033008_delete_bad_licenses_table.php b/database/migrations/2013_11_25_033008_delete_bad_licenses_table.php index 755b647228..91179fb7be 100755 --- a/database/migrations/2013_11_25_033008_delete_bad_licenses_table.php +++ b/database/migrations/2013_11_25_033008_delete_bad_licenses_table.php @@ -23,5 +23,4 @@ class DeleteBadLicensesTable extends Migration { // } - } diff --git a/database/migrations/2013_11_25_033131_create_new_licenses_table.php b/database/migrations/2013_11_25_033131_create_new_licenses_table.php index c852e0dc00..c56d0da77d 100755 --- a/database/migrations/2013_11_25_033131_create_new_licenses_table.php +++ b/database/migrations/2013_11_25_033131_create_new_licenses_table.php @@ -39,5 +39,4 @@ class CreateNewLicensesTable extends Migration // Schema::drop('licenses'); } - } diff --git a/database/migrations/2013_11_25_033534_add_licensed_to_licenses_table.php b/database/migrations/2013_11_25_033534_add_licensed_to_licenses_table.php index d51d88bceb..74297099ca 100755 --- a/database/migrations/2013_11_25_033534_add_licensed_to_licenses_table.php +++ b/database/migrations/2013_11_25_033534_add_licensed_to_licenses_table.php @@ -31,5 +31,4 @@ class AddLicensedToLicensesTable extends Migration $table->dropColumn('license_email'); }); } - } diff --git a/database/migrations/2013_11_25_101308_add_warrantee_to_assets_table.php b/database/migrations/2013_11_25_101308_add_warrantee_to_assets_table.php index e912aacf86..bbce108de2 100755 --- a/database/migrations/2013_11_25_101308_add_warrantee_to_assets_table.php +++ b/database/migrations/2013_11_25_101308_add_warrantee_to_assets_table.php @@ -29,5 +29,4 @@ class AddWarranteeToAssetsTable extends Migration $table->dropColumn('warrantee_months'); }); } - } diff --git a/database/migrations/2013_11_25_104343_alter_warranty_column_on_assets.php b/database/migrations/2013_11_25_104343_alter_warranty_column_on_assets.php index e0d994f5e5..be62374dce 100755 --- a/database/migrations/2013_11_25_104343_alter_warranty_column_on_assets.php +++ b/database/migrations/2013_11_25_104343_alter_warranty_column_on_assets.php @@ -12,7 +12,7 @@ class AlterWarrantyColumnOnAssets extends Migration public function up() { Schema::table('assets', function ($table) { - $table->renameColumn('warrantee_months', 'warranty_months'); + $table->renameColumn('warrantee_months', 'warranty_months'); }); } @@ -25,5 +25,4 @@ class AlterWarrantyColumnOnAssets extends Migration { // } - } diff --git a/database/migrations/2013_11_25_150450_drop_parent_from_categories.php b/database/migrations/2013_11_25_150450_drop_parent_from_categories.php index ba1949941a..665bc781f9 100755 --- a/database/migrations/2013_11_25_150450_drop_parent_from_categories.php +++ b/database/migrations/2013_11_25_150450_drop_parent_from_categories.php @@ -25,5 +25,4 @@ class DropParentFromCategories extends Migration { // } - } diff --git a/database/migrations/2013_11_25_151920_add_depreciate_to_assets.php b/database/migrations/2013_11_25_151920_add_depreciate_to_assets.php index 13e009bfd4..233392fe6e 100755 --- a/database/migrations/2013_11_25_151920_add_depreciate_to_assets.php +++ b/database/migrations/2013_11_25_151920_add_depreciate_to_assets.php @@ -14,7 +14,6 @@ class AddDepreciateToAssets extends Migration // Schema::table('assets', function ($table) { $table->boolean('depreciate')->nullable(); - }); } @@ -28,9 +27,5 @@ class AddDepreciateToAssets extends Migration Schema::table('assets', function ($table) { $table->dropColumn('depreciate'); }); - - - } - } diff --git a/database/migrations/2013_11_25_152903_add_depreciate_to_licenses_table.php b/database/migrations/2013_11_25_152903_add_depreciate_to_licenses_table.php index 1a2fbc05a0..bbe23a482f 100755 --- a/database/migrations/2013_11_25_152903_add_depreciate_to_licenses_table.php +++ b/database/migrations/2013_11_25_152903_add_depreciate_to_licenses_table.php @@ -27,9 +27,5 @@ class AddDepreciateToLicensesTable extends Migration Schema::table('licenses', function ($table) { $table->dropColumn('depreciate'); }); - - - } - } diff --git a/database/migrations/2013_11_26_211820_drop_license_from_assets_table.php b/database/migrations/2013_11_26_211820_drop_license_from_assets_table.php index 611cf4b123..5640c24261 100755 --- a/database/migrations/2013_11_26_211820_drop_license_from_assets_table.php +++ b/database/migrations/2013_11_26_211820_drop_license_from_assets_table.php @@ -26,5 +26,4 @@ class DropLicenseFromAssetsTable extends Migration { // } - } diff --git a/database/migrations/2013_11_27_062510_add_note_to_asset_logs_table.php b/database/migrations/2013_11_27_062510_add_note_to_asset_logs_table.php index de0d70a00f..90fa457183 100755 --- a/database/migrations/2013_11_27_062510_add_note_to_asset_logs_table.php +++ b/database/migrations/2013_11_27_062510_add_note_to_asset_logs_table.php @@ -14,7 +14,6 @@ class AddNoteToAssetLogsTable extends Migration // Schema::table('asset_logs', function ($table) { $table->text('note')->nullable(); - }); } @@ -30,5 +29,4 @@ class AddNoteToAssetLogsTable extends Migration $table->dropColumn('note'); }); } - } diff --git a/database/migrations/2013_12_01_113426_add_filename_to_asset_log.php b/database/migrations/2013_12_01_113426_add_filename_to_asset_log.php index 01b9e3130a..8a174dcb14 100755 --- a/database/migrations/2013_12_01_113426_add_filename_to_asset_log.php +++ b/database/migrations/2013_12_01_113426_add_filename_to_asset_log.php @@ -14,7 +14,6 @@ class AddFilenameToAssetLog extends Migration // Schema::table('asset_logs', function ($table) { $table->text('filename')->nullable(); - }); } @@ -30,5 +29,4 @@ class AddFilenameToAssetLog extends Migration $table->dropColumn('filename'); }); } - } diff --git a/database/migrations/2013_12_06_094618_add_nullable_to_licenses_table.php b/database/migrations/2013_12_06_094618_add_nullable_to_licenses_table.php index fed1b8e9de..24a7cfa674 100755 --- a/database/migrations/2013_12_06_094618_add_nullable_to_licenses_table.php +++ b/database/migrations/2013_12_06_094618_add_nullable_to_licenses_table.php @@ -11,13 +11,11 @@ class AddNullableToLicensesTable extends Migration */ public function up() { - Schema::table('licenses', function ($table) { - $table->string('order_number',50)->nullable()->change(); - $table->string('notes',255)->nullable()->change(); - $table->string('license_name',120)->nullable()->change(); - }); - - + Schema::table('licenses', function ($table) { + $table->string('order_number', 50)->nullable()->change(); + $table->string('notes', 255)->nullable()->change(); + $table->string('license_name', 120)->nullable()->change(); + }); } /** @@ -29,5 +27,4 @@ class AddNullableToLicensesTable extends Migration { // } - } diff --git a/database/migrations/2013_12_10_084038_add_eol_on_models_table.php b/database/migrations/2013_12_10_084038_add_eol_on_models_table.php index 5e873bebb1..d8d222deec 100755 --- a/database/migrations/2013_12_10_084038_add_eol_on_models_table.php +++ b/database/migrations/2013_12_10_084038_add_eol_on_models_table.php @@ -12,8 +12,7 @@ class AddEolOnModelsTable extends Migration public function up() { Schema::table('models', function ($table) { - $table->integer('eol')->nullable()->default(NULL); - + $table->integer('eol')->nullable()->default(null); }); } @@ -28,5 +27,4 @@ class AddEolOnModelsTable extends Migration $table->dropColumn('old'); }); } - } diff --git a/database/migrations/2013_12_12_055218_add_manager_to_users_table.php b/database/migrations/2013_12_12_055218_add_manager_to_users_table.php index 3d399c39b4..5ffbfd633f 100755 --- a/database/migrations/2013_12_12_055218_add_manager_to_users_table.php +++ b/database/migrations/2013_12_12_055218_add_manager_to_users_table.php @@ -12,8 +12,7 @@ class AddManagerToUsersTable extends Migration public function up() { Schema::table('users', function ($table) { - $table->integer('manager_id')->nullable()->default(NULL); - + $table->integer('manager_id')->nullable()->default(null); }); } @@ -28,5 +27,4 @@ class AddManagerToUsersTable extends Migration $table->dropColumn('manager_id'); }); } - } diff --git a/database/migrations/2014_01_28_031200_add_qr_code_to_settings_table.php b/database/migrations/2014_01_28_031200_add_qr_code_to_settings_table.php index 671f127eaf..37d0b48c12 100755 --- a/database/migrations/2014_01_28_031200_add_qr_code_to_settings_table.php +++ b/database/migrations/2014_01_28_031200_add_qr_code_to_settings_table.php @@ -12,8 +12,7 @@ class AddQrCodeToSettingsTable extends Migration public function up() { Schema::table('settings', function ($table) { - $table->integer('qr_code')->nullable()->default(NULL); - + $table->integer('qr_code')->nullable()->default(null); }); } @@ -28,5 +27,4 @@ class AddQrCodeToSettingsTable extends Migration $table->dropColumn('qr_code'); }); } - } diff --git a/database/migrations/2014_02_13_183016_add_qr_text_to_settings_table.php b/database/migrations/2014_02_13_183016_add_qr_text_to_settings_table.php index 48d17aed2b..b55b01ab04 100755 --- a/database/migrations/2014_02_13_183016_add_qr_text_to_settings_table.php +++ b/database/migrations/2014_02_13_183016_add_qr_text_to_settings_table.php @@ -1,7 +1,7 @@ string('qr_text', 32)->nullable()->default(NULL); + $table->string('qr_text', 32)->nullable()->default(null); }); } @@ -28,5 +28,4 @@ class AddQrTextToSettingsTable extends Migration $table->dropColumn('qr_text'); }); } - } diff --git a/database/migrations/2014_05_24_093839_alter_default_license_depreciation_id.php b/database/migrations/2014_05_24_093839_alter_default_license_depreciation_id.php index bec8ae64b3..d14195ff84 100755 --- a/database/migrations/2014_05_24_093839_alter_default_license_depreciation_id.php +++ b/database/migrations/2014_05_24_093839_alter_default_license_depreciation_id.php @@ -1,7 +1,7 @@ integer('display_asset_name')->nullable()->default(NULL); - + $table->integer('display_asset_name')->nullable()->default(null); }); } @@ -29,5 +28,4 @@ class AddAssetNameToSettings extends Migration $table->dropColumn('display_asset_name'); }); } - } diff --git a/database/migrations/2014_06_20_004847_make_asset_log_checkedout_to_nullable.php b/database/migrations/2014_06_20_004847_make_asset_log_checkedout_to_nullable.php index 75eb893998..a430c41a8c 100755 --- a/database/migrations/2014_06_20_004847_make_asset_log_checkedout_to_nullable.php +++ b/database/migrations/2014_06_20_004847_make_asset_log_checkedout_to_nullable.php @@ -1,7 +1,7 @@ increments('id'); $table->string('name'); - $table->string('address',50)->nullable()->default(NULL); - $table->string('address2',50)->nullable()->default(NULL); - $table->string('city')->nullable()->default(NULL); - $table->string('state',2)->nullable()->default(NULL); - $table->string('country',2)->nullable()->default(NULL); - $table->string('phone',20)->nullable()->default(NULL); - $table->string('fax',20)->nullable()->default(NULL); - $table->string('email',150)->nullable()->default(NULL); - $table->string('contact',100)->nullable()->default(NULL); - $table->string('notes')->nullable()->default(NULL); + $table->string('address', 50)->nullable()->default(null); + $table->string('address2', 50)->nullable()->default(null); + $table->string('city')->nullable()->default(null); + $table->string('state', 2)->nullable()->default(null); + $table->string('country', 2)->nullable()->default(null); + $table->string('phone', 20)->nullable()->default(null); + $table->string('fax', 20)->nullable()->default(null); + $table->string('email', 150)->nullable()->default(null); + $table->string('contact', 100)->nullable()->default(null); + $table->string('notes')->nullable()->default(null); $table->timestamps(); $table->integer('user_id')->nullable(); $table->softDeletes(); @@ -42,5 +42,4 @@ class AddSuppliers extends Migration // Schema::drop('suppliers'); } - } diff --git a/database/migrations/2014_06_24_010742_add_supplier_id_to_asset.php b/database/migrations/2014_06_24_010742_add_supplier_id_to_asset.php index 75c9c97e86..331e1739f2 100755 --- a/database/migrations/2014_06_24_010742_add_supplier_id_to_asset.php +++ b/database/migrations/2014_06_24_010742_add_supplier_id_to_asset.php @@ -1,7 +1,7 @@ integer('supplier_id')->nullable()->default(NULL); + $table->integer('supplier_id')->nullable()->default(null); }); } @@ -28,5 +28,4 @@ class AddSupplierIdToAsset extends Migration $table->dropColumn('supplier_id'); }); } - } diff --git a/database/migrations/2014_06_24_012839_add_zip_to_supplier.php b/database/migrations/2014_06_24_012839_add_zip_to_supplier.php index 49eff46409..5eb356257e 100755 --- a/database/migrations/2014_06_24_012839_add_zip_to_supplier.php +++ b/database/migrations/2014_06_24_012839_add_zip_to_supplier.php @@ -1,7 +1,7 @@ string('zip',10)->nullable()->default(NULL); - + $table->string('zip', 10)->nullable()->default(null); }); } @@ -29,6 +28,4 @@ class AddZipToSupplier extends Migration $table->dropColumn('zip'); }); } - - } diff --git a/database/migrations/2014_06_24_033908_add_url_to_supplier.php b/database/migrations/2014_06_24_033908_add_url_to_supplier.php index 806a775e0c..9cb1bb198b 100755 --- a/database/migrations/2014_06_24_033908_add_url_to_supplier.php +++ b/database/migrations/2014_06_24_033908_add_url_to_supplier.php @@ -1,7 +1,7 @@ string('url',250)->nullable()->default(NULL); - + $table->string('url', 250)->nullable()->default(null); }); } @@ -29,5 +28,4 @@ class AddUrlToSupplier extends Migration $table->dropColumn('url'); }); } - } diff --git a/database/migrations/2014_07_08_054116_add_employee_id_to_users.php b/database/migrations/2014_07_08_054116_add_employee_id_to_users.php index dc64a9f601..fcf4336b54 100755 --- a/database/migrations/2014_07_08_054116_add_employee_id_to_users.php +++ b/database/migrations/2014_07_08_054116_add_employee_id_to_users.php @@ -1,35 +1,33 @@ text('employee_num','50')->nullable()->default(NULL); +class AddEmployeeIdToUsers extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + // + Schema::table('users', function ($table) { + $table->text('employee_num', '50')->nullable()->default(null); }); - } + } - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - // - Schema::table('users', function ($table) { + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::table('users', function ($table) { $table->dropColumn('employee_num'); }); - - } - + } } diff --git a/database/migrations/2014_07_09_134316_add_requestable_to_assets.php b/database/migrations/2014_07_09_134316_add_requestable_to_assets.php index 69e4838b26..a37939baaa 100755 --- a/database/migrations/2014_07_09_134316_add_requestable_to_assets.php +++ b/database/migrations/2014_07_09_134316_add_requestable_to_assets.php @@ -1,37 +1,33 @@ tinyInteger('requestable')->default(0); }); + } - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - // - Schema::table('assets', function ($table) { + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::table('assets', function ($table) { $table->dropColumn('requestable'); }); - - } - + } } - diff --git a/database/migrations/2014_07_17_085822_add_asset_to_software.php b/database/migrations/2014_07_17_085822_add_asset_to_software.php index ecca3f4387..e5e83cf882 100755 --- a/database/migrations/2014_07_17_085822_add_asset_to_software.php +++ b/database/migrations/2014_07_17_085822_add_asset_to_software.php @@ -1,34 +1,33 @@ integer('asset_id')->nullable()->default(NULL); +class AddAssetToSoftware extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + // + Schema::table('license_seats', function ($table) { + $table->integer('asset_id')->nullable()->default(null); }); - } + } - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - // - Schema::table('license_seats', function ($table) { + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::table('license_seats', function ($table) { $table->dropColumn('asset_id'); }); - } - + } } diff --git a/database/migrations/2014_07_17_161625_make_asset_id_in_logs_nullable.php b/database/migrations/2014_07_17_161625_make_asset_id_in_logs_nullable.php index 1c8f5c1cad..337f98e417 100755 --- a/database/migrations/2014_07_17_161625_make_asset_id_in_logs_nullable.php +++ b/database/migrations/2014_07_17_161625_make_asset_id_in_logs_nullable.php @@ -1,29 +1,28 @@ integer('rtd_location_id')->nullable()->default(NULL); +class AddRtdLocationToAssets extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + // + Schema::table('assets', function ($table) { + $table->integer('rtd_location_id')->nullable()->default(null); }); - } + } - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - // - Schema::table('assets', function ($table) { + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::table('assets', function ($table) { $table->dropColumn('rtd_location_id'); }); - } - + } } diff --git a/database/migrations/2014_10_24_000417_alter_supplier_state_to_32.php b/database/migrations/2014_10_24_000417_alter_supplier_state_to_32.php index 5195c5c714..da1fdaa518 100644 --- a/database/migrations/2014_10_24_000417_alter_supplier_state_to_32.php +++ b/database/migrations/2014_10_24_000417_alter_supplier_state_to_32.php @@ -1,28 +1,27 @@ integer('display_checkout_date')->nullable()->default(NULL); - + $table->integer('display_checkout_date')->nullable()->default(null); }); } @@ -29,5 +28,4 @@ class AddDisplayCheckoutDate extends Migration { $table->dropColumn('display_checkout_date'); }); } - } diff --git a/database/migrations/2014_10_28_222654_add_avatar_field_to_users_table.php b/database/migrations/2014_10_28_222654_add_avatar_field_to_users_table.php index 27eb94684c..16c95eae67 100644 --- a/database/migrations/2014_10_28_222654_add_avatar_field_to_users_table.php +++ b/database/migrations/2014_10_28_222654_add_avatar_field_to_users_table.php @@ -3,35 +3,29 @@ use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; -class AddAvatarFieldToUsersTable extends Migration { - - /** - * Make changes to the table. - * - * @return void - */ - public function up() - { - Schema::table('users', function(Blueprint $table) { - - $table->string('avatar')->nullable(); - - }); - - } - - /** - * Revert the changes to the table. - * - * @return void - */ - public function down() - { - Schema::table('users', function(Blueprint $table) { - - $table->dropColumn('avatar'); - - }); - } +class AddAvatarFieldToUsersTable extends Migration +{ + /** + * Make changes to the table. + * + * @return void + */ + public function up() + { + Schema::table('users', function (Blueprint $table) { + $table->string('avatar')->nullable(); + }); + } + /** + * Revert the changes to the table. + * + * @return void + */ + public function down() + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('avatar'); + }); + } } diff --git a/database/migrations/2014_10_29_045924_add_image_field_to_models_table.php b/database/migrations/2014_10_29_045924_add_image_field_to_models_table.php index 27ec34cb03..986c1d29fa 100644 --- a/database/migrations/2014_10_29_045924_add_image_field_to_models_table.php +++ b/database/migrations/2014_10_29_045924_add_image_field_to_models_table.php @@ -1,37 +1,31 @@ string('image')->nullable(); - - }); - - } - - /** - * Revert the changes to the table. - * - * @return void - */ - public function down() - { - Schema::table('models', function(Blueprint $table) { - - $table->dropColumn('image'); - - }); - } +class AddImageFieldToModelsTable extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::table('models', function (Blueprint $table) { + $table->string('image')->nullable(); + }); + } + /** + * Revert the changes to the table. + * + * @return void + */ + public function down() + { + Schema::table('models', function (Blueprint $table) { + $table->dropColumn('image'); + }); + } } diff --git a/database/migrations/2014_11_01_214955_add_eol_display_to_settings.php b/database/migrations/2014_11_01_214955_add_eol_display_to_settings.php index 9c7e8061fe..82d69e12ba 100644 --- a/database/migrations/2014_11_01_214955_add_eol_display_to_settings.php +++ b/database/migrations/2014_11_01_214955_add_eol_display_to_settings.php @@ -1,20 +1,19 @@ integer('display_eol')->nullable()->default(NULL); - + $table->integer('display_eol')->nullable()->default(null); }); } @@ -29,5 +28,4 @@ class AddEolDisplayToSettings extends Migration { $table->dropColumn('display_eol'); }); } - } diff --git a/database/migrations/2014_11_04_231416_update_group_field_for_reporting.php b/database/migrations/2014_11_04_231416_update_group_field_for_reporting.php index 248e26dde2..c5c42b1f0e 100644 --- a/database/migrations/2014_11_04_231416_update_group_field_for_reporting.php +++ b/database/migrations/2014_11_04_231416_update_group_field_for_reporting.php @@ -1,11 +1,11 @@ update(['permissions' => '{"users-poop":1,"reports":1}']); Group::where('id', 2)->update(['permissions' => '{"users-pop":1,"reports":1}']); - } elseif (Schema::hasTable('groups')) { DB::update('update '.DB::getTablePrefix().'groups set permissions = ? where id = ?', ['{"admin-farts":1,"users":1,"reports":1}', 1]); DB::update('update '.DB::getTablePrefix().'groups set permissions = ? where id = ?', ['{"users-farts":1,"reports":1}', 2]); } - } /** @@ -41,5 +38,4 @@ class UpdateGroupFieldForReporting extends Migration { { // } - } diff --git a/database/migrations/2014_11_05_212408_add_fields_to_licenses.php b/database/migrations/2014_11_05_212408_add_fields_to_licenses.php index e5bbad46d5..f8909764e0 100644 --- a/database/migrations/2014_11_05_212408_add_fields_to_licenses.php +++ b/database/migrations/2014_11_05_212408_add_fields_to_licenses.php @@ -1,36 +1,35 @@ integer('supplier_id')->nullable()->default(NULL); - $table->date('expiration_date')->nullable(); - $table->string('purchase_order')->nullable(); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::table('licenses', function ($table) { - $table->dropColumn('supplier_id'); - $table->dropColumn('expiration_date'); - $table->dropColumn('purchase_order'); - }); - } +class AddFieldsToLicenses extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::table('licenses', function ($table) { + $table->integer('supplier_id')->nullable()->default(null); + $table->date('expiration_date')->nullable(); + $table->string('purchase_order')->nullable(); + }); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('licenses', function ($table) { + $table->dropColumn('supplier_id'); + $table->dropColumn('expiration_date'); + $table->dropColumn('purchase_order'); + }); + } } diff --git a/database/migrations/2014_11_07_021042_add_image_to_supplier.php b/database/migrations/2014_11_07_021042_add_image_to_supplier.php index 0efb41eb09..a1c71d90a2 100644 --- a/database/migrations/2014_11_07_021042_add_image_to_supplier.php +++ b/database/migrations/2014_11_07_021042_add_image_to_supplier.php @@ -1,37 +1,31 @@ string('image')->nullable(); + }); + } - /** - * Run the migrations. - * - * @return void - */ - public function up() - { - Schema::table('suppliers', function(Blueprint $table) { - - $table->string('image')->nullable(); - - }); - - } - - /** - * Revert the changes to the table. - * - * @return void - */ - public function down() - { - Schema::table('suppliers', function(Blueprint $table) { - - $table->dropColumn('image'); - - }); - } - -} \ No newline at end of file + /** + * Revert the changes to the table. + * + * @return void + */ + public function down() + { + Schema::table('suppliers', function (Blueprint $table) { + $table->dropColumn('image'); + }); + } +} diff --git a/database/migrations/2014_11_20_203007_add_username_to_user.php b/database/migrations/2014_11_20_203007_add_username_to_user.php index 5dfecac39a..0861145f21 100644 --- a/database/migrations/2014_11_20_203007_add_username_to_user.php +++ b/database/migrations/2014_11_20_203007_add_username_to_user.php @@ -1,39 +1,33 @@ string('username')->nullable()->default(NULL); - - }); - - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - // - Schema::table('users', function(Blueprint $table) { - - $table->dropColumn('username'); - - }); - } +class AddUsernameToUser extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + // + Schema::table('users', function (Blueprint $table) { + $table->string('username')->nullable()->default(null); + }); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('username'); + }); + } } diff --git a/database/migrations/2014_11_20_223947_add_auto_to_settings.php b/database/migrations/2014_11_20_223947_add_auto_to_settings.php index 3d3a4765f7..529e00d907 100644 --- a/database/migrations/2014_11_20_223947_add_auto_to_settings.php +++ b/database/migrations/2014_11_20_223947_add_auto_to_settings.php @@ -1,38 +1,33 @@ integer('auto_increment_assets')->default(0); - - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - // - Schema::table('settings', function(Blueprint $table) { - - $table->dropColumn('auto_increment_assets'); - - }); - } +class AddAutoToSettings extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + // + Schema::table('settings', function (Blueprint $table) { + $table->integer('auto_increment_assets')->default(0); + }); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::table('settings', function (Blueprint $table) { + $table->dropColumn('auto_increment_assets'); + }); + } } diff --git a/database/migrations/2014_11_20_224421_add_prefix_to_settings.php b/database/migrations/2014_11_20_224421_add_prefix_to_settings.php index e325b3c55e..06162125dc 100644 --- a/database/migrations/2014_11_20_224421_add_prefix_to_settings.php +++ b/database/migrations/2014_11_20_224421_add_prefix_to_settings.php @@ -1,38 +1,33 @@ string('auto_increment_prefix')->nullable()->default(NULL); - - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - // - Schema::table('settings', function(Blueprint $table) { - - $table->dropColumn('auto_increment_prefix'); - - }); - } +class AddPrefixToSettings extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + // + Schema::table('settings', function (Blueprint $table) { + $table->string('auto_increment_prefix')->nullable()->default(null); + }); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::table('settings', function (Blueprint $table) { + $table->dropColumn('auto_increment_prefix'); + }); + } } diff --git a/database/migrations/2014_11_21_104401_change_licence_type.php b/database/migrations/2014_11_21_104401_change_licence_type.php index 1028cca3e5..97701d0b0f 100644 --- a/database/migrations/2014_11_21_104401_change_licence_type.php +++ b/database/migrations/2014_11_21_104401_change_licence_type.php @@ -1,32 +1,31 @@ date('termination_date')->nullable(); - $table->boolean('maintained')->nullable(); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::table('licenses', function ($table) { - $table->dropColumn('termination_date'); - $table->dropColumn('maintained'); - }); - } +class AddFieldsMaintainedTermToLicenses extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::table('licenses', function ($table) { + $table->date('termination_date')->nullable(); + $table->boolean('maintained')->nullable(); + }); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('licenses', function ($table) { + $table->dropColumn('termination_date'); + $table->dropColumn('maintained'); + }); + } } diff --git a/database/migrations/2015_02_04_155757_increase_user_field_lengths.php b/database/migrations/2015_02_04_155757_increase_user_field_lengths.php index e71eedd007..493e07ee41 100644 --- a/database/migrations/2015_02_04_155757_increase_user_field_lengths.php +++ b/database/migrations/2015_02_04_155757_increase_user_field_lengths.php @@ -1,30 +1,29 @@ getDoctrineSchemaManager()->getDatabasePlatform(); $platform->registerDoctrineTypeMapping('enum', 'string'); Schema::table('asset_logs', function ($table) { - $table->string('asset_type',100)->nullable()->change(); + $table->string('asset_type', 100)->nullable()->change(); }); - // DB::statement('ALTER TABLE ' . DB::getTablePrefix() . 'asset_logs MODIFY column asset_type varchar(100) null'); - // DB::statement('ALTER TABLE ' . DB::getTablePrefix() . 'asset_logs MODIFY column added_on timestamp default "0000-00-00 00:00:00"'); - // Schema::table('asset_logs', function ($table) { - // $table->renameColumn('added_on', 'created_at'); - // $table->timestamp('updated_at'); + // DB::statement('ALTER TABLE ' . DB::getTablePrefix() . 'asset_logs MODIFY column asset_type varchar(100) null'); + // DB::statement('ALTER TABLE ' . DB::getTablePrefix() . 'asset_logs MODIFY column added_on timestamp default "0000-00-00 00:00:00"'); + // Schema::table('asset_logs', function ($table) { + // $table->renameColumn('added_on', 'created_at'); + // $table->timestamp('updated_at'); // $table->softDeletes(); - // }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - // Schema::table('asset_logs', function ($table) { - // $table->renameColumn('created_at', 'added_on'); - // $table->dropColumn('updated_at'); - // $table->dropSoftDeletes(); - // }); - } + // }); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // Schema::table('asset_logs', function ($table) { + // $table->renameColumn('created_at', 'added_on'); + // $table->dropColumn('updated_at'); + // $table->dropSoftDeletes(); + // }); + } } diff --git a/database/migrations/2015_02_10_040958_fix_bad_assigned_to_ids.php b/database/migrations/2015_02_10_040958_fix_bad_assigned_to_ids.php index 7be7dc63a1..36ba8f8caa 100644 --- a/database/migrations/2015_02_10_040958_fix_bad_assigned_to_ids.php +++ b/database/migrations/2015_02_10_040958_fix_bad_assigned_to_ids.php @@ -1,50 +1,47 @@ boolean('deployable')->default(0); - $table->boolean('pending')->default(0); - $table->boolean('archived')->default(0); - $table->text('notes')->nullable(); - }); + Schema::table('status_labels', function ($table) { + $table->boolean('deployable')->default(0); + $table->boolean('pending')->default(0); + $table->boolean('archived')->default(0); + $table->text('notes')->nullable(); + }); DB::table('status_labels')->insert([ ['user_id' => 1, 'name' => 'Pending', 'deployable' => 0, 'pending' => 1, 'archived' => 0, 'notes' => 'These assets are not yet ready to be deployed, usually because of configuration or waiting on parts.'], ['user_id' => 1, 'name' => 'Ready to Deploy', 'deployable' => 1, 'pending' => 0, 'archived' => 0, 'notes' => 'These assets are ready to deploy.'], ['user_id' => 1, 'name' => 'Archived', 'deployable' => 0, 'pending' => 0, 'archived' => 1, 'notes' => 'These assets are no longer in circulation or viable.'], ]); + } - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - // - Schema::table('status_labels', function ($table) { - $table->dropColumn('deployable'); - $table->dropColumn('pending'); - $table->dropColumn('archived'); - $table->dropColumn('notes'); - - }); - } - + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::table('status_labels', function ($table) { + $table->dropColumn('deployable'); + $table->dropColumn('pending'); + $table->dropColumn('archived'); + $table->dropColumn('notes'); + }); + } } diff --git a/database/migrations/2015_02_10_053310_migrate_data_to_new_statuses.php b/database/migrations/2015_02_10_053310_migrate_data_to_new_statuses.php index 8b9c33632c..50dacc1f7a 100644 --- a/database/migrations/2015_02_10_053310_migrate_data_to_new_statuses.php +++ b/database/migrations/2015_02_10_053310_migrate_data_to_new_statuses.php @@ -1,60 +1,51 @@ where('name', 'Pending')->orWhere('name', 'Ready to Deploy')->get(); - foreach ($statuses as $status) { - if ($status->name =="Pending") { - $pending_id = array($status->id); - } elseif ($status->name =="Ready to Deploy") { - $rtd_id = array($status->id); - } - } + foreach ($statuses as $status) { + if ($status->name == 'Pending') { + $pending_id = [$status->id]; + } elseif ($status->name == 'Ready to Deploy') { + $rtd_id = [$status->id]; + } + } - // Pending + // Pending $pendings = DB::table('assets')->where('status_id', null)->where('physical', '1')->get(); + foreach ($pendings as $pending) { + DB::update('update '.DB::getTablePrefix().'assets set status_id = ? where status_id IS NULL AND physical=1', $pending_id); + } - foreach ($pendings as $pending) { - DB::update('update ' . DB::getTablePrefix() . 'assets set status_id = ? where status_id IS NULL AND physical=1',$pending_id); - - } - - - // Ready to Deploy + // Ready to Deploy $rtds = DB::table('assets')->where('status_id', 0)->where('physical', '1')->get(); - foreach ($rtds as $rtd) { - //DB::update('update users set votes = 100 where name = ?', array('John')); - DB::update('update ' . DB::getTablePrefix() . 'assets set status_id = ? where status_id = 0 AND physical=1',$rtd_id); - - } - - - - - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - // - } + foreach ($rtds as $rtd) { + //DB::update('update users set votes = 100 where name = ?', array('John')); + DB::update('update '.DB::getTablePrefix().'assets set status_id = ? where status_id = 0 AND physical=1', $rtd_id); + } + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } } diff --git a/database/migrations/2015_02_11_044104_migrate_make_license_assigned_null.php b/database/migrations/2015_02_11_044104_migrate_make_license_assigned_null.php index 75f2e46301..e3586b7763 100644 --- a/database/migrations/2015_02_11_044104_migrate_make_license_assigned_null.php +++ b/database/migrations/2015_02_11_044104_migrate_make_license_assigned_null.php @@ -1,29 +1,28 @@ increments('id'); $table->integer('asset_id'); $table->integer('user_id')->nullable(); @@ -21,17 +21,16 @@ class MigrateCreateRequestsTable extends Migration { $table->timestamps(); $table->softDeletes(); }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - // - Schema::drop('requests'); - } + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::drop('requests'); + } } diff --git a/database/migrations/2015_02_12_001312_add_mac_address_to_asset.php b/database/migrations/2015_02_12_001312_add_mac_address_to_asset.php index eb658a53ae..8f0bf1385a 100644 --- a/database/migrations/2015_02_12_001312_add_mac_address_to_asset.php +++ b/database/migrations/2015_02_12_001312_add_mac_address_to_asset.php @@ -1,43 +1,41 @@ string('mac_address')->nullable()->default(null); + }); - /** - * Run the migrations. - * - * @return void - */ - public function up() - { - // - Schema::table('assets', function ($table) { - $table->string('mac_address')->nullable()->default(NULL); - }); + Schema::table('models', function ($table) { + $table->boolean('show_mac_address')->default(0); + }); + } - Schema::table('models', function ($table) { - $table->boolean('show_mac_address')->default(0); - }); - - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - // - Schema::table('assets', function ($table) { - $table->dropColumn('mac_address'); - }); - - Schema::table('models', function ($table) { - $table->dropColumn('show_mac_address'); - }); - } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::table('assets', function ($table) { + $table->dropColumn('mac_address'); + }); + Schema::table('models', function ($table) { + $table->dropColumn('show_mac_address'); + }); + } } diff --git a/database/migrations/2015_02_12_024100_change_license_notes_type.php b/database/migrations/2015_02_12_024100_change_license_notes_type.php index a9a3029a8b..ba2f4b3188 100644 --- a/database/migrations/2015_02_12_024100_change_license_notes_type.php +++ b/database/migrations/2015_02_12_024100_change_license_notes_type.php @@ -1,27 +1,29 @@ text('notes')->change(); - }); +use Illuminate\Database\Schema\Blueprint; - } - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { +class ChangeLicenseNotesType extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + // + Schema::table('licenses', function ($table) { + $table->text('notes')->change(); + }); + } - } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + } } diff --git a/database/migrations/2015_02_17_231020_add_localonly_to_settings.php b/database/migrations/2015_02_17_231020_add_localonly_to_settings.php index 6ac91ba23d..5c5b0eeb95 100644 --- a/database/migrations/2015_02_17_231020_add_localonly_to_settings.php +++ b/database/migrations/2015_02_17_231020_add_localonly_to_settings.php @@ -1,35 +1,33 @@ boolean('load_remote')->default(1); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - // - Schema::table('settings', function ($table) { - $table->dropColumn('load_remote'); - }); - - } +class AddLocalonlyToSettings extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + // + Schema::table('settings', function ($table) { + $table->boolean('load_remote')->default(1); + }); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::table('settings', function ($table) { + $table->dropColumn('load_remote'); + }); + } } diff --git a/database/migrations/2015_02_19_222322_add_logo_and_colors_to_settings.php b/database/migrations/2015_02_19_222322_add_logo_and_colors_to_settings.php index f047a7080f..cb2d7ac983 100644 --- a/database/migrations/2015_02_19_222322_add_logo_and_colors_to_settings.php +++ b/database/migrations/2015_02_19_222322_add_logo_and_colors_to_settings.php @@ -1,37 +1,35 @@ string('logo')->nullable()->default(NULL); - $table->string('header_color')->nullable()->default(NULL); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - // - Schema::table('settings', function ($table) { - $table->dropColumn('logo'); - $table->dropColumn('header_color'); - }); - - } +class AddLogoAndColorsToSettings extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + // + Schema::table('settings', function ($table) { + $table->string('logo')->nullable()->default(null); + $table->string('header_color')->nullable()->default(null); + }); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::table('settings', function ($table) { + $table->dropColumn('logo'); + $table->dropColumn('header_color'); + }); + } } diff --git a/database/migrations/2015_02_24_072043_add_alerts_to_settings.php b/database/migrations/2015_02_24_072043_add_alerts_to_settings.php index 8a208457ea..d7119ab4cd 100644 --- a/database/migrations/2015_02_24_072043_add_alerts_to_settings.php +++ b/database/migrations/2015_02_24_072043_add_alerts_to_settings.php @@ -1,36 +1,35 @@ string('alert_email')->nullable()->default(NULL); - $table->boolean('alerts_enabled')->default(1); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - // - Schema::table('settings', function ($table) { - $table->dropColumn('alert_email'); - $table->dropColumn('alerts_enabled'); - }); - } +class AddAlertsToSettings extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + // + Schema::table('settings', function ($table) { + $table->string('alert_email')->nullable()->default(null); + $table->boolean('alerts_enabled')->default(1); + }); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::table('settings', function ($table) { + $table->dropColumn('alert_email'); + $table->dropColumn('alerts_enabled'); + }); + } } diff --git a/database/migrations/2015_02_25_022931_add_eula_fields.php b/database/migrations/2015_02_25_022931_add_eula_fields.php index a4eff87120..90c249dd49 100644 --- a/database/migrations/2015_02_25_022931_add_eula_fields.php +++ b/database/migrations/2015_02_25_022931_add_eula_fields.php @@ -1,69 +1,67 @@ longText('default_eula_text')->nullable()->default(null); + }); - /** - * Run the migrations. - * - * @return void - */ - public function up() - { - // - Schema::table('settings', function ($table) { - $table->longText('default_eula_text')->nullable()->default(NULL); - }); + Schema::table('categories', function ($table) { + $table->longText('eula_text')->nullable()->default(null); + $table->boolean('use_default_eula')->default(0); + $table->boolean('require_acceptance')->default(0); + }); - Schema::table('categories', function ($table) { - $table->longText('eula_text')->nullable()->default(NULL); - $table->boolean('use_default_eula')->default(0); - $table->boolean('require_acceptance')->default(0); - }); + Schema::table('asset_logs', function ($table) { + $table->dateTime('requested_at')->nullable()->default(null); + $table->dateTime('accepted_at')->nullable()->default(null); + }); - Schema::table('asset_logs', function ($table) { - $table->dateTime('requested_at')->nullable()->default(NULL); - $table->dateTime('accepted_at')->nullable()->default(NULL); - }); + Schema::create('requested_assets', function ($table) { + $table->increments('id'); + $table->integer('asset_id')->default(null); + $table->integer('user_id')->default(null); + $table->dateTime('accepted_at')->nullable()->default(null); + $table->dateTime('denied_at')->nullable()->default(null); + $table->string('notes')->default(null); + $table->timestamps(); + }); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::table('settings', function ($table) { + $table->dropColumn('default_eula_text'); + }); - Schema::create('requested_assets', function ($table) { - $table->increments('id'); - $table->integer('asset_id')->default(NULL); - $table->integer('user_id')->default(NULL); - $table->dateTime('accepted_at')->nullable()->default(NULL); - $table->dateTime('denied_at')->nullable()->default(NULL); - $table->string('notes')->default(NULL); - $table->timestamps(); - }); - } + Schema::table('categories', function ($table) { + $table->dropColumn('eula_text'); + $table->dropColumn('use_default_eula'); + $table->dropColumn('require_acceptance'); + }); - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - // - Schema::table('settings', function ($table) { - $table->dropColumn('default_eula_text'); - }); - - Schema::table('categories', function ($table) { - $table->dropColumn('eula_text'); - $table->dropColumn('use_default_eula'); - $table->dropColumn('require_acceptance'); - }); - - Schema::table('asset_logs', function ($table) { - $table->dropColumn('requested_at'); - $table->dropColumn('accepted_at'); - }); - - Schema::drop('requested_assets'); - } + Schema::table('asset_logs', function ($table) { + $table->dropColumn('requested_at'); + $table->dropColumn('accepted_at'); + }); + Schema::drop('requested_assets'); + } } diff --git a/database/migrations/2015_02_25_204513_add_accessories_table.php b/database/migrations/2015_02_25_204513_add_accessories_table.php index 037351f861..49d95d721f 100644 --- a/database/migrations/2015_02_25_204513_add_accessories_table.php +++ b/database/migrations/2015_02_25_204513_add_accessories_table.php @@ -1,23 +1,23 @@ increments('id'); - $table->string('name')->nullable()->default(NULL); - $table->integer('category_id')->nullable()->default(NULL); - $table->integer('user_id')->nullable()->default(NULL); + $table->string('name')->nullable()->default(null); + $table->integer('category_id')->nullable()->default(null); + $table->integer('user_id')->nullable()->default(null); $table->integer('qty')->default(0); $table->boolean('requestable')->default(0); $table->timestamps(); @@ -26,24 +26,22 @@ class AddAccessoriesTable extends Migration { }); Schema::table('asset_logs', function ($table) { - $table->integer('accessory_id')->nullable()->default(NULL); - }); + $table->integer('accessory_id')->nullable()->default(null); + }); + } - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - // - Schema::drop('accessories'); - - Schema::table('asset_logs', function ($table) { - $table->dropColumn('accessory_id'); - }); - } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::drop('accessories'); + Schema::table('asset_logs', function ($table) { + $table->dropColumn('accessory_id'); + }); + } } diff --git a/database/migrations/2015_02_26_091228_add_accessories_user_table.php b/database/migrations/2015_02_26_091228_add_accessories_user_table.php index e8a01d5508..38e1ac5b52 100644 --- a/database/migrations/2015_02_26_091228_add_accessories_user_table.php +++ b/database/migrations/2015_02_26_091228_add_accessories_user_table.php @@ -1,46 +1,43 @@ increments('id'); - $table->integer('user_id')->nullable()->default(NULL); - $table->integer('accessory_id')->nullable()->default(NULL); - $table->integer('assigned_to')->nullable()->default(NULL); + $table->integer('user_id')->nullable()->default(null); + $table->integer('accessory_id')->nullable()->default(null); + $table->integer('assigned_to')->nullable()->default(null); $table->timestamps(); }); - + Schema::table('accessories', function ($table) { - $table->integer('location_id')->nullable()->default(NULL); - }); + $table->integer('location_id')->nullable()->default(null); + }); + } - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - // - Schema::drop('accessories_users'); - - Schema::table('accessories', function ($table) { - $table->dropColumn('location_id'); - }); - - } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::drop('accessories_users'); + Schema::table('accessories', function ($table) { + $table->dropColumn('location_id'); + }); + } } diff --git a/database/migrations/2015_02_26_115128_add_deleted_at_models.php b/database/migrations/2015_02_26_115128_add_deleted_at_models.php index 044647d43d..28f42d2366 100644 --- a/database/migrations/2015_02_26_115128_add_deleted_at_models.php +++ b/database/migrations/2015_02_26_115128_add_deleted_at_models.php @@ -1,32 +1,31 @@ softDeletes(); }); - } + } - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::table('models', function ($table){ + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('models', function ($table) { $table->dropColumn('deleted_at'); }); - } - + } } diff --git a/database/migrations/2015_02_26_233005_add_category_type.php b/database/migrations/2015_02_26_233005_add_category_type.php index 7fe85587f1..8f41f6fda9 100644 --- a/database/migrations/2015_02_26_233005_add_category_type.php +++ b/database/migrations/2015_02_26_233005_add_category_type.php @@ -1,34 +1,33 @@ string('category_type')->nullable()->default('asset'); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - // - Schema::table('categories', function ($table) { - $table->dropColumn('category_type'); - }); - } +class AddCategoryType extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + // + Schema::table('categories', function ($table) { + $table->string('category_type')->nullable()->default('asset'); + }); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::table('categories', function ($table) { + $table->dropColumn('category_type'); + }); + } } diff --git a/database/migrations/2015_03_01_231912_update_accepted_at_to_acceptance_id.php b/database/migrations/2015_03_01_231912_update_accepted_at_to_acceptance_id.php index 6d913e03a5..9cae90a791 100644 --- a/database/migrations/2015_03_01_231912_update_accepted_at_to_acceptance_id.php +++ b/database/migrations/2015_03_01_231912_update_accepted_at_to_acceptance_id.php @@ -1,47 +1,44 @@ integer('accepted_id')->nullable()->default(null); + }); - Schema::table('asset_logs', function ($table) { - $table->integer('accepted_id')->nullable()->default(NULL); - }); - - $results = DB::table('asset_logs as invitation')->join('asset_logs as acceptance', function($join) { + $results = DB::table('asset_logs as invitation')->join('asset_logs as acceptance', function ($join) { $join->on('invitation.checkedout_to', '=', 'acceptance.checkedout_to'); $join->on('invitation.asset_id', '=', 'acceptance.asset_id'); })->select('invitation.id as invitation_id', 'acceptance.id as acceptance_id') ->where('invitation.action_type', 'checkout')->where('acceptance.action_type', 'accepted')->get(); - foreach ($results as $result) { - $update = DB::update('update '.DB::getTablePrefix().'asset_logs set accepted_id=? where id=?', [$result->acceptance_id, $result->invitation_id]); - } - - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - // - Schema::table('asset_logs', function ($table) { - $table->dropColumn('accepted_id'); - }); - - } + foreach ($results as $result) { + $update = DB::update('update '.DB::getTablePrefix().'asset_logs set accepted_id=? where id=?', [$result->acceptance_id, $result->invitation_id]); + } + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::table('asset_logs', function ($table) { + $table->dropColumn('accepted_id'); + }); + } } diff --git a/database/migrations/2015_03_05_011929_add_qr_type_to_settings.php b/database/migrations/2015_03_05_011929_add_qr_type_to_settings.php index cc171bbfef..e85d79bd97 100644 --- a/database/migrations/2015_03_05_011929_add_qr_type_to_settings.php +++ b/database/migrations/2015_03_05_011929_add_qr_type_to_settings.php @@ -1,34 +1,33 @@ string('barcode_type')->nullable()->default('QRCODE'); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - // - Schema::table('settings', function ($table) { - $table->dropColumn('barcode_type'); - }); - } +class AddQrTypeToSettings extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + // + Schema::table('settings', function ($table) { + $table->string('barcode_type')->nullable()->default('QRCODE'); + }); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::table('settings', function ($table) { + $table->dropColumn('barcode_type'); + }); + } } diff --git a/database/migrations/2015_03_18_055327_add_note_to_user.php b/database/migrations/2015_03_18_055327_add_note_to_user.php index 631f4574c0..191d34c572 100644 --- a/database/migrations/2015_03_18_055327_add_note_to_user.php +++ b/database/migrations/2015_03_18_055327_add_note_to_user.php @@ -1,32 +1,31 @@ text('notes')->nullable(); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::table('users', function ($table) { - $table->dropColumn('notes'); - }); - } +class AddNoteToUser extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::table('users', function ($table) { + $table->text('notes')->nullable(); + }); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('users', function ($table) { + $table->dropColumn('notes'); + }); + } } diff --git a/database/migrations/2015_04_29_234704_add_slack_to_settings.php b/database/migrations/2015_04_29_234704_add_slack_to_settings.php index 8dca9e0b06..c7970ef1dd 100644 --- a/database/migrations/2015_04_29_234704_add_slack_to_settings.php +++ b/database/migrations/2015_04_29_234704_add_slack_to_settings.php @@ -1,39 +1,36 @@ string('slack_endpoint')->nullable()->default(NULL); - $table->string('slack_channel')->nullable()->default(NULL); - $table->string('slack_botname')->nullable()->default(NULL); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::table('settings', function(Blueprint $table) - { - // - $table->dropColumn('slack_endpoint'); - $table->dropColumn('slack_channel'); - $table->dropColumn('slack_botname'); - }); - } +class AddSlackToSettings extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::table('settings', function (Blueprint $table) { + $table->string('slack_endpoint')->nullable()->default(null); + $table->string('slack_channel')->nullable()->default(null); + $table->string('slack_botname')->nullable()->default(null); + }); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('settings', function (Blueprint $table) { + // + $table->dropColumn('slack_endpoint'); + $table->dropColumn('slack_channel'); + $table->dropColumn('slack_botname'); + }); + } } diff --git a/database/migrations/2015_05_04_085151_add_parent_id_to_locations_table.php b/database/migrations/2015_05_04_085151_add_parent_id_to_locations_table.php index 6c0ed7f831..5b9dc26ea1 100644 --- a/database/migrations/2015_05_04_085151_add_parent_id_to_locations_table.php +++ b/database/migrations/2015_05_04_085151_add_parent_id_to_locations_table.php @@ -1,36 +1,33 @@ integer('parent_id')->nullable()->default(NULL); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::table('locations', function(Blueprint $table) - { - // - $table->dropColumn('parent_id'); - }); - } +class AddParentIdToLocationsTable extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::table('locations', function (Blueprint $table) { + // + $table->integer('parent_id')->nullable()->default(null); + }); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('locations', function (Blueprint $table) { + // + $table->dropColumn('parent_id'); + }); + } } diff --git a/database/migrations/2015_05_22_124421_add_reassignable_to_licenses.php b/database/migrations/2015_05_22_124421_add_reassignable_to_licenses.php index b0e94a92f8..fc029e2619 100644 --- a/database/migrations/2015_05_22_124421_add_reassignable_to_licenses.php +++ b/database/migrations/2015_05_22_124421_add_reassignable_to_licenses.php @@ -1,35 +1,32 @@ boolean('reassignable')->default(true); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::table('licenses', function(Blueprint $table) - { - // - $table->dropColumn('reassignable'); - }); - } +class AddReassignableToLicenses extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::table('licenses', function (Blueprint $table) { + $table->boolean('reassignable')->default(true); + }); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('licenses', function (Blueprint $table) { + // + $table->dropColumn('reassignable'); + }); + } } diff --git a/database/migrations/2015_06_10_003314_fix_default_for_user_notes.php b/database/migrations/2015_06_10_003314_fix_default_for_user_notes.php index 12255c4c23..6fb202c443 100644 --- a/database/migrations/2015_06_10_003314_fix_default_for_user_notes.php +++ b/database/migrations/2015_06_10_003314_fix_default_for_user_notes.php @@ -1,29 +1,28 @@ increments('id'); - $table->string('name')->nullable()->default(NULL); - $table->integer('category_id')->nullable()->default(NULL); - $table->integer('location_id')->nullable()->default(NULL); - $table->integer('user_id')->nullable()->default(NULL); + $table->string('name')->nullable()->default(null); + $table->integer('category_id')->nullable()->default(null); + $table->integer('location_id')->nullable()->default(null); + $table->integer('user_id')->nullable()->default(null); $table->integer('qty')->default(0); $table->boolean('requestable')->default(0); $table->timestamps(); @@ -27,38 +27,32 @@ class CreateConsumables extends Migration { }); Schema::table('asset_logs', function ($table) { - $table->integer('consumable_id')->nullable()->default(NULL); - }); - - Schema::create('consumables_users', function ($table) { - $table->increments('id'); - $table->integer('user_id')->nullable()->default(NULL); - $table->integer('consumable_id')->nullable()->default(NULL); - $table->integer('assigned_to')->nullable()->default(NULL); - $table->timestamps(); + $table->integer('consumable_id')->nullable()->default(null); }); + Schema::create('consumables_users', function ($table) { + $table->increments('id'); + $table->integer('user_id')->nullable()->default(null); + $table->integer('consumable_id')->nullable()->default(null); + $table->integer('assigned_to')->nullable()->default(null); + $table->timestamps(); + }); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::drop('consumables'); - } - - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - // - Schema::drop('consumables'); - - Schema::table('asset_logs', function ($table) { - $table->dropColumn('consumable_id'); - }); - - Schema::drop('consumables_users'); - - } + Schema::table('asset_logs', function ($table) { + $table->dropColumn('consumable_id'); + }); + Schema::drop('consumables_users'); + } } diff --git a/database/migrations/2015_06_15_183253_move_email_to_username.php b/database/migrations/2015_06_15_183253_move_email_to_username.php index 66c07acb77..8506bd4d16 100644 --- a/database/migrations/2015_06_15_183253_move_email_to_username.php +++ b/database/migrations/2015_06_15_183253_move_email_to_username.php @@ -1,30 +1,29 @@ string('email')->nullable()->change(); - }); - - - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - // - - } +class MakeEmailNullable extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::table('users', function (Blueprint $table) { + $table->string('email')->nullable()->change(); + }); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } } diff --git a/database/migrations/2015_06_26_213716_create_asset_maintenances_table.php b/database/migrations/2015_06_26_213716_create_asset_maintenances_table.php index 4c465528dc..f328bb61f8 100644 --- a/database/migrations/2015_06_26_213716_create_asset_maintenances_table.php +++ b/database/migrations/2015_06_26_213716_create_asset_maintenances_table.php @@ -6,7 +6,6 @@ class CreateAssetMaintenancesTable extends Migration { - /** * Run the migrations. * @@ -14,39 +13,36 @@ */ public function up() { - - Schema::create( 'asset_maintenances', function ( Blueprint $table ) { - - $table->increments( 'id' ); - $table->integer( 'asset_id' ) + Schema::create('asset_maintenances', function (Blueprint $table) { + $table->increments('id'); + $table->integer('asset_id') ->unsigned(); - $table->integer( 'supplier_id' ) + $table->integer('supplier_id') ->unsigned(); - $table->string( 'asset_maintenance_type'); - $table->string( 'title', 100 ); - $table->boolean( 'is_warranty' ); - $table->date( 'start_date' ); - $table->date( 'completion_date' ) + $table->string('asset_maintenance_type'); + $table->string('title', 100); + $table->boolean('is_warranty'); + $table->date('start_date'); + $table->date('completion_date') ->nullable(); - $table->integer( 'asset_maintenance_time' ) + $table->integer('asset_maintenance_time') ->nullable(); - $table->longText( 'notes' ) + $table->longText('notes') ->nullable(); - $table->decimal( 'cost', 10, 2 ) + $table->decimal('cost', 10, 2) ->nullable(); - $table->dateTime( 'deleted_at' ) + $table->dateTime('deleted_at') ->nullable(); $table->timestamps(); - } ); + }); } protected function getEnumFields() { - return [ - trans( 'admin/asset_maintenances/general.maintenance' ), - trans( 'admin/asset_maintenances/general.repair' ), - trans( 'admin/asset_maintenances/general.upgrade' ) + trans('admin/asset_maintenances/general.maintenance'), + trans('admin/asset_maintenances/general.repair'), + trans('admin/asset_maintenances/general.upgrade'), ]; } @@ -57,9 +53,6 @@ */ public function down() { - - Schema::dropIfExists( 'asset_maintenances' ); - + Schema::dropIfExists('asset_maintenances'); } - -} + } diff --git a/database/migrations/2015_07_04_212443_create_custom_fields_table.php b/database/migrations/2015_07_04_212443_create_custom_fields_table.php index b2dbbebb8c..3e3319c635 100644 --- a/database/migrations/2015_07_04_212443_create_custom_fields_table.php +++ b/database/migrations/2015_07_04_212443_create_custom_fields_table.php @@ -5,32 +5,30 @@ use Illuminate\Database\Migrations\Migration; class CreateCustomFieldsTable extends Migration { + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::create('custom_fields', function ($table) { + $table->increments('id'); + $table->string('name'); + $table->string('format'); + $table->string('element'); + $table->timestamps(); + }); + } - /** - * Run the migrations. - * - * @return void - */ - public function up() - { - Schema::create('custom_fields', function ($table) { - $table->increments('id'); - $table->string('name'); - $table->string('format'); - $table->string('element'); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - // - Schema::drop('custom_fields'); - } - + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::drop('custom_fields'); + } } diff --git a/database/migrations/2015_07_09_014359_add_currency_to_settings_and_locations.php b/database/migrations/2015_07_09_014359_add_currency_to_settings_and_locations.php index 254a3c018b..37e0edb743 100644 --- a/database/migrations/2015_07_09_014359_add_currency_to_settings_and_locations.php +++ b/database/migrations/2015_07_09_014359_add_currency_to_settings_and_locations.php @@ -1,56 +1,46 @@ string('default_currency',10)->nullable()->default(NULL); - }); +class AddCurrencyToSettingsAndLocations extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::table('settings', function (Blueprint $table) { + $table->string('default_currency', 10)->nullable()->default(null); + }); DB::table('settings')->update(['default_currency' => trans('general.currency')]); - Schema::table('locations', function(Blueprint $table) - { - $table->string('currency',10)->nullable()->default(NULL); - }); + Schema::table('locations', function (Blueprint $table) { + $table->string('currency', 10)->nullable()->default(null); + }); DB::table('locations')->update(['currency' => trans('general.currency')]); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::table('settings', function (Blueprint $table) { + // + $table->dropColumn('default_currency'); + }); - - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - // - Schema::table('settings', function(Blueprint $table) - { - // - $table->dropColumn('default_currency'); - }); - - Schema::table('locations', function(Blueprint $table) - { - // - $table->dropColumn('currency'); - }); - - } - + Schema::table('locations', function (Blueprint $table) { + // + $table->dropColumn('currency'); + }); + } } diff --git a/database/migrations/2015_07_21_122022_add_expected_checkin_date_to_asset_logs.php b/database/migrations/2015_07_21_122022_add_expected_checkin_date_to_asset_logs.php index 40826af579..cb8f6b3aaf 100644 --- a/database/migrations/2015_07_21_122022_add_expected_checkin_date_to_asset_logs.php +++ b/database/migrations/2015_07_21_122022_add_expected_checkin_date_to_asset_logs.php @@ -1,37 +1,31 @@ date('expected_checkin')->nullable()->default(NULL); +class AddExpectedCheckinDateToAssetLogs extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::table('asset_logs', function ($table) { + $table->date('expected_checkin')->nullable()->default(null); }); + } - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - - Schema::table('asset_logs', function(Blueprint $table) - { - $table->dropColumn('expected_checkin'); - }); - - } - + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('asset_logs', function (Blueprint $table) { + $table->dropColumn('expected_checkin'); + }); + } } diff --git a/database/migrations/2015_07_24_093845_add_checkin_email_to_category_table.php b/database/migrations/2015_07_24_093845_add_checkin_email_to_category_table.php index a2009e4dea..00e6aaa3d1 100644 --- a/database/migrations/2015_07_24_093845_add_checkin_email_to_category_table.php +++ b/database/migrations/2015_07_24_093845_add_checkin_email_to_category_table.php @@ -1,32 +1,31 @@ boolean('checkin_email')->default(0); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::table('categories', function ($table) { - $table->dropColumn('checkin_email'); - }); - } +class AddCheckinEmailToCategoryTable extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::table('categories', function ($table) { + $table->boolean('checkin_email')->default(0); + }); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('categories', function ($table) { + $table->dropColumn('checkin_email'); + }); + } } diff --git a/database/migrations/2015_07_25_055415_remove_email_unique_constraint.php b/database/migrations/2015_07_25_055415_remove_email_unique_constraint.php index 06c84a9df3..48f01645ed 100644 --- a/database/migrations/2015_07_25_055415_remove_email_unique_constraint.php +++ b/database/migrations/2015_07_25_055415_remove_email_unique_constraint.php @@ -1,31 +1,29 @@ dropUnique('users_email_unique'); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - // - } +class RemoveEmailUniqueConstraint extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::table('users', function (Blueprint $table) { + $table->dropUnique('users_email_unique'); + }); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } } diff --git a/database/migrations/2015_07_29_230054_add_thread_id_to_asset_logs_table.php b/database/migrations/2015_07_29_230054_add_thread_id_to_asset_logs_table.php index 4a0e45bbef..eefc283e3f 100644 --- a/database/migrations/2015_07_29_230054_add_thread_id_to_asset_logs_table.php +++ b/database/migrations/2015_07_29_230054_add_thread_id_to_asset_logs_table.php @@ -1,12 +1,11 @@ dropIndex( 'thread_id' ); - $table->dropColumn( 'thread_id' ); - } ); + Schema::table('asset_logs', function (Blueprint $table) { + $table->dropIndex('thread_id'); + $table->dropColumn('thread_id'); + }); } /** @@ -125,9 +120,8 @@ * @author Vincent Sposato * @version v1.0 */ - protected function hasAssetChanged( $assetLog ) + protected function hasAssetChanged($assetLog) { - return $assetLog->asset_id !== $this->currentAssetId; } @@ -139,11 +133,10 @@ * @author Vincent Sposato * @version v1.0 */ - protected function resetCurrentAssetInformation( $assetLog ) + protected function resetCurrentAssetInformation($assetLog) { - - $this->currentAssetId = $assetLog->asset_id; - $this->currentAssetLogId = $assetLog->id; + $this->currentAssetId = $assetLog->asset_id; + $this->currentAssetLogId = $assetLog->id; $this->startOfCurrentThread = true; } @@ -156,10 +149,9 @@ * @author Vincent Sposato * @version v1.0 */ - protected function hasReachedEndOfChain( $assetLog ) + protected function hasReachedEndOfChain($assetLog) { - - return in_array( $assetLog->action_type, $this->threadFinalActionTypes ) + return in_array($assetLog->action_type, $this->threadFinalActionTypes) && $this->startOfCurrentThread == false; } @@ -170,10 +162,9 @@ */ protected function clearCurrentAssetInformation() { - $this->startOfCurrentThread = true; - $this->currentAssetLogId = null; - $this->currentAssetId = null; + $this->currentAssetLogId = null; + $this->currentAssetId = null; } /** @@ -184,16 +175,15 @@ * @author Vincent Sposato * @version v1.0 */ - protected function updateAssetLogWithThreadInformation( $assetLog ) + protected function updateAssetLogWithThreadInformation($assetLog) { - - $loadedAssetLog = Actionlog::find( $assetLog->id ); + $loadedAssetLog = Actionlog::find($assetLog->id); $loadedAssetLog->thread_id = $this->currentAssetLogId; $loadedAssetLog->update(); - unset( $loadedAssetLog ); + unset($loadedAssetLog); } /** @@ -205,11 +195,9 @@ * @author Vincent Sposato * @version v1.0 */ - protected function hasBegunNewChain( $assetLog ) + protected function hasBegunNewChain($assetLog) { - - return in_array( $assetLog->action_type, $this->threadStartingActionTypes ) + return in_array($assetLog->action_type, $this->threadStartingActionTypes) && $this->startOfCurrentThread == true; } - } diff --git a/database/migrations/2015_07_31_015430_add_accepted_to_assets.php b/database/migrations/2015_07_31_015430_add_accepted_to_assets.php index 8f07b0951c..db964b5456 100644 --- a/database/migrations/2015_07_31_015430_add_accepted_to_assets.php +++ b/database/migrations/2015_07_31_015430_add_accepted_to_assets.php @@ -1,34 +1,31 @@ string('accepted')->nullable(); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::table('assets', function(Blueprint $table) - { - $table->dropColumn('accepted'); - }); - } +class AddAcceptedToAssets extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::table('assets', function (Blueprint $table) { + $table->string('accepted')->nullable(); + }); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('assets', function (Blueprint $table) { + $table->dropColumn('accepted'); + }); + } } diff --git a/database/migrations/2015_09_09_195301_add_custom_css_to_settings.php b/database/migrations/2015_09_09_195301_add_custom_css_to_settings.php index 0baa89bb08..8acb55757b 100644 --- a/database/migrations/2015_09_09_195301_add_custom_css_to_settings.php +++ b/database/migrations/2015_09_09_195301_add_custom_css_to_settings.php @@ -1,34 +1,31 @@ text('custom_css')->nullable()->default(NULL); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::table('settings', function(Blueprint $table) - { - $table->dropColumn('custom_css'); - }); - } +class AddCustomCssToSettings extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::table('settings', function (Blueprint $table) { + $table->text('custom_css')->nullable()->default(null); + }); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('settings', function (Blueprint $table) { + $table->dropColumn('custom_css'); + }); + } } diff --git a/database/migrations/2015_09_21_235926_create_custom_field_custom_fieldset.php b/database/migrations/2015_09_21_235926_create_custom_field_custom_fieldset.php index acf920ce73..6e56769d5c 100644 --- a/database/migrations/2015_09_21_235926_create_custom_field_custom_fieldset.php +++ b/database/migrations/2015_09_21_235926_create_custom_field_custom_fieldset.php @@ -1,36 +1,34 @@ integer('custom_field_id'); + $table->integer('custom_fieldset_id'); - /** - * Run the migrations. - * - * @return void - */ - public function up() - { - Schema::create('custom_field_custom_fieldset', function(Blueprint $table) - { - $table->integer('custom_field_id'); - $table->integer('custom_fieldset_id'); - - $table->integer('order'); - $table->boolean('required'); - $table->engine = 'InnoDB'; - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::drop('custom_field_custom_fieldset'); - } + $table->integer('order'); + $table->boolean('required'); + $table->engine = 'InnoDB'; + }); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('custom_field_custom_fieldset'); + } } diff --git a/database/migrations/2015_09_22_000104_create_custom_fieldsets.php b/database/migrations/2015_09_22_000104_create_custom_fieldsets.php index 436a579692..5265404d15 100644 --- a/database/migrations/2015_09_22_000104_create_custom_fieldsets.php +++ b/database/migrations/2015_09_22_000104_create_custom_fieldsets.php @@ -1,34 +1,32 @@ increments('id'); - $table->string('name'); - $table->engine = 'InnoDB'; - // - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::drop('custom_fieldsets'); - } +class CreateCustomFieldsets extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::create('custom_fieldsets', function (Blueprint $table) { + $table->increments('id'); + $table->string('name'); + $table->engine = 'InnoDB'; + // + }); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('custom_fieldsets'); + } } diff --git a/database/migrations/2015_09_22_003321_add_fieldset_id_to_assets.php b/database/migrations/2015_09_22_003321_add_fieldset_id_to_assets.php index 7771b30e0e..721271250c 100644 --- a/database/migrations/2015_09_22_003321_add_fieldset_id_to_assets.php +++ b/database/migrations/2015_09_22_003321_add_fieldset_id_to_assets.php @@ -1,33 +1,31 @@ integer('fieldset_id')->nullable(); - }); - - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::table('models',function (Blueprint $table) { - $table->dropColumn('fieldset_id'); - }); - } +class AddFieldsetIdToAssets extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::table('models', function (Blueprint $table) { + $table->integer('fieldset_id')->nullable(); + }); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('models', function (Blueprint $table) { + $table->dropColumn('fieldset_id'); + }); + } } diff --git a/database/migrations/2015_09_22_003413_migrate_mac_address.php b/database/migrations/2015_09_22_003413_migrate_mac_address.php index 6345773ca1..516b5c2ec7 100644 --- a/database/migrations/2015_09_22_003413_migrate_mac_address.php +++ b/database/migrations/2015_09_22_003413_migrate_mac_address.php @@ -1,61 +1,60 @@ getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string'); - /** - * Run the migrations. - * - * @return void - */ - public function up() - { - DB::getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string'); + $f2 = new \App\Models\CustomFieldset(['name' => 'Asset with MAC Address']); + $f2->timestamps = false; //when this model was first created, it had no timestamps. But later on it gets them. + if (! $f2->save()) { + throw new Exception("couldn't save customfieldset"); + } + $macid = DB::table('custom_fields')->insertGetId([ + 'name' => 'MAC Address', + 'format' => \App\Models\CustomField::PREDEFINED_FORMATS['MAC'], + 'element'=>'text', ]); + if (! $macid) { + throw new Exception("Can't save MAC Custom field: $macid"); + } - $f2=new \App\Models\CustomFieldset(['name' => "Asset with MAC Address"]); - $f2->timestamps=false; //when this model was first created, it had no timestamps. But later on it gets them. - if(!$f2->save()) { - throw new Exception("couldn't save customfieldset"); - } - $macid=DB::table('custom_fields')->insertGetId([ - 'name' => "MAC Address", - 'format' => \App\Models\CustomField::PREDEFINED_FORMATS['MAC'], - 'element'=>'text']); - if(!$macid) { - throw new Exception("Can't save MAC Custom field: $macid"); - } + $f2->fields()->attach($macid, ['required' => false, 'order' => 1]); + \App\Models\AssetModel::where(['show_mac_address' => true])->update(['fieldset_id'=>$f2->id]); - $f2->fields()->attach($macid,['required' => false, 'order' => 1]); - \App\Models\AssetModel::where(["show_mac_address" => true])->update(["fieldset_id"=>$f2->id]); + Schema::table('assets', function (Blueprint $table) { + $table->renameColumn('mac_address', '_snipeit_mac_address'); + }); - Schema::table('assets', function (Blueprint $table) { - $table->renameColumn('mac_address', '_snipeit_mac_address'); - }); + // DB::statement("ALTER TABLE assets CHANGE mac_address _snipeit_mac_address varchar(255)"); - // DB::statement("ALTER TABLE assets CHANGE mac_address _snipeit_mac_address varchar(255)"); - - $ans=Schema::table("models",function (Blueprint $table) { - $table->renameColumn('show_mac_address','deprecated_mac_address'); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - // - $f=\App\Models\CustomFieldset::where(["name" => "Asset with MAC Address"])->first(); - $f->fields()->delete(); - $f->delete(); - Schema::table("models",function(Blueprint $table) { - $table->renameColumn("deprecated_mac_address","show_mac_address"); - }); - DB::statement("ALTER TABLE assets CHANGE _snipeit_mac_address mac_address varchar(255)"); - } + $ans = Schema::table('models', function (Blueprint $table) { + $table->renameColumn('show_mac_address', 'deprecated_mac_address'); + }); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + $f = \App\Models\CustomFieldset::where(['name' => 'Asset with MAC Address'])->first(); + $f->fields()->delete(); + $f->delete(); + Schema::table('models', function (Blueprint $table) { + $table->renameColumn('deprecated_mac_address', 'show_mac_address'); + }); + DB::statement('ALTER TABLE assets CHANGE _snipeit_mac_address mac_address varchar(255)'); + } } diff --git a/database/migrations/2015_09_28_003314_fix_default_purchase_order.php b/database/migrations/2015_09_28_003314_fix_default_purchase_order.php index 5e9f14c1a6..749df3c821 100644 --- a/database/migrations/2015_09_28_003314_fix_default_purchase_order.php +++ b/database/migrations/2015_09_28_003314_fix_default_purchase_order.php @@ -1,33 +1,32 @@ string('purchase_order')->nullable()->change(); + }); - /** - * Run the migrations. - * - * @return void - */ - public function up() - { - Schema::table('licenses', function (Blueprint $table) { - $table->string('purchase_order')->nullable()->change(); - }); - - // DB::statement('ALTER TABLE `'.DB::getTablePrefix().'licenses` MODIFY `purchase_order` varchar(255) DEFAULT NULL;'); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - // - // DB::statement('ALTER TABLE `'.DB::getTablePrefix().'licenses` MODIFY `purchase_order` varchar(255);'); - } + // DB::statement('ALTER TABLE `'.DB::getTablePrefix().'licenses` MODIFY `purchase_order` varchar(255) DEFAULT NULL;'); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + // DB::statement('ALTER TABLE `'.DB::getTablePrefix().'licenses` MODIFY `purchase_order` varchar(255);'); + } } diff --git a/database/migrations/2015_10_01_024551_add_accessory_consumable_price_info.php b/database/migrations/2015_10_01_024551_add_accessory_consumable_price_info.php index 7e3535c71a..e9192fd56e 100644 --- a/database/migrations/2015_10_01_024551_add_accessory_consumable_price_info.php +++ b/database/migrations/2015_10_01_024551_add_accessory_consumable_price_info.php @@ -1,48 +1,47 @@ date('purchase_date')->nullable(); +class AddAccessoryConsumablePriceInfo extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::table('accessories', function ($table) { + $table->date('purchase_date')->nullable(); $table->decimal('purchase_cost', 13, 4)->nullable(); $table->string('order_number')->nullable(); - }); + }); - Schema::table('consumables', function ($table) { - $table->date('purchase_date')->nullable(); + Schema::table('consumables', function ($table) { + $table->date('purchase_date')->nullable(); $table->decimal('purchase_cost', 13, 4)->nullable(); $table->string('order_number')->nullable(); - }); - } + }); + } - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::table('accessories', function ($table) { - $table->dropColumn('purchase_date'); + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('accessories', function ($table) { + $table->dropColumn('purchase_date'); $table->dropColumn('purchase_cost'); $table->dropColumn('order_number'); - }); + }); - Schema::table('consumables', function ($table) { - $table->dropColumn('purchase_date'); + Schema::table('consumables', function ($table) { + $table->dropColumn('purchase_date'); $table->dropColumn('purchase_cost'); $table->dropColumn('order_number'); - }); - } - + }); + } } diff --git a/database/migrations/2015_10_12_192706_add_brand_to_settings.php b/database/migrations/2015_10_12_192706_add_brand_to_settings.php index eae3acd849..109a982a5a 100644 --- a/database/migrations/2015_10_12_192706_add_brand_to_settings.php +++ b/database/migrations/2015_10_12_192706_add_brand_to_settings.php @@ -1,34 +1,31 @@ tinyInteger('brand')->default(1); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::table('settings', function(Blueprint $table) - { - $table->dropColumn('brand'); - }); - } +class AddBrandToSettings extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::table('settings', function (Blueprint $table) { + $table->tinyInteger('brand')->default(1); + }); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('settings', function (Blueprint $table) { + $table->dropColumn('brand'); + }); + } } diff --git a/database/migrations/2015_10_22_003314_fix_defaults_accessories.php b/database/migrations/2015_10_22_003314_fix_defaults_accessories.php index 9ac9e824d1..da7dcfbabe 100644 --- a/database/migrations/2015_10_22_003314_fix_defaults_accessories.php +++ b/database/migrations/2015_10_22_003314_fix_defaults_accessories.php @@ -1,41 +1,40 @@ string('order_number')->nullable()->change(); + }); - /** - * Run the migrations. - * - * @return void - */ - public function up() - { - Schema::table('accessories', function (Blueprint $table) { - $table->string('order_number')->nullable()->change(); - }); - - Schema::table('consumables', function (Blueprint $table) { - $table->string('order_number')->nullable()->change(); - }); + Schema::table('consumables', function (Blueprint $table) { + $table->string('order_number')->nullable()->change(); + }); + // + // DB::statement('ALTER TABLE `'.DB::getTablePrefix().'accessories` MODIFY `order_number` varchar(255) DEFAULT NULL;'); // - // DB::statement('ALTER TABLE `'.DB::getTablePrefix().'accessories` MODIFY `order_number` varchar(255) DEFAULT NULL;'); - // - // DB::statement('ALTER TABLE `'.DB::getTablePrefix().'consumables` MODIFY `order_number` varchar(255) DEFAULT NULL;'); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - // - DB::statement('ALTER TABLE `'.DB::getTablePrefix().'accessories` MODIFY `order_number` varchar(255);'); - DB::statement('ALTER TABLE `'.DB::getTablePrefix().'consumables` MODIFY `order_number` varchar(255);'); - } + // DB::statement('ALTER TABLE `'.DB::getTablePrefix().'consumables` MODIFY `order_number` varchar(255) DEFAULT NULL;'); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + DB::statement('ALTER TABLE `'.DB::getTablePrefix().'accessories` MODIFY `order_number` varchar(255);'); + DB::statement('ALTER TABLE `'.DB::getTablePrefix().'consumables` MODIFY `order_number` varchar(255);'); + } } diff --git a/database/migrations/2015_10_23_182625_add_checkout_time_and_expected_checkout_date_to_assets.php b/database/migrations/2015_10_23_182625_add_checkout_time_and_expected_checkout_date_to_assets.php index ac220f5984..87ecf062d8 100644 --- a/database/migrations/2015_10_23_182625_add_checkout_time_and_expected_checkout_date_to_assets.php +++ b/database/migrations/2015_10_23_182625_add_checkout_time_and_expected_checkout_date_to_assets.php @@ -1,40 +1,37 @@ dateTime('last_checkout')->nullable(); - $table->date('expected_checkin')->nullable(); - }); - DB::statement("UPDATE ".DB::getTablePrefix()."assets SET last_checkout=(SELECT MAX(created_at) FROM ".DB::getTablePrefix()."asset_logs WHERE ".DB::getTablePrefix()."asset_logs.id=".DB::getTablePrefix()."assets.id AND action_type='checkout') WHERE assigned_to IS NOT NULL"); - DB::statement("UPDATE ".DB::getTablePrefix()."assets SET expected_checkin=(SELECT expected_checkin FROM ".DB::getTablePrefix()."asset_logs WHERE ".DB::getTablePrefix()."asset_logs.id=".DB::getTablePrefix()."assets.id AND action_type='checkout' ORDER BY id DESC limit 1) WHERE assigned_to IS NOT NULL"); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::table('assets', function(Blueprint $table) - { - // - $table->dropColumn('last_checkout'); - $table->dropColumn('expected_checkin'); - }); - } +class AddCheckoutTimeAndExpectedCheckoutDateToAssets extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::table('assets', function (Blueprint $table) { + // + $answer = $table->dateTime('last_checkout')->nullable(); + $table->date('expected_checkin')->nullable(); + }); + DB::statement('UPDATE '.DB::getTablePrefix().'assets SET last_checkout=(SELECT MAX(created_at) FROM '.DB::getTablePrefix().'asset_logs WHERE '.DB::getTablePrefix().'asset_logs.id='.DB::getTablePrefix()."assets.id AND action_type='checkout') WHERE assigned_to IS NOT NULL"); + DB::statement('UPDATE '.DB::getTablePrefix().'assets SET expected_checkin=(SELECT expected_checkin FROM '.DB::getTablePrefix().'asset_logs WHERE '.DB::getTablePrefix().'asset_logs.id='.DB::getTablePrefix()."assets.id AND action_type='checkout' ORDER BY id DESC limit 1) WHERE assigned_to IS NOT NULL"); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('assets', function (Blueprint $table) { + // + $table->dropColumn('last_checkout'); + $table->dropColumn('expected_checkin'); + }); + } } diff --git a/database/migrations/2015_11_05_061015_create_companies_table.php b/database/migrations/2015_11_05_061015_create_companies_table.php index d0bc86cbe6..4c7c736f5e 100644 --- a/database/migrations/2015_11_05_061015_create_companies_table.php +++ b/database/migrations/2015_11_05_061015_create_companies_table.php @@ -1,10 +1,10 @@ increments('id'); $table->string('name')->unique(); $table->timestamps(); diff --git a/database/migrations/2015_11_05_061115_add_company_id_to_consumables_table.php b/database/migrations/2015_11_05_061115_add_company_id_to_consumables_table.php index 930b47e3c9..afcb9e1c0f 100644 --- a/database/migrations/2015_11_05_061115_add_company_id_to_consumables_table.php +++ b/database/migrations/2015_11_05_061115_add_company_id_to_consumables_table.php @@ -1,10 +1,10 @@ integer('company_id')->unsigned()->nullable(); //$table->foreign('company_id')->references('id')->on('companies'); }); @@ -26,8 +25,7 @@ class AddCompanyIdToConsumablesTable extends Migration { */ public function down() { - Schema::table('consumables', function(Blueprint $table) - { + Schema::table('consumables', function (Blueprint $table) { //$table->dropForeign('consumables_company_id_foreign'); $table->dropColumn('company_id'); }); diff --git a/database/migrations/2015_11_05_183749_image.php b/database/migrations/2015_11_05_183749_image.php index 8d5749a43a..0582b852aa 100644 --- a/database/migrations/2015_11_05_183749_image.php +++ b/database/migrations/2015_11_05_183749_image.php @@ -1,34 +1,32 @@ text('image')->after('notes')->nullable()->default(NULL); - // - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::table('assets', function ($table) { - $table->dropColumn('image'); - }); - } +class Image extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::table('assets', function (Blueprint $table) { + $table->text('image')->after('notes')->nullable()->default(null); + // + }); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('assets', function ($table) { + $table->dropColumn('image'); + }); + } } diff --git a/database/migrations/2015_11_06_092038_add_company_id_to_accessories_table.php b/database/migrations/2015_11_06_092038_add_company_id_to_accessories_table.php index cee633bc3d..e51cb797ef 100644 --- a/database/migrations/2015_11_06_092038_add_company_id_to_accessories_table.php +++ b/database/migrations/2015_11_06_092038_add_company_id_to_accessories_table.php @@ -1,10 +1,10 @@ integer('company_id')->unsigned()->nullable(); //$table->foreign('company_id')->references('id')->on('companies'); }); @@ -26,8 +25,7 @@ class AddCompanyIdToAccessoriesTable extends Migration { */ public function down() { - Schema::table('accessories', function(Blueprint $table) - { + Schema::table('accessories', function (Blueprint $table) { //$table->dropForeign('accessories_company_id_foreign'); $table->dropColumn('company_id'); }); diff --git a/database/migrations/2015_11_06_100045_add_company_id_to_users_table.php b/database/migrations/2015_11_06_100045_add_company_id_to_users_table.php index aef83fe265..37e8ce12ee 100644 --- a/database/migrations/2015_11_06_100045_add_company_id_to_users_table.php +++ b/database/migrations/2015_11_06_100045_add_company_id_to_users_table.php @@ -1,10 +1,10 @@ integer('company_id')->unsigned()->nullable(); //$table->foreign('company_id')->references('id')->on('companies'); }); @@ -26,8 +25,7 @@ class AddCompanyIdToUsersTable extends Migration { */ public function down() { - Schema::table('users', function(Blueprint $table) - { + Schema::table('users', function (Blueprint $table) { //$table->dropForeign('users_company_id_foreign'); $table->dropColumn('company_id'); }); diff --git a/database/migrations/2015_11_06_134742_add_company_id_to_licenses_table.php b/database/migrations/2015_11_06_134742_add_company_id_to_licenses_table.php index 4f0756cf2c..2d4a5ba9df 100644 --- a/database/migrations/2015_11_06_134742_add_company_id_to_licenses_table.php +++ b/database/migrations/2015_11_06_134742_add_company_id_to_licenses_table.php @@ -1,10 +1,10 @@ integer('company_id')->unsigned()->nullable(); //$table->foreign('company_id')->references('id')->on('companies'); }); @@ -26,8 +25,7 @@ class AddCompanyIdToLicensesTable extends Migration { */ public function down() { - Schema::table('licenses', function(Blueprint $table) - { + Schema::table('licenses', function (Blueprint $table) { //$table->dropForeign('licenses_company_id_foreign'); $table->dropColumn('company_id'); }); diff --git a/database/migrations/2015_11_08_035832_add_company_id_to_assets_table.php b/database/migrations/2015_11_08_035832_add_company_id_to_assets_table.php index 010ec528e7..9aec3920eb 100644 --- a/database/migrations/2015_11_08_035832_add_company_id_to_assets_table.php +++ b/database/migrations/2015_11_08_035832_add_company_id_to_assets_table.php @@ -1,10 +1,10 @@ integer('company_id')->unsigned()->nullable(); //$table->foreign('company_id')->references('id')->on('companies'); }); @@ -26,8 +25,7 @@ class AddCompanyIdToAssetsTable extends Migration { */ public function down() { - Schema::table('assets', function(Blueprint $table) - { + Schema::table('assets', function (Blueprint $table) { // $table->dropForeign('assets_company_id_foreign'); $table->dropColumn('company_id'); }); diff --git a/database/migrations/2015_11_08_222305_add_ldap_fields_to_settings.php b/database/migrations/2015_11_08_222305_add_ldap_fields_to_settings.php index a293b43525..d52191f3d0 100644 --- a/database/migrations/2015_11_08_222305_add_ldap_fields_to_settings.php +++ b/database/migrations/2015_11_08_222305_add_ldap_fields_to_settings.php @@ -1,60 +1,57 @@ string('ldap_enabled')->nullable()->default(NULL); - $table->string('ldap_server')->nullable()->default(NULL); - $table->string('ldap_uname')->nullable()->default(NULL); - $table->longText('ldap_pword')->nullable()->default(NULL); - $table->string('ldap_basedn')->nullable()->default(NULL); - $table->string('ldap_filter')->nullable()->default('cn=*'); - $table->string('ldap_username_field')->nullable()->default('samaccountname'); - $table->string('ldap_lname_field')->nullable()->default('sn'); - $table->string('ldap_fname_field')->nullable()->default('givenname'); - $table->string('ldap_auth_filter_query')->nullable()->default('uid=samaccountname'); - $table->integer('ldap_version')->nullable()->default(3); - $table->string('ldap_active_flag')->nullable()->default(NULL); - $table->string('ldap_emp_num')->nullable()->default(NULL); - $table->string('ldap_email')->nullable()->default(NULL); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::table('settings', function(Blueprint $table) - { - $table->dropColumn('ldap_enabled'); - $table->dropColumn('ldap_server'); - $table->dropColumn('ldap_uname'); - $table->dropColumn('ldap_pword'); - $table->dropColumn('ldap_basedn'); - $table->dropColumn('ldap_filter'); - $table->dropColumn('ldap_username_field'); - $table->dropColumn('ldap_lname_field'); - $table->dropColumn('ldap_fname_field'); - $table->dropColumn('ldap_auth_filter_query'); - $table->dropColumn('ldap_version'); - $table->dropColumn('ldap_active_flag'); - $table->dropColumn('ldap_emp_num'); - $table->dropColumn('ldap_email'); - }); - } +class AddLdapFieldsToSettings extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::table('settings', function (Blueprint $table) { + $table->string('ldap_enabled')->nullable()->default(null); + $table->string('ldap_server')->nullable()->default(null); + $table->string('ldap_uname')->nullable()->default(null); + $table->longText('ldap_pword')->nullable()->default(null); + $table->string('ldap_basedn')->nullable()->default(null); + $table->string('ldap_filter')->nullable()->default('cn=*'); + $table->string('ldap_username_field')->nullable()->default('samaccountname'); + $table->string('ldap_lname_field')->nullable()->default('sn'); + $table->string('ldap_fname_field')->nullable()->default('givenname'); + $table->string('ldap_auth_filter_query')->nullable()->default('uid=samaccountname'); + $table->integer('ldap_version')->nullable()->default(3); + $table->string('ldap_active_flag')->nullable()->default(null); + $table->string('ldap_emp_num')->nullable()->default(null); + $table->string('ldap_email')->nullable()->default(null); + }); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('settings', function (Blueprint $table) { + $table->dropColumn('ldap_enabled'); + $table->dropColumn('ldap_server'); + $table->dropColumn('ldap_uname'); + $table->dropColumn('ldap_pword'); + $table->dropColumn('ldap_basedn'); + $table->dropColumn('ldap_filter'); + $table->dropColumn('ldap_username_field'); + $table->dropColumn('ldap_lname_field'); + $table->dropColumn('ldap_fname_field'); + $table->dropColumn('ldap_auth_filter_query'); + $table->dropColumn('ldap_version'); + $table->dropColumn('ldap_active_flag'); + $table->dropColumn('ldap_emp_num'); + $table->dropColumn('ldap_email'); + }); + } } diff --git a/database/migrations/2015_11_15_151803_add_full_multiple_companies_support_to_settings_table.php b/database/migrations/2015_11_15_151803_add_full_multiple_companies_support_to_settings_table.php index 9cf8b163b0..b15db47da5 100644 --- a/database/migrations/2015_11_15_151803_add_full_multiple_companies_support_to_settings_table.php +++ b/database/migrations/2015_11_15_151803_add_full_multiple_companies_support_to_settings_table.php @@ -1,10 +1,10 @@ boolean('full_multiple_companies_support')->default(FALSE); + Schema::table('settings', function (Blueprint $table) { + $table->boolean('full_multiple_companies_support')->default(false); }); } @@ -25,10 +24,8 @@ class AddFullMultipleCompaniesSupportToSettingsTable extends Migration { */ public function down() { - Schema::table('settings', function(Blueprint $table) - { + Schema::table('settings', function (Blueprint $table) { $table->dropColumn('full_multiple_companies_support'); }); } - } diff --git a/database/migrations/2015_11_26_195528_import_ldap_settings.php b/database/migrations/2015_11_26_195528_import_ldap_settings.php index 3cd3826901..eb66bf6f68 100644 --- a/database/migrations/2015_11_26_195528_import_ldap_settings.php +++ b/database/migrations/2015_11_26_195528_import_ldap_settings.php @@ -1,77 +1,68 @@ ldap_server)) { + $settings->ldap_enabled = 1; + $settings->ldap_server = config('ldap.url'); + $settings->ldap_uname = config('ldap.username'); + $settings->ldap_pword = Crypt::encrypt(config('ldap.password')); + $settings->ldap_basedn = config('ldap.basedn'); + $settings->ldap_filter = config('ldap.filter'); + $settings->ldap_username_field = config('ldap.result.username'); + $settings->ldap_lname_field = config('ldap.result.last.name'); + $settings->ldap_fname_field = config('ldap.result.first.name'); + $settings->ldap_auth_filter_query = config('ldap.authentication.filter.query'); + $settings->ldap_version = config('ldap.version'); + $settings->ldap_active_flag = config('ldap.result.active.flag'); + $settings->ldap_emp_num = config('ldap.result.emp.num'); + $settings->ldap_email = config('ldap.result.email'); - // Only update the settings record if there IS an LDAP Config - // AND the Settings table doesn't already have LDAP settings in it + // Save the imported settings + if ($settings->save()) { + echo 'LDAP settings imported into database'."\n"; - if ((config('ldap.url')) && ($settings) && ($settings->ldap_server)) { - - $settings->ldap_enabled = 1; - $settings->ldap_server = config('ldap.url'); - $settings->ldap_uname = config('ldap.username'); - $settings->ldap_pword = Crypt::encrypt(config('ldap.password')); - $settings->ldap_basedn = config('ldap.basedn'); - $settings->ldap_filter = config('ldap.filter'); - $settings->ldap_username_field = config('ldap.result.username'); - $settings->ldap_lname_field = config('ldap.result.last.name'); - $settings->ldap_fname_field = config('ldap.result.first.name'); - $settings->ldap_auth_filter_query = config('ldap.authentication.filter.query'); - $settings->ldap_version = config('ldap.version'); - $settings->ldap_active_flag = config('ldap.result.active.flag'); - $settings->ldap_emp_num = config('ldap.result.emp.num'); - $settings->ldap_email = config('ldap.result.email'); - - // Save the imported settings - if ($settings->save()) { - echo 'LDAP settings imported into database'."\n"; - - // Copy the old LDAP config file to prevent any future confusion - if (@copy(app_path().'/config/'.app()->environment().'/ldap.php', app_path().'/config/'.app()->environment().'/deprecated.ldap.php')) { - - if (@unlink(app_path().'/config/'.app()->environment().'/ldap.php')) { - echo 'Original LDAP file archived to '.app_path().'/config/'.app()->environment().'/deprecated.ldap.php'."\n"; - } else { - echo 'Could not archive LDAP config file'."\n"; + // Copy the old LDAP config file to prevent any future confusion + if (@copy(app_path().'/config/'.app()->environment().'/ldap.php', app_path().'/config/'.app()->environment().'/deprecated.ldap.php')) { + if (@unlink(app_path().'/config/'.app()->environment().'/ldap.php')) { + echo 'Original LDAP file archived to '.app_path().'/config/'.app()->environment().'/deprecated.ldap.php'."\n"; + } else { + echo 'Could not archive LDAP config file'."\n"; + } + } else { + echo 'Could not archive LDAP config file'."\n"; + } } - - } else { - echo 'Could not archive LDAP config file'."\n"; } - - } - } - } - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - - if (@copy(app_path().'/config/'.app()->environment().'/deprecated.ldap.php', app_path().'/config/'.app()->environment().'/ldap.php')) { - echo 'Un-archived LDAP config file'."\n"; - @unlink(app_path().'/config/'.app()->environment().'/deprecated.ldap.php'); - - } else { - echo 'Could not un-archive LDAP config file. Manually rename it instead.'."\n"; + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + if (@copy(app_path().'/config/'.app()->environment().'/deprecated.ldap.php', app_path().'/config/'.app()->environment().'/ldap.php')) { + echo 'Un-archived LDAP config file'."\n"; + @unlink(app_path().'/config/'.app()->environment().'/deprecated.ldap.php'); + } else { + echo 'Could not un-archive LDAP config file. Manually rename it instead.'."\n"; + } } - } - } diff --git a/database/migrations/2015_11_30_191504_remove_fk_company_id.php b/database/migrations/2015_11_30_191504_remove_fk_company_id.php index bd0a9bda06..37ec4a1833 100644 --- a/database/migrations/2015_11_30_191504_remove_fk_company_id.php +++ b/database/migrations/2015_11_30_191504_remove_fk_company_id.php @@ -1,18 +1,18 @@ dropForeign('users_company_id_foreign'); @@ -37,18 +37,15 @@ class RemoveFkCompanyId extends Migration { // { // $table->dropForeign('licenses_company_id_foreign'); // }); + } - - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - // - } - + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } } diff --git a/database/migrations/2015_12_21_193006_add_ldap_server_cert_ignore_to_settings_table.php b/database/migrations/2015_12_21_193006_add_ldap_server_cert_ignore_to_settings_table.php index 0e22c78683..ce0fad9e7a 100644 --- a/database/migrations/2015_12_21_193006_add_ldap_server_cert_ignore_to_settings_table.php +++ b/database/migrations/2015_12_21_193006_add_ldap_server_cert_ignore_to_settings_table.php @@ -1,34 +1,31 @@ boolean('ldap_server_cert_ignore')->default(FALSE); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::table('settings', function(Blueprint $table) - { - $table->dropColumn('ldap_server_cert_ignore'); - }); - } +class AddLdapServerCertIgnoreToSettingsTable extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::table('settings', function (Blueprint $table) { + $table->boolean('ldap_server_cert_ignore')->default(false); + }); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('settings', function (Blueprint $table) { + $table->dropColumn('ldap_server_cert_ignore'); + }); + } } diff --git a/database/migrations/2015_12_30_233509_add_timestamp_and_userId_to_custom_fields.php b/database/migrations/2015_12_30_233509_add_timestamp_and_userId_to_custom_fields.php index 9b7854615a..52586b46a4 100644 --- a/database/migrations/2015_12_30_233509_add_timestamp_and_userId_to_custom_fields.php +++ b/database/migrations/2015_12_30_233509_add_timestamp_and_userId_to_custom_fields.php @@ -1,34 +1,31 @@ integer("user_id")->nullable(); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::table('custom_fields', function(Blueprint $table) - { - $table->dropColumn("user_id"); - }); - } +class AddTimestampAndUserIdToCustomFields extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::table('custom_fields', function (Blueprint $table) { + $table->integer('user_id')->nullable(); + }); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('custom_fields', function (Blueprint $table) { + $table->dropColumn('user_id'); + }); + } } diff --git a/database/migrations/2015_12_30_233658_add_timestamp_and_userId_to_custom_fieldsets.php b/database/migrations/2015_12_30_233658_add_timestamp_and_userId_to_custom_fieldsets.php index 1d2ba523ee..a0c475fac5 100644 --- a/database/migrations/2015_12_30_233658_add_timestamp_and_userId_to_custom_fieldsets.php +++ b/database/migrations/2015_12_30_233658_add_timestamp_and_userId_to_custom_fieldsets.php @@ -1,38 +1,34 @@ timestamps(); - $table->integer("user_id")->nullable(); - }); - - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::table('custom_fieldsets', function(Blueprint $table) - { - $table->dropTimestamps(); - $table->dropColumn("user_id"); - }); - } +class AddTimestampAndUserIdToCustomFieldsets extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + // + Schema::table('custom_fieldsets', function (Blueprint $table) { + $table->timestamps(); + $table->integer('user_id')->nullable(); + }); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('custom_fieldsets', function (Blueprint $table) { + $table->dropTimestamps(); + $table->dropColumn('user_id'); + }); + } } diff --git a/database/migrations/2016_01_28_041048_add_notes_to_models.php b/database/migrations/2016_01_28_041048_add_notes_to_models.php index de922da180..abbc42dae1 100644 --- a/database/migrations/2016_01_28_041048_add_notes_to_models.php +++ b/database/migrations/2016_01_28_041048_add_notes_to_models.php @@ -1,32 +1,31 @@ text('note')->nullable()->default(NULL); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::table('models', function ($table) { - $table->dropColumn('note'); - }); - } +class AddNotesToModels extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::table('models', function ($table) { + $table->text('note')->nullable()->default(null); + }); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('models', function ($table) { + $table->dropColumn('note'); + }); + } } diff --git a/database/migrations/2016_02_19_070119_add_remember_token_to_users_table.php b/database/migrations/2016_02_19_070119_add_remember_token_to_users_table.php index 6270018e53..06531a9584 100644 --- a/database/migrations/2016_02_19_070119_add_remember_token_to_users_table.php +++ b/database/migrations/2016_02_19_070119_add_remember_token_to_users_table.php @@ -1,7 +1,7 @@ text('remember_token')->nullable()->default(null); }); diff --git a/database/migrations/2016_02_19_073625_create_password_resets_table.php b/database/migrations/2016_02_19_073625_create_password_resets_table.php index 113175711b..2a5c366cb4 100644 --- a/database/migrations/2016_02_19_073625_create_password_resets_table.php +++ b/database/migrations/2016_02_19_073625_create_password_resets_table.php @@ -1,7 +1,7 @@ engine = 'InnoDB'; - $table->string('email')->index(); - $table->string('token')->index(); - $table->timestamp('created_at'); - }); + Schema::create('password_resets', function (Blueprint $table) { + $table->engine = 'InnoDB'; + $table->string('email')->index(); + $table->string('token')->index(); + $table->timestamp('created_at'); + }); } /** diff --git a/database/migrations/2016_03_02_193043_add_ldap_flag_to_users.php b/database/migrations/2016_03_02_193043_add_ldap_flag_to_users.php index c7e6f2b9a7..7c51eaf4c5 100644 --- a/database/migrations/2016_03_02_193043_add_ldap_flag_to_users.php +++ b/database/migrations/2016_03_02_193043_add_ldap_flag_to_users.php @@ -1,7 +1,7 @@ boolean('ldap_import')->default(0); - }); - - DB::table('users')->where('notes','LIKE','%LDAP%')->update(['ldap_import' => 1]); + Schema::table('users', function (Blueprint $table) { + $table->boolean('ldap_import')->default(0); + }); + DB::table('users')->where('notes', 'LIKE', '%LDAP%')->update(['ldap_import' => 1]); } /** @@ -27,8 +26,8 @@ class AddLdapFlagToUsers extends Migration */ public function down() { - Schema::table('users', function ($table) { - $table->dropColumn('ldap_import'); - }); + Schema::table('users', function ($table) { + $table->dropColumn('ldap_import'); + }); } } diff --git a/database/migrations/2016_03_02_220517_update_ldap_filter_to_longer_field.php b/database/migrations/2016_03_02_220517_update_ldap_filter_to_longer_field.php index 57a1786dba..a17830f114 100644 --- a/database/migrations/2016_03_02_220517_update_ldap_filter_to_longer_field.php +++ b/database/migrations/2016_03_02_220517_update_ldap_filter_to_longer_field.php @@ -1,7 +1,7 @@ text('ldap_filter')->default(NULL)->change(); - }); + Schema::table('settings', function (Blueprint $table) { + $table->text('ldap_filter')->default(null)->change(); + }); } /** diff --git a/database/migrations/2016_03_08_225351_create_components_table.php b/database/migrations/2016_03_08_225351_create_components_table.php index 446285b014..8a3dfb7c5a 100644 --- a/database/migrations/2016_03_08_225351_create_components_table.php +++ b/database/migrations/2016_03_08_225351_create_components_table.php @@ -1,68 +1,61 @@ increments('id'); - $table->string('name')->nullable()->default(NULL); - $table->integer('category_id')->nullable()->default(NULL); - $table->integer('location_id')->nullable()->default(NULL); - $table->integer('company_id')->nullable()->default(NULL); - $table->integer('user_id')->nullable()->default(NULL); - $table->integer('total_qty')->default(1); - $table->integer('order_number')->nullable()->default(NULL); - $table->date('purchase_date')->nullable()->default(NULL); - $table->decimal('purchase_cost', 13,4)->nullable()->default(NULL); - $table->timestamps(); - $table->softDeletes(); - $table->engine = 'InnoDB'; - }); + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + // + Schema::create('components', function ($table) { + $table->increments('id'); + $table->string('name')->nullable()->default(null); + $table->integer('category_id')->nullable()->default(null); + $table->integer('location_id')->nullable()->default(null); + $table->integer('company_id')->nullable()->default(null); + $table->integer('user_id')->nullable()->default(null); + $table->integer('total_qty')->default(1); + $table->integer('order_number')->nullable()->default(null); + $table->date('purchase_date')->nullable()->default(null); + $table->decimal('purchase_cost', 13, 4)->nullable()->default(null); + $table->timestamps(); + $table->softDeletes(); + $table->engine = 'InnoDB'; + }); Schema::table('asset_logs', function ($table) { - $table->integer('component_id')->nullable()->default(NULL); - }); + $table->integer('component_id')->nullable()->default(null); + }); - Schema::create('components_assets', function ($table) { - $table->increments('id'); - $table->integer('user_id')->nullable()->default(NULL); - $table->integer('assigned_qty')->nullable()->default(1); - $table->integer('component_id')->nullable()->default(NULL); - $table->integer('asset_id')->nullable()->default(NULL); - $table->timestamps(); - }); + Schema::create('components_assets', function ($table) { + $table->increments('id'); + $table->integer('user_id')->nullable()->default(null); + $table->integer('assigned_qty')->nullable()->default(1); + $table->integer('component_id')->nullable()->default(null); + $table->integer('asset_id')->nullable()->default(null); + $table->timestamps(); + }); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::dropIfExists('components'); + Schema::dropIfExists('components_assets'); - - } - - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - // - Schema::dropIfExists('components'); - Schema::dropIfExists('components_assets'); - - Schema::table('asset_logs', function ($table) { - $table->dropColumn('component_id'); - }); - - - } - + Schema::table('asset_logs', function ($table) { + $table->dropColumn('component_id'); + }); + } } diff --git a/database/migrations/2016_03_09_024038_add_min_stock_to_tables.php b/database/migrations/2016_03_09_024038_add_min_stock_to_tables.php index 5fd8cc6e2e..6d00779f74 100644 --- a/database/migrations/2016_03_09_024038_add_min_stock_to_tables.php +++ b/database/migrations/2016_03_09_024038_add_min_stock_to_tables.php @@ -1,7 +1,7 @@ integer('min_amt')->nullable()->default(NULL); - }); - Schema::table('consumables', function (Blueprint $table) { - $table->integer('min_amt')->nullable()->default(NULL); - }); - Schema::table('components', function (Blueprint $table) { - $table->integer('min_amt')->nullable()->default(NULL); - }); + Schema::table('accessories', function (Blueprint $table) { + $table->integer('min_amt')->nullable()->default(null); + }); + Schema::table('consumables', function (Blueprint $table) { + $table->integer('min_amt')->nullable()->default(null); + }); + Schema::table('components', function (Blueprint $table) { + $table->integer('min_amt')->nullable()->default(null); + }); } /** @@ -30,14 +30,14 @@ class AddMinStockToTables extends Migration */ public function down() { - Schema::table('accessories', function ($table) { - $table->dropColumn('min_amt'); - }); - Schema::table('components', function ($table) { - $table->dropColumn('min_amt'); - }); - Schema::table('consumables', function ($table) { - $table->dropColumn('min_amt'); - }); + Schema::table('accessories', function ($table) { + $table->dropColumn('min_amt'); + }); + Schema::table('components', function ($table) { + $table->dropColumn('min_amt'); + }); + Schema::table('consumables', function ($table) { + $table->dropColumn('min_amt'); + }); } } diff --git a/database/migrations/2016_03_10_133849_add_locale_to_users.php b/database/migrations/2016_03_10_133849_add_locale_to_users.php index cf2d484dee..9a903f5391 100644 --- a/database/migrations/2016_03_10_133849_add_locale_to_users.php +++ b/database/migrations/2016_03_10_133849_add_locale_to_users.php @@ -1,7 +1,7 @@ string('locale',5)->nullable()->default(config('app.locale')); - }); + Schema::table('users', function (Blueprint $table) { + $table->string('locale', 5)->nullable()->default(config('app.locale')); + }); } /** @@ -24,8 +24,8 @@ class AddLocaleToUsers extends Migration */ public function down() { - Schema::table('users', function ($table) { - $table->dropColumn('locale'); - }); + Schema::table('users', function ($table) { + $table->dropColumn('locale'); + }); } } diff --git a/database/migrations/2016_03_10_135519_add_locale_to_settings.php b/database/migrations/2016_03_10_135519_add_locale_to_settings.php index 58ade4724f..e9ee81aaf4 100644 --- a/database/migrations/2016_03_10_135519_add_locale_to_settings.php +++ b/database/migrations/2016_03_10_135519_add_locale_to_settings.php @@ -1,7 +1,7 @@ string('locale',5)->nullable()->default(config('app.locale')); - }); + Schema::table('settings', function (Blueprint $table) { + $table->string('locale', 5)->nullable()->default(config('app.locale')); + }); } /** @@ -24,8 +24,8 @@ class AddLocaleToSettings extends Migration */ public function down() { - Schema::table('settings', function ($table) { - $table->dropColumn('locale'); - }); + Schema::table('settings', function ($table) { + $table->dropColumn('locale'); + }); } } diff --git a/database/migrations/2016_03_11_185621_add_label_settings_to_settings.php b/database/migrations/2016_03_11_185621_add_label_settings_to_settings.php index ab85695cbd..679bf51994 100644 --- a/database/migrations/2016_03_11_185621_add_label_settings_to_settings.php +++ b/database/migrations/2016_03_11_185621_add_label_settings_to_settings.php @@ -1,7 +1,7 @@ tinyInteger('labels_per_page')->default(30); - $table->decimal('labels_width', 6, 5)->default(2.625); - $table->decimal('labels_height', 6, 5)->default(1); - $table->decimal('labels_pmargin_left', 6, 5)->default(0.21975); - $table->decimal('labels_pmargin_right', 6, 5)->default(0.21975); - $table->decimal('labels_pmargin_top', 6, 5)->default(0.5); - $table->decimal('labels_pmargin_bottom', 6, 5)->default(0.5); - $table->decimal('labels_display_bgutter', 6, 5)->default(0.07); - $table->decimal('labels_display_sgutter', 6, 5)->default(0.05); - $table->tinyInteger('labels_fontsize')->default(9); - $table->decimal('labels_pagewidth', 7, 5)->default(8.5); - $table->decimal('labels_pageheight', 7, 5)->default(11); - $table->tinyInteger('labels_display_name')->default(0); - $table->tinyInteger('labels_display_serial')->default(1); - $table->tinyInteger('labels_display_tag')->default(1); - }); + Schema::table('settings', function (Blueprint $table) { + $table->tinyInteger('labels_per_page')->default(30); + $table->decimal('labels_width', 6, 5)->default(2.625); + $table->decimal('labels_height', 6, 5)->default(1); + $table->decimal('labels_pmargin_left', 6, 5)->default(0.21975); + $table->decimal('labels_pmargin_right', 6, 5)->default(0.21975); + $table->decimal('labels_pmargin_top', 6, 5)->default(0.5); + $table->decimal('labels_pmargin_bottom', 6, 5)->default(0.5); + $table->decimal('labels_display_bgutter', 6, 5)->default(0.07); + $table->decimal('labels_display_sgutter', 6, 5)->default(0.05); + $table->tinyInteger('labels_fontsize')->default(9); + $table->decimal('labels_pagewidth', 7, 5)->default(8.5); + $table->decimal('labels_pageheight', 7, 5)->default(11); + $table->tinyInteger('labels_display_name')->default(0); + $table->tinyInteger('labels_display_serial')->default(1); + $table->tinyInteger('labels_display_tag')->default(1); + }); } /** @@ -38,8 +38,8 @@ class AddLabelSettingsToSettings extends Migration */ public function down() { - Schema::table('settings', function ($table) { - $table->dropColumn( + Schema::table('settings', function ($table) { + $table->dropColumn( 'labels_per_page', 'labels_width', 'labels_height', @@ -56,6 +56,6 @@ class AddLabelSettingsToSettings extends Migration 'labels_display_serial', 'labels_display_tag' ); - }); + }); } } diff --git a/database/migrations/2016_03_22_125911_fix_custom_fields_regexes.php b/database/migrations/2016_03_22_125911_fix_custom_fields_regexes.php index e731a1b05e..8634ede9af 100644 --- a/database/migrations/2016_03_22_125911_fix_custom_fields_regexes.php +++ b/database/migrations/2016_03_22_125911_fix_custom_fields_regexes.php @@ -1,7 +1,7 @@ format) { + foreach (\App\Models\CustomField::all() as $custom_field) { + switch ($custom_field->format) { case '[a-zA-Z]*': - $custom_field->format='ALPHA'; + $custom_field->format = 'ALPHA'; break; case '[0-9]*': - $custom_field->format='NUMERIC'; + $custom_field->format = 'NUMERIC'; break; case '([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])': - $custom_field->format='IP'; + $custom_field->format = 'IP'; break; //ANYTHING ELSE. default: - $custom_field->format='regex:/^'.$custom_field->format."$/"; + $custom_field->format = 'regex:/^'.$custom_field->format.'$/'; } $custom_field->save(); } - } /** diff --git a/database/migrations/2016_04_28_141554_add_show_to_users.php b/database/migrations/2016_04_28_141554_add_show_to_users.php index 52b80d6fd9..8b6fd47122 100644 --- a/database/migrations/2016_04_28_141554_add_show_to_users.php +++ b/database/migrations/2016_04_28_141554_add_show_to_users.php @@ -1,7 +1,7 @@ boolean('show_in_list')->default(1); + $table->boolean('show_in_list')->default(1); }); } diff --git a/database/migrations/2016_05_16_164733_add_model_mfg_to_consumable.php b/database/migrations/2016_05_16_164733_add_model_mfg_to_consumable.php index 182eedae49..180ef43279 100644 --- a/database/migrations/2016_05_16_164733_add_model_mfg_to_consumable.php +++ b/database/migrations/2016_05_16_164733_add_model_mfg_to_consumable.php @@ -1,7 +1,7 @@ integer('model_no')->nullable()->default(NULL); - $table->integer('manufacturer_id')->nullable()->default(NULL); - $table->string('item_no')->nullable()->default(NULL); + $table->integer('model_no')->nullable()->default(null); + $table->integer('manufacturer_id')->nullable()->default(null); + $table->string('item_no')->nullable()->default(null); }); } diff --git a/database/migrations/2016_05_19_180351_add_alt_barcode_settings.php b/database/migrations/2016_05_19_180351_add_alt_barcode_settings.php index bbd849a24e..68320ae9ed 100644 --- a/database/migrations/2016_05_19_180351_add_alt_barcode_settings.php +++ b/database/migrations/2016_05_19_180351_add_alt_barcode_settings.php @@ -1,7 +1,7 @@ dropColumn('option_name'); + } }); } diff --git a/database/migrations/2016_05_20_143758_remove_option_value_from_settings_table.php b/database/migrations/2016_05_20_143758_remove_option_value_from_settings_table.php index 2836aaefb6..dccbbe5e60 100644 --- a/database/migrations/2016_05_20_143758_remove_option_value_from_settings_table.php +++ b/database/migrations/2016_05_20_143758_remove_option_value_from_settings_table.php @@ -1,7 +1,7 @@ dropColumn('option_value'); + } }); } diff --git a/database/migrations/2016_06_01_000001_create_oauth_auth_codes_table.php b/database/migrations/2016_06_01_000001_create_oauth_auth_codes_table.php index a7261b4278..86ebc1d6ca 100644 --- a/database/migrations/2016_06_01_000001_create_oauth_auth_codes_table.php +++ b/database/migrations/2016_06_01_000001_create_oauth_auth_codes_table.php @@ -13,7 +13,7 @@ class CreateOauthAuthCodesTable extends Migration */ public function up() { - if (!Schema::hasTable('oauth_auth_codes')) { + if (! Schema::hasTable('oauth_auth_codes')) { Schema::create('oauth_auth_codes', function (Blueprint $table) { $table->string('id', 100)->primary(); $table->unsignedBigInteger('user_id')->index(); @@ -32,6 +32,6 @@ class CreateOauthAuthCodesTable extends Migration */ public function down() { - Schema::dropIfExists('oauth_auth_codes'); + Schema::dropIfExists('oauth_auth_codes'); } } diff --git a/database/migrations/2016_06_01_000002_create_oauth_access_tokens_table.php b/database/migrations/2016_06_01_000002_create_oauth_access_tokens_table.php index ca15e62454..a12ea153bb 100644 --- a/database/migrations/2016_06_01_000002_create_oauth_access_tokens_table.php +++ b/database/migrations/2016_06_01_000002_create_oauth_access_tokens_table.php @@ -13,8 +13,7 @@ class CreateOauthAccessTokensTable extends Migration */ public function up() { - if (!Schema::hasTable('oauth_access_tokens')) { - + if (! Schema::hasTable('oauth_access_tokens')) { Schema::create('oauth_access_tokens', function (Blueprint $table) { $table->string('id', 100)->primary(); $table->unsignedBigInteger('user_id')->nullable()->index(); @@ -35,6 +34,6 @@ class CreateOauthAccessTokensTable extends Migration */ public function down() { - Schema::dropIfExists('oauth_access_tokens'); + Schema::dropIfExists('oauth_access_tokens'); } } diff --git a/database/migrations/2016_06_01_000003_create_oauth_refresh_tokens_table.php b/database/migrations/2016_06_01_000003_create_oauth_refresh_tokens_table.php index 9d7327d69c..30c4e27546 100644 --- a/database/migrations/2016_06_01_000003_create_oauth_refresh_tokens_table.php +++ b/database/migrations/2016_06_01_000003_create_oauth_refresh_tokens_table.php @@ -13,7 +13,7 @@ class CreateOauthRefreshTokensTable extends Migration */ public function up() { - if (!Schema::hasTable('oauth_refresh_tokens')) { + if (! Schema::hasTable('oauth_refresh_tokens')) { Schema::create('oauth_refresh_tokens', function (Blueprint $table) { $table->string('id', 100)->primary(); $table->string('access_token_id', 100); @@ -30,6 +30,6 @@ class CreateOauthRefreshTokensTable extends Migration */ public function down() { - Schema::dropIfExists('oauth_refresh_tokens'); + Schema::dropIfExists('oauth_refresh_tokens'); } } diff --git a/database/migrations/2016_06_01_000004_create_oauth_clients_table.php b/database/migrations/2016_06_01_000004_create_oauth_clients_table.php index 65937a72af..0046eb6e79 100644 --- a/database/migrations/2016_06_01_000004_create_oauth_clients_table.php +++ b/database/migrations/2016_06_01_000004_create_oauth_clients_table.php @@ -13,7 +13,7 @@ class CreateOauthClientsTable extends Migration */ public function up() { - if (!Schema::hasTable('oauth_clients')) { + if (! Schema::hasTable('oauth_clients')) { Schema::create('oauth_clients', function (Blueprint $table) { $table->bigIncrements('id'); $table->unsignedBigInteger('user_id')->nullable()->index(); @@ -35,6 +35,6 @@ class CreateOauthClientsTable extends Migration */ public function down() { - Schema::dropIfExists('oauth_clients'); + Schema::dropIfExists('oauth_clients'); } } diff --git a/database/migrations/2016_06_01_000005_create_oauth_personal_access_clients_table.php b/database/migrations/2016_06_01_000005_create_oauth_personal_access_clients_table.php index b469b42364..0a50768ed8 100644 --- a/database/migrations/2016_06_01_000005_create_oauth_personal_access_clients_table.php +++ b/database/migrations/2016_06_01_000005_create_oauth_personal_access_clients_table.php @@ -13,14 +13,13 @@ class CreateOauthPersonalAccessClientsTable extends Migration */ public function up() { - if (!Schema::hasTable('oauth_personal_access_clients')) { + if (! Schema::hasTable('oauth_personal_access_clients')) { Schema::create('oauth_personal_access_clients', function (Blueprint $table) { $table->bigIncrements('id'); $table->unsignedBigInteger('client_id'); $table->timestamps(); }); } - } /** @@ -30,6 +29,6 @@ class CreateOauthPersonalAccessClientsTable extends Migration */ public function down() { - Schema::dropIfExists('oauth_personal_access_clients'); + Schema::dropIfExists('oauth_personal_access_clients'); } } diff --git a/database/migrations/2016_06_01_140218_add_email_domain_and_format_to_settings.php b/database/migrations/2016_06_01_140218_add_email_domain_and_format_to_settings.php index a2b29e9b60..02789e8a99 100644 --- a/database/migrations/2016_06_01_140218_add_email_domain_and_format_to_settings.php +++ b/database/migrations/2016_06_01_140218_add_email_domain_and_format_to_settings.php @@ -1,7 +1,7 @@ string('email_domain')->nullable()->default(NULL); + $table->string('email_domain')->nullable()->default(null); $table->string('email_format')->nullable()->default('filastname'); $table->string('username_format')->nullable()->default('filastname'); }); diff --git a/database/migrations/2016_06_22_160725_add_user_id_to_maintenances.php b/database/migrations/2016_06_22_160725_add_user_id_to_maintenances.php index cdbd128759..284a63ca9b 100644 --- a/database/migrations/2016_06_22_160725_add_user_id_to_maintenances.php +++ b/database/migrations/2016_06_22_160725_add_user_id_to_maintenances.php @@ -1,7 +1,7 @@ integer('user_id')->nullable()->default(NULL); + $table->integer('user_id')->nullable()->default(null); }); } diff --git a/database/migrations/2016_07_13_150015_add_is_ad_to_settings.php b/database/migrations/2016_07_13_150015_add_is_ad_to_settings.php index ad6bc1beec..35543c90fe 100644 --- a/database/migrations/2016_07_13_150015_add_is_ad_to_settings.php +++ b/database/migrations/2016_07_13_150015_add_is_ad_to_settings.php @@ -1,7 +1,7 @@ string('ad_domain')->nullable()->default(NULL); + $table->string('ad_domain')->nullable()->default(null); }); } diff --git a/database/migrations/2016_07_22_003348_fix_custom_fields_regex_stuff.php b/database/migrations/2016_07_22_003348_fix_custom_fields_regex_stuff.php index f487910823..da81cb1e50 100644 --- a/database/migrations/2016_07_22_003348_fix_custom_fields_regex_stuff.php +++ b/database/migrations/2016_07_22_003348_fix_custom_fields_regex_stuff.php @@ -1,7 +1,7 @@ format, 'ALPHA') !== false) { - $custom_field->format='alpha'; + $custom_field->format = 'alpha'; // Numeric } elseif (stripos($custom_field->format, 'NUMERIC') !== false) { - $custom_field->format='numeric'; + $custom_field->format = 'numeric'; // IP } elseif (stripos($custom_field->format, 'IP') !== false) { - $custom_field->format='ip'; + $custom_field->format = 'ip'; // Email } elseif (stripos($custom_field->format, 'EMAIL') !== false) { - $custom_field->format='email'; + $custom_field->format = 'email'; // MAC } elseif (stripos($custom_field->format, 'regex:/^[a-fA-F0-9]{2}:[a-fA-F0-9]{2}:[a-fA-F0-9]{2}:[a-fA-F0-9]{2}:[a-fA-F0-9]{2}:[a-fA-F0-9]{2}$/') !== false) { - $custom_field->format='regex:/^[a-fA-F0-9]{2}:[a-fA-F0-9]{2}:[a-fA-F0-9]{2}:[a-fA-F0-9]{2}:[a-fA-F0-9]{2}:[a-fA-F0-9]{2}$/'; + $custom_field->format = 'regex:/^[a-fA-F0-9]{2}:[a-fA-F0-9]{2}:[a-fA-F0-9]{2}:[a-fA-F0-9]{2}:[a-fA-F0-9]{2}:[a-fA-F0-9]{2}$/'; // Date } elseif (stripos($custom_field->format, 'DATE') !== false) { - $custom_field->format='date'; - + $custom_field->format = 'date'; // URL } elseif (stripos($custom_field->format, 'URL') !== false) { - $custom_field->format='url'; + $custom_field->format = 'url'; // ANY } elseif (stripos($custom_field->format, 'ANY') !== false) { - $custom_field->format=''; + $custom_field->format = ''; // Fix any custom regexes } else { diff --git a/database/migrations/2016_07_22_054850_one_more_mac_addr_fix.php b/database/migrations/2016_07_22_054850_one_more_mac_addr_fix.php index cc45976d54..ac64e278fe 100644 --- a/database/migrations/2016_07_22_054850_one_more_mac_addr_fix.php +++ b/database/migrations/2016_07_22_054850_one_more_mac_addr_fix.php @@ -1,7 +1,7 @@ format=='regex:/^MAC$/') { + foreach (\App\Models\CustomField::all() as $custom_field) { + if ($custom_field->format == 'regex:/^MAC$/') { $custom_field->format = 'regex:/^[a-fA-F0-9]{2}:[a-fA-F0-9]{2}:[a-fA-F0-9]{2}:[a-fA-F0-9]{2}:[a-fA-F0-9]{2}:[a-fA-F0-9]{2}$/'; } $custom_field->save(); - } } diff --git a/database/migrations/2016_07_22_143045_add_port_to_ldap_settings.php b/database/migrations/2016_07_22_143045_add_port_to_ldap_settings.php index b0dd1a601c..1eda0698a5 100644 --- a/database/migrations/2016_07_22_143045_add_port_to_ldap_settings.php +++ b/database/migrations/2016_07_22_143045_add_port_to_ldap_settings.php @@ -1,7 +1,7 @@ string('color', 10)->nullable()->default(NULL); + $table->string('color', 10)->nullable()->default(null); }); } diff --git a/database/migrations/2016_08_04_134500_add_disallow_ldap_pw_sync_to_settings.php b/database/migrations/2016_08_04_134500_add_disallow_ldap_pw_sync_to_settings.php index c46203fdad..d141af056c 100644 --- a/database/migrations/2016_08_04_134500_add_disallow_ldap_pw_sync_to_settings.php +++ b/database/migrations/2016_08_04_134500_add_disallow_ldap_pw_sync_to_settings.php @@ -1,7 +1,7 @@ boolean('show_in_nav')->default(0); + $table->boolean('show_in_nav')->nullable()->default(0); }); } diff --git a/database/migrations/2016_08_30_084634_make_purchase_cost_nullable.php b/database/migrations/2016_08_30_084634_make_purchase_cost_nullable.php index 241fa07269..525242c647 100644 --- a/database/migrations/2016_08_30_084634_make_purchase_cost_nullable.php +++ b/database/migrations/2016_08_30_084634_make_purchase_cost_nullable.php @@ -1,7 +1,7 @@ getDoctrineSchemaManager()->getDatabasePlatform(); $platform->registerDoctrineTypeMapping('enum', 'string'); Schema::table('assets', function ($table) { - $table->decimal('purchase_cost',8,2)->nullable()->default(null)->change(); + $table->decimal('purchase_cost', 8, 2)->nullable()->default(null)->change(); }); } diff --git a/database/migrations/2016_09_01_141051_add_requestable_to_asset_model.php b/database/migrations/2016_09_01_141051_add_requestable_to_asset_model.php index 6fc16b9cdf..89b5dfc556 100644 --- a/database/migrations/2016_09_01_141051_add_requestable_to_asset_model.php +++ b/database/migrations/2016_09_01_141051_add_requestable_to_asset_model.php @@ -1,7 +1,7 @@ increments('id'); $table->integer('user_id')->nullable(); diff --git a/database/migrations/2016_09_04_182149_migrate_asset_log_to_action_log.php b/database/migrations/2016_09_04_182149_migrate_asset_log_to_action_log.php index 4d0de747ae..874f7a6070 100644 --- a/database/migrations/2016_09_04_182149_migrate_asset_log_to_action_log.php +++ b/database/migrations/2016_09_04_182149_migrate_asset_log_to_action_log.php @@ -23,45 +23,44 @@ class MigrateAssetLogToActionLog extends Migration // var_dump($log); $a->user_id = $log->user_id; - if (!is_null($log->asset_id)) { + if (! is_null($log->asset_id)) { $a->item_id = $log->asset_id; - if ($log->asset_type == "hardware") { - $a->item_type = 'App\\Models\\Asset'; + if ($log->asset_type == 'hardware') { + $a->item_type = \App\Models\Asset::class; } else { - $a->item_type = 'App\\Models\\License'; + $a->item_type = \App\Models\License::class; } } - if (!is_null($log->accessory_id)) { + if (! is_null($log->accessory_id)) { $a->item_id = $log->accessory_id; - $a->item_type = 'App\\Models\\Accessory'; - } else if (!is_null($log->consumable_id)) { + $a->item_type = \App\Models\Accessory::class; + } elseif (! is_null($log->consumable_id)) { $a->item_id = $log->consumable_id; - $a->item_type = 'App\\Models\\Consumable'; - } else if (!is_null($log->component_id)) { + $a->item_type = \App\Models\Consumable::class; + } elseif (! is_null($log->component_id)) { $a->item_id = $log->component_id; - $a->item_type = 'App\\Models\\Component'; + $a->item_type = \App\Models\Component::class; } $a->action_type = $log->action_type; // $a->checkout_to = $log->checkout_to; - if(!is_null($log->checkedout_to)) { + if (! is_null($log->checkedout_to)) { $a->target_id = $log->checkedout_to; $a->target_type = User::class; } - if(!is_null($log->accepted_id)) { + if (! is_null($log->accepted_id)) { $a->target_id = $log->accepted_id; $a->target_type = User::class; } - $a->location_id = $log->location_id; - $a->created_at = $log->created_at; - $a->updated_at = $log->updated_at; - $a->deleted_at = $log->deleted_at; - $a->note = $log->note; - $a->expected_checkin = $log->expected_checkin; - $a->accepted_id = $log->accepted_id; - $a->filename = $log->filename; + $a->location_id = $log->location_id; + $a->created_at = $log->created_at; + $a->updated_at = $log->updated_at; + $a->deleted_at = $log->deleted_at; + $a->note = $log->note; + $a->expected_checkin = $log->expected_checkin; + $a->accepted_id = $log->accepted_id; + $a->filename = $log->filename; $a->save(); - } // dd($logs); } diff --git a/database/migrations/2016_09_19_235935_fix_fieldtype_for_target_type.php b/database/migrations/2016_09_19_235935_fix_fieldtype_for_target_type.php index db10820f60..0d74936ef6 100644 --- a/database/migrations/2016_09_19_235935_fix_fieldtype_for_target_type.php +++ b/database/migrations/2016_09_19_235935_fix_fieldtype_for_target_type.php @@ -1,7 +1,7 @@ get(); foreach ($logs as $log) { - if($log->item) { + if ($log->item) { $log->company_id = $log->item->company_id; $log->save(); } else { diff --git a/database/migrations/2016_10_14_130709_fix_order_number_to_varchar.php b/database/migrations/2016_10_14_130709_fix_order_number_to_varchar.php index 96f801987f..280984e33e 100644 --- a/database/migrations/2016_10_14_130709_fix_order_number_to_varchar.php +++ b/database/migrations/2016_10_14_130709_fix_order_number_to_varchar.php @@ -1,7 +1,7 @@ renameColumn('model_number', 'modelno'); - }); } } diff --git a/database/migrations/2016_10_16_015211_rename_consumable_modelno_to_model_number.php b/database/migrations/2016_10_16_015211_rename_consumable_modelno_to_model_number.php index daf93c3ac5..86718230d0 100644 --- a/database/migrations/2016_10_16_015211_rename_consumable_modelno_to_model_number.php +++ b/database/migrations/2016_10_16_015211_rename_consumable_modelno_to_model_number.php @@ -1,7 +1,7 @@ renameColumn('notes', 'note'); }); } diff --git a/database/migrations/2016_10_16_165052_rename_component_total_qty_to_qty.php b/database/migrations/2016_10_16_165052_rename_component_total_qty_to_qty.php index 1aba51ce99..e9fa829c7c 100644 --- a/database/migrations/2016_10_16_165052_rename_component_total_qty_to_qty.php +++ b/database/migrations/2016_10_16_165052_rename_component_total_qty_to_qty.php @@ -1,7 +1,7 @@ string('serial_number')->nullable()->default(null); }); - } /** @@ -28,6 +27,5 @@ class AddSerialToComponents extends Migration Schema::table('components', function ($table) { $table->dropColumn('serial_number'); }); - } } diff --git a/database/migrations/2016_10_27_213251_increase_serial_field_capacity.php b/database/migrations/2016_10_27_213251_increase_serial_field_capacity.php index f81c9373ef..71302ff3ac 100644 --- a/database/migrations/2016_10_27_213251_increase_serial_field_capacity.php +++ b/database/migrations/2016_10_27_213251_increase_serial_field_capacity.php @@ -1,7 +1,7 @@ where('filename', '!=', null)->get(); // - foreach($logs as $log) { + foreach ($logs as $log) { $matching_action_log = Actionlog::where('item_id', $log->asset_id) ->where('created_at', $log->created_at) ->where('note', $log->note) @@ -24,21 +24,19 @@ class FixForgottenFilenameInActionLogs extends Migration ->withTrashed() ->get()->first(); - if($matching_action_log) { + if ($matching_action_log) { $matching_action_log->filename = $log->filename; $matching_action_log->save(); - }else{ - echo("Couldn't find matching Action log row when trying to migrate". + } else { + echo "Couldn't find matching Action log row when trying to migrate". " filename from asset log:\n". "LogDate{$log->created_at} LogForAsset:{$log->asset_id}". - "LogNote:{$log->note} \n"); + "LogNote:{$log->note} \n"; } } - }); } - /** * Reverse the migrations. * diff --git a/database/migrations/2016_11_13_020954_rename_component_serial_number_to_serial.php b/database/migrations/2016_11_13_020954_rename_component_serial_number_to_serial.php index b1cde650e9..d6be3bb199 100644 --- a/database/migrations/2016_11_13_020954_rename_component_serial_number_to_serial.php +++ b/database/migrations/2016_11_13_020954_rename_component_serial_number_to_serial.php @@ -1,7 +1,7 @@ getDoctrineSchemaManager()->getDatabasePlatform(); $platform->registerDoctrineTypeMapping('enum', 'string'); - Schema::table('assets', function ($table) { - $table->decimal('purchase_cost', 20, 2)->nullable()->default(null)->change(); + $table->decimal('purchase_cost', 20, 2)->nullable()->default(null)->change(); }); Schema::table('accessories', function ($table) { - $table->decimal('purchase_cost', 20, 2)->nullable()->default(null)->change(); + $table->decimal('purchase_cost', 20, 2)->nullable()->default(null)->change(); }); Schema::table('asset_maintenances', function ($table) { - $table->decimal('cost', 20, 2)->nullable()->default(null)->change(); + $table->decimal('cost', 20, 2)->nullable()->default(null)->change(); }); Schema::table('components', function ($table) { - $table->decimal('purchase_cost', 20, 2)->nullable()->default(null)->change(); + $table->decimal('purchase_cost', 20, 2)->nullable()->default(null)->change(); }); Schema::table('consumables', function ($table) { - $table->decimal('purchase_cost', 20, 2)->nullable()->default(null)->change(); + $table->decimal('purchase_cost', 20, 2)->nullable()->default(null)->change(); }); Schema::table('licenses', function ($table) { - $table->decimal('purchase_cost', 20, 2)->nullable()->default(null)->change(); + $table->decimal('purchase_cost', 20, 2)->nullable()->default(null)->change(); }); - } /** @@ -53,27 +51,27 @@ class IncreasePurchaseCostSize extends Migration $platform->registerDoctrineTypeMapping('enum', 'string'); Schema::table('assets', function ($table) { - $table->decimal('purchase_cost', 8, 2)->nullable()->default(null)->change(); + $table->decimal('purchase_cost', 8, 2)->nullable()->default(null)->change(); }); Schema::table('accessories', function ($table) { - $table->decimal('purchase_cost', 13, 4)->nullable()->default(null)->change(); + $table->decimal('purchase_cost', 13, 4)->nullable()->default(null)->change(); }); Schema::table('asset_maintenances', function ($table) { - $table->decimal('cost', 10, 2)->nullable()->default(null)->change(); + $table->decimal('cost', 10, 2)->nullable()->default(null)->change(); }); Schema::table('components', function ($table) { - $table->decimal('purchase_cost', 13, 4)->nullable()->default(null)->change(); + $table->decimal('purchase_cost', 13, 4)->nullable()->default(null)->change(); }); Schema::table('consumables', function ($table) { - $table->decimal('purchase_cost', 13, 4)->nullable()->default(null)->change(); + $table->decimal('purchase_cost', 13, 4)->nullable()->default(null)->change(); }); Schema::table('licenses', function ($table) { - $table->decimal('purchase_cost', 8, 2)->nullable()->default(null)->change(); + $table->decimal('purchase_cost', 8, 2)->nullable()->default(null)->change(); }); } } diff --git a/database/migrations/2016_11_17_161317_longer_state_field_in_location.php b/database/migrations/2016_11_17_161317_longer_state_field_in_location.php index b60466597b..3c77db6743 100644 --- a/database/migrations/2016_11_17_161317_longer_state_field_in_location.php +++ b/database/migrations/2016_11_17_161317_longer_state_field_in_location.php @@ -1,7 +1,7 @@ where('target_type', null)->where(function($query) { + DB::table('action_logs')->where('target_type', null)->where(function ($query) { $query->where('action_type', 'accepted') ->orWhere('action_type', 'declined'); - })->update(['target_type'=> 'App\Models\User']); + })->update(['target_type'=> \App\Models\User::class]); } /** diff --git a/database/migrations/2016_12_07_173720_increase_size_of_state_in_suppliers.php b/database/migrations/2016_12_07_173720_increase_size_of_state_in_suppliers.php index 1c1468d23a..70539c1198 100644 --- a/database/migrations/2016_12_07_173720_increase_size_of_state_in_suppliers.php +++ b/database/migrations/2016_12_07_173720_increase_size_of_state_in_suppliers.php @@ -1,7 +1,7 @@ string('phone',35)->nullable()->default(NULL)->change(); - $table->string('fax',35)->nullable()->default(NULL)->change(); + $table->string('phone', 35)->nullable()->default(null)->change(); + $table->string('fax', 35)->nullable()->default(null)->change(); }); } @@ -29,9 +29,8 @@ class ExtendPhoneLengthsInSupplierAndElsewhere extends Migration { Schema::table('suppliers', function (Blueprint $table) { // - $table->string('phone',20)->nullable()->default(NULL)->change(); - $table->string('fax',20)->nullable()->default(NULL)->change(); - + $table->string('phone', 20)->nullable()->default(null)->change(); + $table->string('fax', 20)->nullable()->default(null)->change(); }); } } diff --git a/database/migrations/2016_12_27_212631_make_asset_assigned_to_polymorphic.php b/database/migrations/2016_12_27_212631_make_asset_assigned_to_polymorphic.php index 772bd170a5..c4534ddcc8 100644 --- a/database/migrations/2016_12_27_212631_make_asset_assigned_to_polymorphic.php +++ b/database/migrations/2016_12_27_212631_make_asset_assigned_to_polymorphic.php @@ -1,10 +1,10 @@ string('assigned_type')->nullable(); - }); - if(config('database.default') == 'mysql') { + Schema::table('assets', function (Blueprint $table) { + $table->string('assigned_type')->nullable(); + }); + if (config('database.default') == 'mysql') { Asset::whereNotNull('assigned_to')->orWhere('assigned_to', '!=', '')->update(['assigned_type' => User::class]); } } diff --git a/database/migrations/2017_01_09_040429_create_locations_ldap_query_field.php b/database/migrations/2017_01_09_040429_create_locations_ldap_query_field.php index f67f85c2aa..f0556e2833 100644 --- a/database/migrations/2017_01_09_040429_create_locations_ldap_query_field.php +++ b/database/migrations/2017_01_09_040429_create_locations_ldap_query_field.php @@ -1,7 +1,7 @@ ] * @since [v4.0] - * @return Array + * @return array */ - -function updateLegacyColumnName($customfield) { - +function updateLegacyColumnName($customfield) +{ $name_to_db_name = CustomField::name_to_db_name($customfield->name); //\Log::debug('Trying to rename '.$name_to_db_name." to ".$customfield->convertUnicodeDbSlug()."...\n"); if (Schema::hasColumn(CustomField::$table_name, $name_to_db_name)) { - return Schema::table(CustomField::$table_name, - function ($table) use ($name_to_db_name, $customfield) { + function ($table) use ($name_to_db_name, $customfield) { $table->renameColumn($name_to_db_name, $customfield->convertUnicodeDbSlug()); } ); - } else { //\Log::debug('Legacy DB column '.$name_to_db_name.' was not found on the assets table.'); } - } - - - class FixUtf8CustomFieldColumnNames extends Migration { /** @@ -52,15 +45,14 @@ class FixUtf8CustomFieldColumnNames extends Migration $platform = Schema::getConnection()->getDoctrineSchemaManager()->getDatabasePlatform(); $platform->registerDoctrineTypeMapping('enum', 'string'); - if (!Schema::hasColumn('custom_fields', 'db_column')) { + if (! Schema::hasColumn('custom_fields', 'db_column')) { Schema::table('custom_fields', function ($table) { $table->string('db_column')->nullable(); $table->text('help_text')->nullable(); }); } - foreach(CustomField::all() as $field) { - + foreach (CustomField::all() as $field) { $db_column = $field->convertUnicodeDbSlug(); DB::table('custom_fields') @@ -69,11 +61,7 @@ class FixUtf8CustomFieldColumnNames extends Migration // change the name of the column updateLegacyColumnName($field); - - } - - } /** @@ -88,5 +76,4 @@ class FixUtf8CustomFieldColumnNames extends Migration $table->dropColumn('help_text'); }); } - } diff --git a/database/migrations/2017_03_03_154632_add_time_date_display_to_settings.php b/database/migrations/2017_03_03_154632_add_time_date_display_to_settings.php index b3f40ab98d..c704696893 100644 --- a/database/migrations/2017_03_03_154632_add_time_date_display_to_settings.php +++ b/database/migrations/2017_03_03_154632_add_time_date_display_to_settings.php @@ -1,8 +1,8 @@ text('field_values')->nullable()->default(null)->change(); }); - } /** diff --git a/database/migrations/2017_05_22_204422_create_departments.php b/database/migrations/2017_05_22_204422_create_departments.php index cf2e1eaf7c..a1c235af69 100644 --- a/database/migrations/2017_05_22_204422_create_departments.php +++ b/database/migrations/2017_05_22_204422_create_departments.php @@ -1,8 +1,8 @@ whereNull('deleted_at')->get(); - if (!$next = Asset::nextAutoIncrement($assets)) { + if (! $next = Asset::nextAutoIncrement($assets)) { $next = 1; } @@ -31,7 +29,6 @@ class AddNextAutoincrementToSettings extends Migration $settings->next_auto_tag_base = $next; $settings->save(); } - } /** diff --git a/database/migrations/2017_06_18_151753_add_header_and_first_row_to_importer_table.php b/database/migrations/2017_06_18_151753_add_header_and_first_row_to_importer_table.php index 6947c421a1..8f82243a70 100644 --- a/database/migrations/2017_06_18_151753_add_header_and_first_row_to_importer_table.php +++ b/database/migrations/2017_06_18_151753_add_header_and_first_row_to_importer_table.php @@ -1,8 +1,8 @@ boolean('pwd_secure_uncommon')->default('0'); - $table->string('pwd_secure_complexity')->nullable()->default(NULL); + $table->string('pwd_secure_complexity')->nullable()->default(null); $table->integer('pwd_secure_min')->default('8'); }); } diff --git a/database/migrations/2017_08_25_074822_add_auditing_tables.php b/database/migrations/2017_08_25_074822_add_auditing_tables.php index e8a6f5209a..ef064ffc26 100644 --- a/database/migrations/2017_08_25_074822_add_auditing_tables.php +++ b/database/migrations/2017_08_25_074822_add_auditing_tables.php @@ -1,8 +1,8 @@ date('next_audit_date')->nullable()->default(NULL); + $table->date('next_audit_date')->nullable()->default(null); }); } diff --git a/database/migrations/2017_08_25_101435_add_auditing_to_settings.php b/database/migrations/2017_08_25_101435_add_auditing_to_settings.php index 7ef4ed306f..14522da79f 100644 --- a/database/migrations/2017_08_25_101435_add_auditing_to_settings.php +++ b/database/migrations/2017_08_25_101435_add_auditing_to_settings.php @@ -1,8 +1,8 @@ integer('audit_interval')->nullable()->default(NULL); - $table->integer('audit_warning_days')->nullable()->default(NULL); + $table->integer('audit_interval')->nullable()->default(null); + $table->integer('audit_warning_days')->nullable()->default(null); }); } diff --git a/database/migrations/2017_09_18_225619_fix_assigned_type_not_being_nulled.php b/database/migrations/2017_09_18_225619_fix_assigned_type_not_being_nulled.php index b9d2239981..ef7c3cd4c0 100644 --- a/database/migrations/2017_09_18_225619_fix_assigned_type_not_being_nulled.php +++ b/database/migrations/2017_09_18_225619_fix_assigned_type_not_being_nulled.php @@ -21,7 +21,7 @@ class FixAssignedTypeNotBeingNulled extends Migration // Additionally, the importer did not set assigned_type when importing. // In the case where we have an assigned_to but not an assigned_type, set the assigned_type to User. - Asset::whereNotNull('assigned_to')->whereNull('assigned_type')->update(['assigned_type' => 'App\Models\User']); + Asset::whereNotNull('assigned_to')->whereNull('assigned_type')->update(['assigned_type' => \App\Models\User::class]); } /** diff --git a/database/migrations/2017_10_03_015503_drop_foreign_keys.php b/database/migrations/2017_10_03_015503_drop_foreign_keys.php index 37ef6ae684..9f42fc068e 100644 --- a/database/migrations/2017_10_03_015503_drop_foreign_keys.php +++ b/database/migrations/2017_10_03_015503_drop_foreign_keys.php @@ -1,8 +1,8 @@ dropForeign(['company_id']); }); @@ -21,7 +21,7 @@ class DropForeignKeys extends Migration //echo $e; } - try { + try { Schema::table('users', function (Blueprint $table) { $table->dropForeign(['company_id']); }); @@ -29,7 +29,7 @@ class DropForeignKeys extends Migration //echo $e; } - try { + try { Schema::table('assets', function (Blueprint $table) { $table->dropForeign(['company_id']); }); @@ -37,7 +37,7 @@ class DropForeignKeys extends Migration //echo $e; } - try { + try { Schema::table('components', function (Blueprint $table) { $table->dropForeign(['company_id']); }); @@ -45,7 +45,7 @@ class DropForeignKeys extends Migration //echo $e; } - try { + try { Schema::table('consumables', function (Blueprint $table) { $table->dropForeign(['company_id']); }); @@ -53,16 +53,13 @@ class DropForeignKeys extends Migration //echo $e; } - try { + try { Schema::table('licenses', function (Blueprint $table) { $table->dropForeign(['company_id']); }); } catch (\Exception $e) { //echo $e; } - - - } /** diff --git a/database/migrations/2017_10_10_123504_allow_nullable_depreciation_id_in_models.php b/database/migrations/2017_10_10_123504_allow_nullable_depreciation_id_in_models.php index fd252bd59c..c1e296095c 100644 --- a/database/migrations/2017_10_10_123504_allow_nullable_depreciation_id_in_models.php +++ b/database/migrations/2017_10_10_123504_allow_nullable_depreciation_id_in_models.php @@ -1,8 +1,8 @@ integer('depreciation_id')->nullable()->default(null)->change(); }); - } /** diff --git a/database/migrations/2017_10_17_133709_add_display_url_to_settings.php b/database/migrations/2017_10_17_133709_add_display_url_to_settings.php index 9b90df9571..8f8237b7d2 100644 --- a/database/migrations/2017_10_17_133709_add_display_url_to_settings.php +++ b/database/migrations/2017_10_17_133709_add_display_url_to_settings.php @@ -1,8 +1,8 @@ index('rtd_location_id'); - $table->index(['assigned_type','assigned_to']); + $table->index(['assigned_type', 'assigned_to']); }); } @@ -29,7 +29,7 @@ class AddLocationIndicesToAssets extends Migration Schema::table('assets', function (Blueprint $table) { // $table->dropIndex(['rtd_location_id']); - $table->dropIndex(['assigned_type','assigned_to']); + $table->dropIndex(['assigned_type', 'assigned_to']); }); } } diff --git a/database/migrations/2017_10_25_202930_add_images_uploads_to_locations_manufacturers_etc.php b/database/migrations/2017_10_25_202930_add_images_uploads_to_locations_manufacturers_etc.php index f6775a564a..7fb7cedd24 100644 --- a/database/migrations/2017_10_25_202930_add_images_uploads_to_locations_manufacturers_etc.php +++ b/database/migrations/2017_10_25_202930_add_images_uploads_to_locations_manufacturers_etc.php @@ -1,8 +1,8 @@ string('image')->nullable()->default(null); }); - } /** @@ -65,7 +64,5 @@ class AddImagesUploadsToLocationsManufacturersEtc extends Migration Schema::table('manufacturers', function (Blueprint $table) { $table->dropColumn('image'); }); - - } } diff --git a/database/migrations/2017_10_27_180947_denorm_asset_locations.php b/database/migrations/2017_10_27_180947_denorm_asset_locations.php index b6ec3df8e4..7d26fd36c3 100644 --- a/database/migrations/2017_10_27_180947_denorm_asset_locations.php +++ b/database/migrations/2017_10_27_180947_denorm_asset_locations.php @@ -1,9 +1,8 @@ integer('location_id')->nullable()->default(null); }); - } /** diff --git a/database/migrations/2017_10_27_192423_migrate_denormed_asset_locations.php b/database/migrations/2017_10_27_192423_migrate_denormed_asset_locations.php index 2da67eb667..e0e10e1a88 100644 --- a/database/migrations/2017_10_27_192423_migrate_denormed_asset_locations.php +++ b/database/migrations/2017_10_27_192423_migrate_denormed_asset_locations.php @@ -1,6 +1,6 @@ dropColumn('city'); $table->dropColumn('state'); $table->dropColumn('zip'); - }); } } diff --git a/database/migrations/2017_11_08_025918_add_alert_menu_setting.php b/database/migrations/2017_11_08_025918_add_alert_menu_setting.php index 5833f157c3..a2c5f3af81 100644 --- a/database/migrations/2017_11_08_025918_add_alert_menu_setting.php +++ b/database/migrations/2017_11_08_025918_add_alert_menu_setting.php @@ -1,8 +1,8 @@ datetime('last_audit_date')->after('assigned_type')->nullable()->default(null); }); } - - - } /** diff --git a/database/migrations/2017_12_12_033618_add_actionlog_meta.php b/database/migrations/2017_12_12_033618_add_actionlog_meta.php index a9a662fa1a..1189f828c8 100644 --- a/database/migrations/2017_12_12_033618_add_actionlog_meta.php +++ b/database/migrations/2017_12_12_033618_add_actionlog_meta.php @@ -1,8 +1,8 @@ unsetEventDispatcher(); $asset->save(); } - } } } diff --git a/database/migrations/2018_01_17_184354_add_archived_in_list_setting.php b/database/migrations/2018_01_17_184354_add_archived_in_list_setting.php index 970e218cdc..128ab58d39 100644 --- a/database/migrations/2018_01_17_184354_add_archived_in_list_setting.php +++ b/database/migrations/2018_01_17_184354_add_archived_in_list_setting.php @@ -1,8 +1,8 @@ boolean('login_remote_user_enabled')->default(0); $table->boolean('login_common_disabled')->default(0); - $table->string('login_remote_user_custom_logout_url')->default(""); + $table->string('login_remote_user_custom_logout_url')->default(''); }); } diff --git a/database/migrations/2018_03_03_011032_add_theme_to_settings.php b/database/migrations/2018_03_03_011032_add_theme_to_settings.php index 876b618d8b..2c44a4af35 100644 --- a/database/migrations/2018_03_03_011032_add_theme_to_settings.php +++ b/database/migrations/2018_03_03_011032_add_theme_to_settings.php @@ -1,8 +1,8 @@ boolean('default_label')->default(0); + $table->boolean('default_label')->nullable()->default(0); }); } diff --git a/database/migrations/2018_03_23_212048_add_display_in_email_to_custom_fields.php b/database/migrations/2018_03_23_212048_add_display_in_email_to_custom_fields.php index 59771eb4ae..4f1340f378 100644 --- a/database/migrations/2018_03_23_212048_add_display_in_email_to_custom_fields.php +++ b/database/migrations/2018_03_23_212048_add_display_in_email_to_custom_fields.php @@ -1,8 +1,8 @@ index(['user_id','requestable_id','requestable_type'], 'checkout_requests_user_id_requestable_id_requestable_type_unique')->unique(); + $table->index(['user_id', 'requestable_id', 'requestable_type'], 'checkout_requests_user_id_requestable_id_requestable_type_unique')->unique(); }); } } diff --git a/database/migrations/2018_03_29_070511_add_new_index_requestable.php b/database/migrations/2018_03_29_070511_add_new_index_requestable.php index 09c06566e8..394dbaac45 100644 --- a/database/migrations/2018_03_29_070511_add_new_index_requestable.php +++ b/database/migrations/2018_03_29_070511_add_new_index_requestable.php @@ -1,8 +1,8 @@ index(['user_id','requestable_id','requestable_type'], 'checkout_requests_user_id_requestable_id_requestable_type'); + $table->index(['user_id', 'requestable_id', 'requestable_type'], 'checkout_requests_user_id_requestable_id_requestable_type'); }); } diff --git a/database/migrations/2018_04_02_150700_labels_display_model_name.php b/database/migrations/2018_04_02_150700_labels_display_model_name.php index 60200cdbe2..93e44bb0ba 100644 --- a/database/migrations/2018_04_02_150700_labels_display_model_name.php +++ b/database/migrations/2018_04_02_150700_labels_display_model_name.php @@ -1,8 +1,8 @@ boolean('labels_display_model')->default(0); + $table->boolean('labels_display_model')->default(0); }); } diff --git a/database/migrations/2018_04_16_133902_create_custom_field_default_values_table.php b/database/migrations/2018_04_16_133902_create_custom_field_default_values_table.php index aea8509b8b..072ed2ca19 100644 --- a/database/migrations/2018_04_16_133902_create_custom_field_default_values_table.php +++ b/database/migrations/2018_04_16_133902_create_custom_field_default_values_table.php @@ -1,8 +1,8 @@ integer('category_id')->nullable()->default(null); }); - } /** diff --git a/database/migrations/2018_05_04_075235_add_update_license_category.php b/database/migrations/2018_05_04_075235_add_update_license_category.php index 4997b0a1cf..964ca103fc 100644 --- a/database/migrations/2018_05_04_075235_add_update_license_category.php +++ b/database/migrations/2018_05_04_075235_add_update_license_category.php @@ -1,10 +1,10 @@ withTrashed() ->update(['category_id' => $category->id]); } - } /** @@ -35,7 +34,6 @@ class AddUpdateLicenseCategory extends Migration */ public function down() { - App\Models\Category::where('name', 'Misc Software')->forceDelete(); License::whereNotNull('category_id') diff --git a/database/migrations/2018_05_08_031515_add_gdpr_privacy_footer.php b/database/migrations/2018_05_08_031515_add_gdpr_privacy_footer.php index bc5de9f2c1..0207548f2a 100644 --- a/database/migrations/2018_05_08_031515_add_gdpr_privacy_footer.php +++ b/database/migrations/2018_05_08_031515_add_gdpr_privacy_footer.php @@ -1,8 +1,8 @@ index(['item_type', 'item_id', 'action_type']); $table->index(['target_type', 'target_id', 'action_type']); }); - } /** diff --git a/database/migrations/2018_05_14_223646_add_indexes_to_assets.php b/database/migrations/2018_05_14_223646_add_indexes_to_assets.php index a7161bdb53..ceff4891a2 100644 --- a/database/migrations/2018_05_14_223646_add_indexes_to_assets.php +++ b/database/migrations/2018_05_14_223646_add_indexes_to_assets.php @@ -1,8 +1,8 @@ char('version_footer', 5)->nullable()->default('on'); }); } + /** * Reverse the migrations. * diff --git a/database/migrations/2018_07_05_215440_add_unique_serial_option_to_settings.php b/database/migrations/2018_07_05_215440_add_unique_serial_option_to_settings.php index eeaeb79279..42e3c9f149 100644 --- a/database/migrations/2018_07_05_215440_add_unique_serial_option_to_settings.php +++ b/database/migrations/2018_07_05_215440_add_unique_serial_option_to_settings.php @@ -1,8 +1,8 @@ boolean('logo_print_assets')->default('0'); }); - - } /** diff --git a/database/migrations/2018_07_28_023826_create_checkout_acceptances_table.php b/database/migrations/2018_07_28_023826_create_checkout_acceptances_table.php index 8a8d32fcfa..adc9477b37 100644 --- a/database/migrations/2018_07_28_023826_create_checkout_acceptances_table.php +++ b/database/migrations/2018_07_28_023826_create_checkout_acceptances_table.php @@ -1,8 +1,8 @@ where('assigned_type', 'App\Models\User')->where('accepted', 'pending')->get(); + $assets = DB::table('assets')->where('assigned_type', \App\Models\User::class)->where('accepted', 'pending')->get(); $acceptances = []; - foreach($assets as $asset) { + foreach ($assets as $asset) { $acceptances[] = [ - 'checkoutable_type' => 'App\Models\Asset', + 'checkoutable_type' => \App\Models\Asset::class, 'checkoutable_id' => $asset->id, 'assigned_to_id' => $asset->assigned_to, ]; } - DB::table('checkout_acceptances')->insert($acceptances); + DB::table('checkout_acceptances')->insert($acceptances); } /** diff --git a/database/migrations/2018_10_18_191228_add_kits_licenses_table.php b/database/migrations/2018_10_18_191228_add_kits_licenses_table.php index 44ca2c0a24..4942942121 100644 --- a/database/migrations/2018_10_18_191228_add_kits_licenses_table.php +++ b/database/migrations/2018_10_18_191228_add_kits_licenses_table.php @@ -1,36 +1,35 @@ increments('id'); - $table->integer('kit_id')->nullable()->default(NULL); - $table->integer('license_id')->nullable()->default(NULL); + $table->integer('kit_id')->nullable()->default(null); + $table->integer('license_id')->nullable()->default(null); $table->integer('quantity')->default(1); $table->timestamps(); }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - // - Schema::drop('kits_licenses'); - } + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::drop('kits_licenses'); + } } diff --git a/database/migrations/2018_10_19_153910_add_kits_table.php b/database/migrations/2018_10_19_153910_add_kits_table.php index 949c150146..04e9290aba 100644 --- a/database/migrations/2018_10_19_153910_add_kits_table.php +++ b/database/migrations/2018_10_19_153910_add_kits_table.php @@ -1,37 +1,34 @@ increments('id'); - $table->string('name')->nullable()->default(NULL); + $table->string('name')->nullable()->default(null); $table->timestamps(); $table->engine = 'InnoDB'; }); + } - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - // - Schema::drop('kits'); - - } - + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::drop('kits'); + } } diff --git a/database/migrations/2018_10_19_154013_add_kits_models_table.php b/database/migrations/2018_10_19_154013_add_kits_models_table.php index a0abeeef7b..0f62dd45ef 100644 --- a/database/migrations/2018_10_19_154013_add_kits_models_table.php +++ b/database/migrations/2018_10_19_154013_add_kits_models_table.php @@ -1,36 +1,35 @@ increments('id'); - $table->integer('kit_id')->nullable()->default(NULL); - $table->integer('model_id')->nullable()->default(NULL); + $table->integer('kit_id')->nullable()->default(null); + $table->integer('model_id')->nullable()->default(null); $table->integer('quantity')->default(1); $table->timestamps(); }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - // - Schema::drop('kits_models'); - } + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::drop('kits_models'); + } } diff --git a/database/migrations/2018_12_05_211936_add_favicon_to_settings.php b/database/migrations/2018_12_05_211936_add_favicon_to_settings.php index 570eb53926..067ef30b91 100644 --- a/database/migrations/2018_12_05_211936_add_favicon_to_settings.php +++ b/database/migrations/2018_12_05_211936_add_favicon_to_settings.php @@ -1,8 +1,8 @@ increments('id'); - $table->integer('kit_id')->nullable()->default(NULL); - $table->integer('consumable_id')->nullable()->default(NULL); + $table->integer('kit_id')->nullable()->default(null); + $table->integer('consumable_id')->nullable()->default(null); $table->integer('quantity')->default(1); $table->timestamps(); }); @@ -31,6 +31,6 @@ class AddKitsConsumablesTable extends Migration public function down() { // - Schema::drop('kits_consumables'); + Schema::drop('kits_consumables'); } } diff --git a/database/migrations/2019_02_07_190030_add_kits_accessories_table.php b/database/migrations/2019_02_07_190030_add_kits_accessories_table.php index f0e80249db..12e20beba2 100644 --- a/database/migrations/2019_02_07_190030_add_kits_accessories_table.php +++ b/database/migrations/2019_02_07_190030_add_kits_accessories_table.php @@ -1,8 +1,8 @@ increments('id'); - $table->integer('kit_id')->nullable()->default(NULL); - $table->integer('accessory_id')->nullable()->default(NULL); + $table->integer('kit_id')->nullable()->default(null); + $table->integer('accessory_id')->nullable()->default(null); $table->integer('quantity')->default(1); $table->timestamps(); }); @@ -31,6 +31,6 @@ class AddKitsAccessoriesTable extends Migration public function down() { // - Schema::drop('kits_accessories'); + Schema::drop('kits_accessories'); } } diff --git a/database/migrations/2019_02_12_182750_add_actiondate_to_actionlog.php b/database/migrations/2019_02_12_182750_add_actiondate_to_actionlog.php index 053b793b9a..1bbff083ae 100644 --- a/database/migrations/2019_02_12_182750_add_actiondate_to_actionlog.php +++ b/database/migrations/2019_02_12_182750_add_actiondate_to_actionlog.php @@ -1,8 +1,8 @@ select('created_at', 'id')->where('action_type', 'checkout')->orWhere('action_type', 'checkin from')->get(); - foreach($results as $result){ + foreach ($results as $result) { $update = DB::update('update '.DB::getTablePrefix().'action_logs set action_date=? where id=?', [$result->created_at, $result->id]); } } diff --git a/database/migrations/2019_02_14_154310_change_auto_increment_prefix_to_nullable.php b/database/migrations/2019_02_14_154310_change_auto_increment_prefix_to_nullable.php index faf24747d1..4808209d21 100644 --- a/database/migrations/2019_02_14_154310_change_auto_increment_prefix_to_nullable.php +++ b/database/migrations/2019_02_14_154310_change_auto_increment_prefix_to_nullable.php @@ -1,8 +1,8 @@ string('city')->nullable()->default(null)->change(); $table->string('state')->nullable()->default(null)->change(); diff --git a/database/migrations/2019_04_06_060145_add_user_skin_setting.php b/database/migrations/2019_04_06_060145_add_user_skin_setting.php index efe1f94c48..475f0c6aec 100644 --- a/database/migrations/2019_04_06_060145_add_user_skin_setting.php +++ b/database/migrations/2019_04_06_060145_add_user_skin_setting.php @@ -1,8 +1,8 @@ dropColumn('allow_user_skin'); }); } -} \ No newline at end of file +} diff --git a/database/migrations/2019_06_12_184327_rename_groups_table.php b/database/migrations/2019_06_12_184327_rename_groups_table.php index 3c50971614..58dafbc8f6 100644 --- a/database/migrations/2019_06_12_184327_rename_groups_table.php +++ b/database/migrations/2019_06_12_184327_rename_groups_table.php @@ -1,8 +1,8 @@ string('login_remote_user_header_name')->default(""); + $table->string('login_remote_user_header_name')->default(''); }); } diff --git a/database/migrations/2020_02_04_172100_add_ad_append_domain_settings.php b/database/migrations/2020_02_04_172100_add_ad_append_domain_settings.php index aced0bf111..e5b62c8ce6 100644 --- a/database/migrations/2020_02_04_172100_add_ad_append_domain_settings.php +++ b/database/migrations/2020_02_04_172100_add_ad_append_domain_settings.php @@ -1,9 +1,9 @@ ad_append_domain = 1; $s->save(); } -} + } /** * Reverse the migrations. diff --git a/database/migrations/2020_04_29_222305_add_saml_fields_to_settings.php b/database/migrations/2020_04_29_222305_add_saml_fields_to_settings.php index 90c656ce24..dd23aed1b6 100644 --- a/database/migrations/2020_04_29_222305_add_saml_fields_to_settings.php +++ b/database/migrations/2020_04_29_222305_add_saml_fields_to_settings.php @@ -1,48 +1,45 @@ boolean('saml_enabled')->default(0); - $table->text('saml_idp_metadata')->nullable()->default(NULL); - $table->string('saml_attr_mapping_username')->nullable()->default(NULL); +class AddSamlFieldsToSettings extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::table('settings', function (Blueprint $table) { + $table->boolean('saml_enabled')->default(0); + $table->text('saml_idp_metadata')->nullable()->default(null); + $table->string('saml_attr_mapping_username')->nullable()->default(null); $table->boolean('saml_forcelogin')->default(0); - $table->boolean('saml_slo')->default(0); - $table->text('saml_sp_x509cert')->nullable()->default(NULL); - $table->text('saml_sp_privatekey')->nullable()->default(NULL); - $table->text('saml_custom_settings')->nullable()->default(NULL); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::table('settings', function(Blueprint $table) - { - $table->dropColumn('saml_enabled'); - $table->dropColumn('saml_idp_metadata'); - $table->dropColumn('saml_attr_mapping_username'); - $table->dropColumn('saml_forcelogin'); - $table->dropColumn('saml_slo'); - $table->dropColumn('saml_sp_x509cert'); - $table->dropColumn('saml_sp_privatekey'); - $table->dropColumn('saml_custom_settings'); - }); - } + $table->boolean('saml_slo')->default(0); + $table->text('saml_sp_x509cert')->nullable()->default(null); + $table->text('saml_sp_privatekey')->nullable()->default(null); + $table->text('saml_custom_settings')->nullable()->default(null); + }); + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('settings', function (Blueprint $table) { + $table->dropColumn('saml_enabled'); + $table->dropColumn('saml_idp_metadata'); + $table->dropColumn('saml_attr_mapping_username'); + $table->dropColumn('saml_forcelogin'); + $table->dropColumn('saml_slo'); + $table->dropColumn('saml_sp_x509cert'); + $table->dropColumn('saml_sp_privatekey'); + $table->dropColumn('saml_custom_settings'); + }); + } } diff --git a/database/migrations/2020_08_11_200712_add_saml_key_rollover.php b/database/migrations/2020_08_11_200712_add_saml_key_rollover.php index 42a3e24dcd..7b81f2b1ca 100644 --- a/database/migrations/2020_08_11_200712_add_saml_key_rollover.php +++ b/database/migrations/2020_08_11_200712_add_saml_key_rollover.php @@ -13,8 +13,8 @@ class AddSamlKeyRollover extends Migration */ public function up() { - Schema::table('settings', function(Blueprint $table) { - $table->text('saml_sp_x509certNew')->nullable()->default(NULL); + Schema::table('settings', function (Blueprint $table) { + $table->text('saml_sp_x509certNew')->nullable()->default(null); }); } @@ -25,7 +25,7 @@ class AddSamlKeyRollover extends Migration */ public function down() { - Schema::table('settings', function(Blueprint $table) { + Schema::table('settings', function (Blueprint $table) { $table->dropColumn('saml_sp_x509certNew'); }); } diff --git a/database/migrations/2020_10_22_233743_move_accessory_checkout_note_to_join_table.php b/database/migrations/2020_10_22_233743_move_accessory_checkout_note_to_join_table.php index bfa9a7e362..e6398909d3 100644 --- a/database/migrations/2020_10_22_233743_move_accessory_checkout_note_to_join_table.php +++ b/database/migrations/2020_10_22_233743_move_accessory_checkout_note_to_join_table.php @@ -1,10 +1,10 @@ string('note')->nullable(true)->default(null); - }); + + if (!Schema::hasColumn('accessories_users', 'note')) + { + Schema::table('accessories_users', function (Blueprint $table) { + $table->string('note')->nullable(true)->default(null); + }); + } + + + // Loop through the checked out accessories, find their related action_log entry, and copy over the note // to the newly created note field $accessories = Accessory::get(); $count = 0; - \Log::debug('Accessory Count: '. $accessories->count()); - + \Log::debug('Accessory Count: '.$accessories->count()); // Loop through all of the accessories foreach ($accessories as $accessory) { @@ -37,22 +43,23 @@ class MoveAccessoryCheckoutNoteToJoinTable extends Migration // Loop through the accessories_users records foreach ($join_logs as $join_log) { \Log::debug($join_logs->count().' join log records'); - \Log::debug('Looking for accessories_users that match '. $join_log->created_at); + \Log::debug('Looking for accessories_users that match '.$join_log->created_at); // Get the records from action_logs so we can copy the notes over to the new notes field // on the accessories_users table - $action_log_entries = Actionlog::where('created_at', '=',$join_log->created_at) - ->where('target_id', '=',$join_log->assigned_to) - ->where('item_id', '=',$accessory->id) - ->where('target_type', '=','App\\Models\\User') + $action_log_entries = Actionlog::where('created_at', '=', $join_log->created_at) + ->where('target_id', '=', $join_log->assigned_to) + ->where('item_id', '=', $accessory->id) + ->where('target_type', '=', \App\Models\User::class) + ->where('item_type', '=','App\\Models\\Accessory') ->where('action_type', '=', 'checkout') + ->where('note', '!=', '') ->orderBy('created_at', 'DESC')->get(); \Log::debug($action_log_entries->count().' matching entries in the action_logs table'); - \Log::debug('Looking for action_logs that match '. $join_log->created_at); + \Log::debug('Looking for action_logs that match '.$join_log->created_at); foreach ($action_log_entries as $action_log_entry) { - \Log::debug('Checkout date in asset log: '.$action_log_entry->created_at.' against accessories_users: '.$join_log->created_at); \Log::debug('Action log: '.$action_log_entry->created_at); \Log::debug('Join log: '.$join_log->created_at); @@ -65,14 +72,8 @@ class MoveAccessoryCheckoutNoteToJoinTable extends Migration \Log::debug('No match'); } } - } - - - } - - } /** @@ -82,8 +83,15 @@ class MoveAccessoryCheckoutNoteToJoinTable extends Migration */ public function down() { - Schema::table('accessories_users', function (Blueprint $table) { - $table->dropColumn('note'); - }); + + if (Schema::hasColumn('accessories_users', 'note')) + { + Schema::table('accessories_users', function (Blueprint $table) + { + $table->dropColumn('note'); + }); + } + + } } diff --git a/database/migrations/2020_10_23_161736_fix_zero_values_for_locations.php b/database/migrations/2020_10_23_161736_fix_zero_values_for_locations.php index 66685c8e41..110a6c3e91 100644 --- a/database/migrations/2020_10_23_161736_fix_zero_values_for_locations.php +++ b/database/migrations/2020_10_23_161736_fix_zero_values_for_locations.php @@ -1,10 +1,10 @@ update(['location_id' => null]); - } /** diff --git a/database/migrations/2020_12_14_233815_add_digit_separator_to_settings.php b/database/migrations/2020_12_14_233815_add_digit_separator_to_settings.php index 8a5471233e..e6b93bf964 100644 --- a/database/migrations/2020_12_14_233815_add_digit_separator_to_settings.php +++ b/database/migrations/2020_12_14_233815_add_digit_separator_to_settings.php @@ -1,8 +1,8 @@ char('digit_separator')->nullable()->default('1234.56'); + $table->char('digit_separator')->nullable()->default('1,234.56'); }); } diff --git a/database/migrations/2020_12_21_210105_fix_bad_ldap_server_url_for_v5.php b/database/migrations/2020_12_21_210105_fix_bad_ldap_server_url_for_v5.php index 04a1530a82..a038251cd5 100644 --- a/database/migrations/2020_12_21_210105_fix_bad_ldap_server_url_for_v5.php +++ b/database/migrations/2020_12_21_210105_fix_bad_ldap_server_url_for_v5.php @@ -7,13 +7,13 @@ use Illuminate\Support\Facades\Schema; class FixBadLdapServerUrlForV5 extends Migration { /** - * Under v4 and previous versions of Snipe-IT, we permitted users to incorrectly specify LDAP URL's in their settings, and Snipe-IT + * Under v4 and previous versions of Snipe-IT, we permitted users to incorrectly specify LDAP URL's in their settings, and Snipe-IT * would silently permit that. - * + * * v5's LDAP system is not so lenient, and requires either ldap:// or ldaps:// in front of the server's URL. This migration tries * to find misconfigured LDAP URL's and prepend 'ldap://' to them. (That's what we assumed if we *didn't* see ldaps://) */ - + /** * Run the migrations. * @@ -22,9 +22,9 @@ class FixBadLdapServerUrlForV5 extends Migration public function up() { // UPDATE settings SET ldap_server = CONCAT('ldap://',ldap_server) WHERE ldap_server NOT LIKE 'ldap://%' AND ldap_server NOT LIKE 'ldaps://%' - $settings = App\Models\Setting::where("ldap_server","not like","ldap://%")->where("ldap_server","not like","ldaps://%"); - foreach($settings->get() AS $setting) { // we don't formally support having multiple settings records, but just in case they come up... - $setting->ldap_server = "ldap://".$setting->ldap_server; + $settings = App\Models\Setting::where('ldap_server', 'not like', 'ldap://%')->where('ldap_server', 'not like', 'ldaps://%'); + foreach ($settings->get() as $setting) { // we don't formally support having multiple settings records, but just in case they come up... + $setting->ldap_server = 'ldap://'.$setting->ldap_server; $setting->save(); } } diff --git a/database/migrations/2021_02_05_172502_add_provider_to_oauth_table.php b/database/migrations/2021_02_05_172502_add_provider_to_oauth_table.php index b2dff776e7..0f9164c08d 100644 --- a/database/migrations/2021_02_05_172502_add_provider_to_oauth_table.php +++ b/database/migrations/2021_02_05_172502_add_provider_to_oauth_table.php @@ -15,7 +15,7 @@ class AddProviderToOauthTable extends Migration public function up() { // Add a 'provider' column if not existing or else modify it - if (!Schema::hasColumn('oauth_clients', 'provider')) { + if (! Schema::hasColumn('oauth_clients', 'provider')) { Schema::table('oauth_clients', function (Blueprint $table) { $table->string('provider')->after('secret')->nullable(); }); diff --git a/database/migrations/2021_04_07_001811_add_ldap_dept.php b/database/migrations/2021_04_07_001811_add_ldap_dept.php index 5557a6747f..7ce62e8709 100644 --- a/database/migrations/2021_04_07_001811_add_ldap_dept.php +++ b/database/migrations/2021_04_07_001811_add_ldap_dept.php @@ -27,7 +27,6 @@ class AddLdapDept extends Migration { Schema::table('settings', function (Blueprint $table) { $table->dropColumn('ldap_dept'); - }); } } diff --git a/database/migrations/2021_04_14_180125_add_ids_to_tables.php b/database/migrations/2021_04_14_180125_add_ids_to_tables.php index 22cf03ebf9..07172164fe 100644 --- a/database/migrations/2021_04_14_180125_add_ids_to_tables.php +++ b/database/migrations/2021_04_14_180125_add_ids_to_tables.php @@ -13,23 +13,19 @@ class AddIdsToTables extends Migration */ public function up() { - Schema::table('migrations', function (Blueprint $table) { // Add the id column to the migrations table if it doesn't yet have one - if (!Schema::hasColumn('migrations', 'id')) { + if (! Schema::hasColumn('migrations', 'id')) { $table->increments('id'); } }); Schema::table('password_resets', function (Blueprint $table) { // Add the id column to the password_resets table if it doesn't yet have one - if (!Schema::hasColumn('password_resets', 'id')) { + if (! Schema::hasColumn('password_resets', 'id')) { $table->increments('id'); } }); - - - } /** diff --git a/database/migrations/2021_06_07_155421_add_serial_number_indexes.php b/database/migrations/2021_06_07_155421_add_serial_number_indexes.php new file mode 100644 index 0000000000..3673489c7e --- /dev/null +++ b/database/migrations/2021_06_07_155421_add_serial_number_indexes.php @@ -0,0 +1,32 @@ +index(['serial']); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('assets', function (Blueprint $table) { + $table->dropIndex(['serial']); + }); + } +} diff --git a/database/migrations/2021_06_07_155436_add_company_id_indexes.php b/database/migrations/2021_06_07_155436_add_company_id_indexes.php new file mode 100644 index 0000000000..f4a83800cd --- /dev/null +++ b/database/migrations/2021_06_07_155436_add_company_id_indexes.php @@ -0,0 +1,88 @@ +index(['company_id']); + }); + + Schema::table('action_logs', function (Blueprint $table) { + $table->index(['company_id']); + }); + + Schema::table('assets', function (Blueprint $table) { + $table->index(['company_id']); + }); + + Schema::table('components', function (Blueprint $table) { + $table->index(['company_id']); + }); + + Schema::table('consumables', function (Blueprint $table) { + $table->index(['company_id']); + }); + + Schema::table('departments', function (Blueprint $table) { + $table->index(['company_id']); + }); + + Schema::table('licenses', function (Blueprint $table) { + $table->index(['company_id']); + }); + + Schema::table('users', function (Blueprint $table) { + $table->index(['company_id']); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('users', function (Blueprint $table) { + $table->dropIndex(['company_id']); + }); + + Schema::table('licenses', function (Blueprint $table) { + $table->dropIndex(['company_id']); + }); + + Schema::table('departments', function (Blueprint $table) { + $table->dropIndex(['company_id']); + }); + + Schema::table('consumables', function (Blueprint $table) { + $table->dropIndex(['company_id']); + }); + + Schema::table('components', function (Blueprint $table) { + $table->dropIndex(['company_id']); + }); + + Schema::table('assets', function (Blueprint $table) { + $table->dropIndex(['company_id']); + }); + + Schema::table('action_logs', function (Blueprint $table) { + $table->dropIndex(['company_id']); + }); + + Schema::table('accessories', function (Blueprint $table) { + $table->dropIndex(['company_id']); + }); + } +} diff --git a/database/migrations/2021_07_28_031345_add_client_side_l_d_a_p_cert_to_settings.php b/database/migrations/2021_07_28_031345_add_client_side_l_d_a_p_cert_to_settings.php new file mode 100644 index 0000000000..8dae5eb724 --- /dev/null +++ b/database/migrations/2021_07_28_031345_add_client_side_l_d_a_p_cert_to_settings.php @@ -0,0 +1,32 @@ +text('ldap_client_tls_cert')->nullable()->default(null); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('settings', function (Blueprint $table) { + $table->dropColumn('ldap_client_tls_cert'); + }); + } +} diff --git a/database/migrations/2021_07_28_040554_add_client_side_l_d_a_p_key_to_settings.php b/database/migrations/2021_07_28_040554_add_client_side_l_d_a_p_key_to_settings.php new file mode 100644 index 0000000000..46feeea9f0 --- /dev/null +++ b/database/migrations/2021_07_28_040554_add_client_side_l_d_a_p_key_to_settings.php @@ -0,0 +1,32 @@ +text("ldap_client_tls_key")->nullable()->default(null); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('settings', function (Blueprint $table) { + $table->dropColumn("ldap_client_tls_key"); + }); + } +} diff --git a/database/migrations/2021_08_11_005206_add_depreciation_minimum_value.php b/database/migrations/2021_08_11_005206_add_depreciation_minimum_value.php new file mode 100644 index 0000000000..a6a646e127 --- /dev/null +++ b/database/migrations/2021_08_11_005206_add_depreciation_minimum_value.php @@ -0,0 +1,32 @@ +decimal('depreciation_min', 8,2)->after('months')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('depreciations', function (Blueprint $table) { + $table->dropColumn('depreciation_min'); + }); + } +} diff --git a/database/migrations/2021_08_24_124354_make_ldap_client_certs_nullable.php b/database/migrations/2021_08_24_124354_make_ldap_client_certs_nullable.php new file mode 100644 index 0000000000..64cef2f243 --- /dev/null +++ b/database/migrations/2021_08_24_124354_make_ldap_client_certs_nullable.php @@ -0,0 +1,34 @@ +text('ldap_client_tls_cert')->nullable()->change(); + $table->text('ldap_client_tls_key')->nullable()->change(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('settings', function (Blueprint $table) { + // + }); + } +} diff --git a/database/migrations/2021_09_20_183216_change_default_label_to_nullable.php b/database/migrations/2021_09_20_183216_change_default_label_to_nullable.php new file mode 100644 index 0000000000..72d9c8c2be --- /dev/null +++ b/database/migrations/2021_09_20_183216_change_default_label_to_nullable.php @@ -0,0 +1,46 @@ +update(['default_label' => 0]); + + Statuslabel::whereNull('show_in_nav') + ->update(['show_in_nav' => 0]); + + + Schema::table('status_labels', function (Blueprint $table) { + $table->boolean('default_label')->nullable()->default(0)->change(); + $table->boolean('show_in_nav')->nullable()->default(0)->change(); + }); + + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } +} diff --git a/database/seeds/.gitkeep b/database/seeders/.gitkeep similarity index 100% rename from database/seeds/.gitkeep rename to database/seeders/.gitkeep diff --git a/database/seeders/AccessorySeeder.php b/database/seeders/AccessorySeeder.php new file mode 100644 index 0000000000..6c4123c08b --- /dev/null +++ b/database/seeders/AccessorySeeder.php @@ -0,0 +1,47 @@ +truncate(); + Accessory::factory()->count(1)->appleUsbKeyboard()->create(); + Accessory::factory()->count(1)->appleBtKeyboard()->create(); + Accessory::factory()->count(1)->appleMouse()->create(); + Accessory::factory()->count(1)->microsoftMouse()->create(); + + $src = public_path('/img/demo/accessories/'); + $dst = 'accessories'.'/'; + $del_files = Storage::files($dst); + + foreach ($del_files as $del_file) { // iterate files + $file_to_delete = str_replace($src, '', $del_file); + Log::debug('Deleting: '.$file_to_delete); + try { + Storage::disk('public')->delete($dst.$del_file); + } catch (\Exception $e) { + Log::debug($e); + } + } + + $add_files = glob($src.'/*.*'); + foreach ($add_files as $add_file) { + $file_to_copy = str_replace($src, '', $add_file); + Log::debug('Copying: '.$file_to_copy); + try { + Storage::disk('public')->put($dst.$file_to_copy, file_get_contents($src.$file_to_copy)); + } catch (\Exception $e) { + Log::debug($e); + } + } + } +} diff --git a/database/seeders/ActionlogSeeder.php b/database/seeders/ActionlogSeeder.php new file mode 100644 index 0000000000..06eb27bdeb --- /dev/null +++ b/database/seeders/ActionlogSeeder.php @@ -0,0 +1,18 @@ +count(300)->assetCheckoutToUser()->create(); + Actionlog::factory()->count(100)->assetCheckoutToLocation()->create(); + + + } +} diff --git a/database/seeders/AssetModelSeeder.php b/database/seeders/AssetModelSeeder.php new file mode 100755 index 0000000000..0652fbfb84 --- /dev/null +++ b/database/seeders/AssetModelSeeder.php @@ -0,0 +1,71 @@ +count(1)->mbp13Model()->create(); // 1 + AssetModel::factory()->count(1)->mbpAirModel()->create(); // 2 + AssetModel::factory()->count(1)->surfaceModel()->create(); // 3 + AssetModel::factory()->count(1)->xps13Model()->create(); // 4 + AssetModel::factory()->count(1)->spectreModel()->create(); // 5 + AssetModel::factory()->count(1)->zenbookModel()->create(); // 6 + AssetModel::factory()->count(1)->yogaModel()->create(); // 7 + + // Desktops + AssetModel::factory()->count(1)->macproModel()->create(); // 8 + AssetModel::factory()->count(1)->lenovoI5Model()->create(); // 9 + AssetModel::factory()->count(1)->optiplexModel()->create(); // 10 + + // Conference Phones + AssetModel::factory()->count(1)->polycomModel()->create(); // 11 + AssetModel::factory()->count(1)->polycomcxModel()->create(); // 12 + + // Tablets + AssetModel::factory()->count(1)->ipadModel()->create(); // 13 + AssetModel::factory()->count(1)->tab3Model()->create(); // 14 + + // Phones + AssetModel::factory()->count(1)->iphone11Model()->create(); // 15 + AssetModel::factory()->count(1)->iphone12Model()->create(); // 16 + + // Displays + AssetModel::factory()->count(1)->ultrafine()->create(); // 17 + AssetModel::factory()->count(1)->ultrasharp()->create(); // 18 + + $src = public_path('/img/demo/models/'); + $dst = 'models'.'/'; + $del_files = Storage::files($dst); + + foreach ($del_files as $del_file) { // iterate files + $file_to_delete = str_replace($src, '', $del_file); + Log::debug('Deleting: '.$file_to_delete); + try { + Storage::disk('public')->delete($dst.$del_file); + } catch (\Exception $e) { + Log::debug($e); + } + } + + $add_files = glob($src.'/*.*'); + foreach ($add_files as $add_file) { + $file_to_copy = str_replace($src, '', $add_file); + Log::debug('Copying: '.$file_to_copy); + try { + Storage::disk('public')->put($dst.$file_to_copy, file_get_contents($src.$file_to_copy)); + } catch (\Exception $e) { + Log::debug($e); + } + } + } +} diff --git a/database/seeders/AssetSeeder.php b/database/seeders/AssetSeeder.php new file mode 100644 index 0000000000..c5ea479a34 --- /dev/null +++ b/database/seeders/AssetSeeder.php @@ -0,0 +1,54 @@ +count(1000)->laptopMbp()->create(); + Asset::factory()->count(50)->laptopMbpPending()->create(); + Asset::factory()->count(50)->laptopMbpArchived()->create(); + Asset::factory()->count(50)->laptopAir()->create(); + Asset::factory()->count(5)->laptopSurface()->create(); + Asset::factory()->count(5)->laptopXps()->create(); + Asset::factory()->count(5)->laptopSpectre()->create(); + Asset::factory()->count(5)->laptopZenbook()->create(); + Asset::factory()->count(3)->laptopYoga()->create(); + + Asset::factory()->count(30)->desktopMacpro()->create(); + Asset::factory()->count(30)->desktopLenovoI5()->create(); + Asset::factory()->count(30)->desktopOptiplex()->create(); + + Asset::factory()->count(5)->confPolycom()->create(); + Asset::factory()->count(2)->confPolycomcx()->create(); + + Asset::factory()->count(12)->tabletIpad()->create(); + Asset::factory()->count(4)->tabletTab3()->create(); + + Asset::factory()->count(27)->phoneIphone11()->create(); + Asset::factory()->count(40)->phoneIphone12()->create(); + + Asset::factory()->count(10)->ultrafine()->create(); + Asset::factory()->count(10)->ultrasharp()->create(); + + $del_files = Storage::files('assets'); + foreach ($del_files as $del_file) { // iterate files + Log::debug('Deleting: '.$del_files); + try { + Storage::disk('public')->delete('assets'.'/'.$del_files); + } catch (\Exception $e) { + Log::debug($e); + } + } + + DB::table('checkout_requests')->truncate(); + } +} diff --git a/database/seeders/CategorySeeder.php b/database/seeders/CategorySeeder.php new file mode 100755 index 0000000000..6a554fc825 --- /dev/null +++ b/database/seeders/CategorySeeder.php @@ -0,0 +1,30 @@ +count(1)->assetLaptopCategory()->create(); // 1 + Category::factory()->count(1)->assetDesktopCategory()->create(); // 2 + Category::factory()->count(1)->assetTabletCategory()->create(); // 3 + Category::factory()->count(1)->assetMobileCategory()->create(); // 4 + Category::factory()->count(1)->assetDisplayCategory()->create(); // 5 + Category::factory()->count(1)->assetVoipCategory()->create(); // 6 + Category::factory()->count(1)->assetConferenceCategory()->create(); // 7 + Category::factory()->count(1)->accessoryKeyboardCategory()->create(); // 8 + Category::factory()->count(1)->accessoryMouseCategory()->create(); // 9 + Category::factory()->count(1)->consumablePaperCategory()->create(); // 10 + Category::factory()->count(1)->consumableInkCategory()->create(); // 11 + Category::factory()->count(1)->componentHddCategory()->create(); // 12 + Category::factory()->count(1)->componentRamCategory()->create(); // 13 + Category::factory()->count(1)->licenseGraphicsCategory()->create(); // 14 + Category::factory()->count(1)->licenseOfficeCategory()->create(); // 15 + } +} diff --git a/database/seeds/CompanySeeder.php b/database/seeders/CompanySeeder.php similarity index 50% rename from database/seeds/CompanySeeder.php rename to database/seeders/CompanySeeder.php index eeae5492b7..04f9190f7c 100644 --- a/database/seeds/CompanySeeder.php +++ b/database/seeders/CompanySeeder.php @@ -1,7 +1,11 @@ create(); - + Company::factory()->count(4)->create(); $src = public_path('/img/demo/companies/'); $dst = 'companies'.'/'; $del_files = Storage::files('companies/'.$dst); - foreach($del_files as $del_file){ // iterate files - $file_to_delete = str_replace($src,'',$del_file); - \Log::debug('Deleting: '.$file_to_delete); - try { + foreach ($del_files as $del_file) { // iterate files + $file_to_delete = str_replace($src, '', $del_file); + Log::debug('Deleting: '.$file_to_delete); + try { Storage::disk('public')->delete($dst.$del_file); } catch (\Exception $e) { - \Log::debug($e); + Log::debug($e); } } - - $add_files = glob($src."/*.*"); - foreach($add_files as $add_file){ - $file_to_copy = str_replace($src,'',$add_file); - \Log::debug('Copying: '.$file_to_copy); - try { + $add_files = glob($src.'/*.*'); + foreach ($add_files as $add_file) { + $file_to_copy = str_replace($src, '', $add_file); + Log::debug('Copying: '.$file_to_copy); + try { Storage::disk('public')->put($dst.$file_to_copy, file_get_contents($src.$file_to_copy)); } catch (\Exception $e) { - \Log::debug($e); + Log::debug($e); } } - - } } diff --git a/database/seeders/ComponentSeeder.php b/database/seeders/ComponentSeeder.php new file mode 100644 index 0000000000..46380e1682 --- /dev/null +++ b/database/seeders/ComponentSeeder.php @@ -0,0 +1,20 @@ +truncate(); + Component::factory()->count(1)->ramCrucial4()->create(); // 1 + Component::factory()->count(1)->ramCrucial8()->create(); // 1 + Component::factory()->count(1)->ssdCrucial120()->create(); // 1 + Component::factory()->count(1)->ssdCrucial240()->create(); // 1 + } +} diff --git a/database/seeders/ConsumableSeeder.php b/database/seeders/ConsumableSeeder.php new file mode 100644 index 0000000000..240741fe6d --- /dev/null +++ b/database/seeders/ConsumableSeeder.php @@ -0,0 +1,19 @@ +truncate(); + Consumable::factory()->count(1)->cardstock()->create(); // 1 + Consumable::factory()->count(1)->paper()->create(); // 2 + Consumable::factory()->count(1)->ink()->create(); // 3 + } +} diff --git a/database/seeders/CustomFieldSeeder.php b/database/seeders/CustomFieldSeeder.php new file mode 100644 index 0000000000..8776872644 --- /dev/null +++ b/database/seeders/CustomFieldSeeder.php @@ -0,0 +1,61 @@ +getColumnListing('assets'); + + foreach ($columns as $column) { + if (strpos($column, '_snipeit_') !== false) { + Schema::table('assets', function (Blueprint $table) use ($column) { + $table->dropColumn($column); + }); + } + } + CustomField::truncate(); + CustomFieldset::truncate(); + DB::table('custom_field_custom_fieldset')->truncate(); + + CustomFieldset::factory()->count(1)->mobile()->create(); + CustomFieldset::factory()->count(1)->computer()->create(); + CustomField::factory()->count(1)->imei()->create(); + CustomField::factory()->count(1)->phone()->create(); + CustomField::factory()->count(1)->ram()->create(); + CustomField::factory()->count(1)->cpu()->create(); + CustomField::factory()->count(1)->macAddress()->create(); + + DB::table('custom_field_custom_fieldset')->insert([ + [ + 'custom_field_id' => '1', + 'custom_fieldset_id' => '1', + ], + [ + 'custom_field_id' => '2', + 'custom_fieldset_id' => '1', + ], + [ + 'custom_field_id' => '3', + 'custom_fieldset_id' => '2', + ], + [ + 'custom_field_id' => '4', + 'custom_fieldset_id' => '2', + ], + [ + 'custom_field_id' => '5', + 'custom_fieldset_id' => '2', + ], + + ]); + } +} diff --git a/database/seeds/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php similarity index 71% rename from database/seeds/DatabaseSeeder.php rename to database/seeders/DatabaseSeeder.php index f90326c058..54fb1e088b 100644 --- a/database/seeds/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -1,8 +1,22 @@ create(); + if (! Setting::first()) { + // factory(Setting::class)->create(); $this->call(SettingsSeeder::class); } @@ -40,17 +54,14 @@ class DatabaseSeeder extends Seeder $this->call(ActionlogSeeder::class); $this->call(CustomFieldSeeder::class); - Artisan::call('snipeit:sync-asset-locations', ['--output' => 'all']); $output = Artisan::output(); - \Log::info($output); + Log::info($output); Model::reguard(); DB::table('imports')->truncate(); DB::table('asset_maintenances')->truncate(); DB::table('requested_assets')->truncate(); - - } } diff --git a/database/seeders/DepartmentSeeder.php b/database/seeders/DepartmentSeeder.php new file mode 100644 index 0000000000..f82e355edd --- /dev/null +++ b/database/seeders/DepartmentSeeder.php @@ -0,0 +1,20 @@ +count(1)->hr()->create(); // 1 + Department::factory()->count(1)->engineering()->create(); // 2 + Department::factory()->count(1)->marketing()->create(); // 3 + Department::factory()->count(1)->client()->create(); // 4 + Department::factory()->count(1)->product()->create(); // 5 + Department::factory()->count(1)->silly()->create(); // 6 + } +} diff --git a/database/seeders/DepreciationSeeder.php b/database/seeders/DepreciationSeeder.php new file mode 100644 index 0000000000..1dfebd3062 --- /dev/null +++ b/database/seeders/DepreciationSeeder.php @@ -0,0 +1,17 @@ +count(1)->computer()->create(); // 1 + Depreciation::factory()->count(1)->display()->create(); // 2 + Depreciation::factory()->count(1)->mobilePhones()->create(); // 3 + } +} diff --git a/database/seeders/LicenseSeeder.php b/database/seeders/LicenseSeeder.php new file mode 100644 index 0000000000..843eeb42f1 --- /dev/null +++ b/database/seeders/LicenseSeeder.php @@ -0,0 +1,20 @@ +count(1)->photoshop()->create(); + License::factory()->count(1)->acrobat()->create(); + License::factory()->count(1)->indesign()->create(); + License::factory()->count(1)->office()->create(); + } +} diff --git a/database/seeds/LocationSeeder.php b/database/seeders/LocationSeeder.php similarity index 51% rename from database/seeds/LocationSeeder.php rename to database/seeders/LocationSeeder.php index f7d857f34d..4a98ecb9e8 100644 --- a/database/seeds/LocationSeeder.php +++ b/database/seeders/LocationSeeder.php @@ -1,6 +1,10 @@ create(); + Location::factory()->count(10)->create(); $src = public_path('/img/demo/locations/'); $dst = 'locations'.'/'; $del_files = Storage::files($dst); - foreach($del_files as $del_file){ // iterate files - $file_to_delete = str_replace($src,'',$del_file); - \Log::debug('Deleting: '.$file_to_delete); - try { + foreach ($del_files as $del_file) { // iterate files + $file_to_delete = str_replace($src, '', $del_file); + Log::debug('Deleting: '.$file_to_delete); + try { Storage::disk('public')->delete($dst.$del_file); } catch (\Exception $e) { - \Log::debug($e); + Log::debug($e); } } - - $add_files = glob($src."/*.*"); - foreach($add_files as $add_file){ - $file_to_copy = str_replace($src,'',$add_file); - \Log::debug('Copying: '.$file_to_copy); - try { + $add_files = glob($src.'/*.*'); + foreach ($add_files as $add_file) { + $file_to_copy = str_replace($src, '', $add_file); + Log::debug('Copying: '.$file_to_copy); + try { Storage::disk('public')->put($dst.$file_to_copy, file_get_contents($src.$file_to_copy)); } catch (\Exception $e) { - \Log::debug($e); + Log::debug($e); } } - } } diff --git a/database/seeders/ManufacturerSeeder.php b/database/seeders/ManufacturerSeeder.php new file mode 100644 index 0000000000..fc6a3c34e9 --- /dev/null +++ b/database/seeders/ManufacturerSeeder.php @@ -0,0 +1,52 @@ +count(1)->apple()->create(); // 1 + Manufacturer::factory()->count(1)->microsoft()->create(); // 2 + Manufacturer::factory()->count(1)->dell()->create(); // 3 + Manufacturer::factory()->count(1)->asus()->create(); // 4 + Manufacturer::factory()->count(1)->hp()->create(); // 5 + Manufacturer::factory()->count(1)->lenovo()->create(); // 6 + Manufacturer::factory()->count(1)->lg()->create(); // 7 + Manufacturer::factory()->count(1)->polycom()->create(); // 8 + Manufacturer::factory()->count(1)->adobe()->create(); // 9 + Manufacturer::factory()->count(1)->avery()->create(); // 10 + Manufacturer::factory()->count(1)->crucial()->create(); // 10 + + $src = public_path('/img/demo/manufacturers/'); + $dst = 'manufacturers'.'/'; + $del_files = Storage::files($dst); + + foreach ($del_files as $del_file) { // iterate files + $file_to_delete = str_replace($src, '', $del_file); + Log::debug('Deleting: '.$file_to_delete); + try { + Storage::disk('public')->delete($dst.$del_file); + } catch (\Exception $e) { + Log::debug($e); + } + } + + $add_files = glob($src.'/*.*'); + foreach ($add_files as $add_file) { + $file_to_copy = str_replace($src, '', $add_file); + Log::debug('Copying: '.$file_to_copy); + try { + Storage::disk('public')->put($dst.$file_to_copy, file_get_contents($src.$file_to_copy)); + } catch (\Exception $e) { + Log::debug($e); + } + } + } +} diff --git a/database/seeds/SettingsSeeder.php b/database/seeders/SettingsSeeder.php similarity index 96% rename from database/seeds/SettingsSeeder.php rename to database/seeders/SettingsSeeder.php index 3ad8b8d856..9cbdf79f94 100644 --- a/database/seeds/SettingsSeeder.php +++ b/database/seeders/SettingsSeeder.php @@ -1,8 +1,11 @@ save(); } - // Copy the logos from the img/demo directory Storage::disk('local_public')->put('snipe-logo.png', file_get_contents(public_path('img/demo/snipe-logo.png'))); Storage::disk('local_public')->put('snipe-logo-lg.png', file_get_contents(public_path('img/demo/snipe-logo-lg.png'))); - } } diff --git a/database/seeders/StatuslabelSeeder.php b/database/seeders/StatuslabelSeeder.php new file mode 100755 index 0000000000..94cd2140ae --- /dev/null +++ b/database/seeders/StatuslabelSeeder.php @@ -0,0 +1,21 @@ +rtd()->create(['name' => 'Ready to Deploy']); + Statuslabel::factory()->pending()->create(['name' => 'Pending']); + Statuslabel::factory()->archived()->create(['name' => 'Archived']); + Statuslabel::factory()->outForDiagnostics()->create(); + Statuslabel::factory()->outForRepair()->create(); + Statuslabel::factory()->broken()->create(); + Statuslabel::factory()->lost()->create(); + } +} diff --git a/database/seeds/SupplierSeeder.php b/database/seeders/SupplierSeeder.php similarity index 68% rename from database/seeds/SupplierSeeder.php rename to database/seeders/SupplierSeeder.php index 8dbeac9964..dc012e9b7f 100644 --- a/database/seeds/SupplierSeeder.php +++ b/database/seeders/SupplierSeeder.php @@ -1,13 +1,15 @@ create(); - + Supplier::factory()->count(5)->create(); } } diff --git a/database/seeders/UserSeeder.php b/database/seeders/UserSeeder.php new file mode 100644 index 0000000000..04f46e29b4 --- /dev/null +++ b/database/seeders/UserSeeder.php @@ -0,0 +1,64 @@ +count(1)->firstAdmin()->create(); + User::factory()->count(1)->snipeAdmin()->create(); + User::factory()->count(3)->superuser()->create(); + User::factory()->count(3)->admin()->create(); + User::factory()->count(50)->viewAssets()->create(); + + $src = public_path('/img/demo/avatars/'); + $dst = 'avatars'.'/'; + $del_files = Storage::files($dst); + + foreach ($del_files as $del_file) { // iterate files + $file_to_delete = str_replace($src, '', $del_file); + Log::debug('Deleting: '.$file_to_delete); + try { + Storage::disk('public')->delete($dst.$del_file); + } catch (\Exception $e) { + Log::debug($e); + } + } + + $add_files = glob($src.'/*.*'); + foreach ($add_files as $add_file) { + $file_to_copy = str_replace($src, '', $add_file); + Log::debug('Copying: '.$file_to_copy); + try { + Storage::disk('public')->put($dst.$file_to_copy, file_get_contents($src.$file_to_copy)); + } catch (\Exception $e) { + Log::debug($e); + } + } + + $users = User::orderBy('id', 'asc')->take(20)->get(); + $file_number = 1; + + foreach ($users as $user) { + + $user->avatar = $file_number.'.jpg'; + $user->save(); + $file_number++; + } + + + + } +} diff --git a/database/seeds/AccessorySeeder.php b/database/seeds/AccessorySeeder.php deleted file mode 100644 index a9041b782c..0000000000 --- a/database/seeds/AccessorySeeder.php +++ /dev/null @@ -1,43 +0,0 @@ -truncate(); - factory(Accessory::class, 1)->states('apple-usb-keyboard')->create(); - factory(Accessory::class, 1)->states('apple-bt-keyboard')->create(); - factory(Accessory::class, 1)->states('apple-mouse')->create(); - factory(Accessory::class, 1)->states('microsoft-mouse')->create(); - - $src = public_path('/img/demo/accessories/'); - $dst = 'accessories'.'/'; - $del_files = Storage::files($dst); - - foreach($del_files as $del_file){ // iterate files - $file_to_delete = str_replace($src,'',$del_file); - \Log::debug('Deleting: '.$file_to_delete); - try { - Storage::disk('public')->delete($dst.$del_file); - } catch (\Exception $e) { - \Log::debug($e); - } - } - - - $add_files = glob($src."/*.*"); - foreach($add_files as $add_file){ - $file_to_copy = str_replace($src,'',$add_file); - \Log::debug('Copying: '.$file_to_copy); - try { - Storage::disk('public')->put($dst.$file_to_copy, file_get_contents($src.$file_to_copy)); - } catch (\Exception $e) { - \Log::debug($e); - } - } - } -} diff --git a/database/seeds/ActionlogSeeder.php b/database/seeds/ActionlogSeeder.php deleted file mode 100644 index e186bf6ab4..0000000000 --- a/database/seeds/ActionlogSeeder.php +++ /dev/null @@ -1,13 +0,0 @@ -create(); - factory(Actionlog::class, 'asset-checkout-location',100)->create(); - } -} diff --git a/database/seeds/AssetModelSeeder.php b/database/seeds/AssetModelSeeder.php index c9f188ed10..79e0747af0 100755 --- a/database/seeds/AssetModelSeeder.php +++ b/database/seeds/AssetModelSeeder.php @@ -33,8 +33,8 @@ class AssetModelSeeder extends Seeder factory(AssetModel::class, 1)->states('tab3-model')->create(); // 14 // Phones - factory(AssetModel::class, 1)->states('iphone6s-model')->create(); // 15 - factory(AssetModel::class, 1)->states('iphone7-model')->create(); // 16 + factory(AssetModel::class, 1)->states('iphone11-model')->create(); // 15 + factory(AssetModel::class, 1)->states('iphone12-model')->create(); // 16 // Displays factory(AssetModel::class, 1)->states('ultrafine')->create(); // 17 diff --git a/database/seeds/AssetSeeder.php b/database/seeds/AssetSeeder.php deleted file mode 100644 index 9bb9fd75db..0000000000 --- a/database/seeds/AssetSeeder.php +++ /dev/null @@ -1,51 +0,0 @@ -states('laptop-mbp')->create(); - factory(Asset::class, 50)->states('laptop-mbp-pending')->create(); - factory(Asset::class, 50)->states('laptop-mbp-archived')->create(); - factory(Asset::class, 50)->states('laptop-air')->create(); - factory(Asset::class, 5)->states('laptop-surface')->create(); - factory(Asset::class, 5)->states('laptop-xps')->create(); - factory(Asset::class, 5)->states('laptop-spectre')->create(); - factory(Asset::class, 5)->states('laptop-zenbook')->create(); - factory(Asset::class, 3)->states('laptop-yoga')->create(); - - factory(Asset::class, 30)->states('desktop-macpro')->create(); - factory(Asset::class, 30)->states('desktop-lenovo-i5')->create(); - factory(Asset::class, 30)->states('desktop-optiplex')->create(); - - factory(Asset::class, 5)->states('conf-polycom')->create(); - factory(Asset::class, 2)->states('conf-polycomcx')->create(); - - factory(Asset::class, 12)->states('tablet-ipad')->create(); - factory(Asset::class, 4)->states('tablet-tab3')->create(); - - factory(Asset::class, 27)->states('phone-iphone6s')->create(); - factory(Asset::class, 40)->states('phone-iphone7')->create(); - - factory(Asset::class, 10)->states('ultrafine')->create(); - factory(Asset::class, 10)->states('ultrasharp')->create(); - - - $del_files = Storage::files('assets'); - foreach($del_files as $del_file){ // iterate files - \Log::debug('Deleting: '.$del_files); - try { - Storage::disk('public')->delete('assets'.'/'.$del_files); - } catch (\Exception $e) { - \Log::debug($e); - } - } - - DB::table('checkout_requests')->truncate(); - - } -} diff --git a/database/seeds/CategorySeeder.php b/database/seeds/CategorySeeder.php deleted file mode 100755 index dbf4dfca1e..0000000000 --- a/database/seeds/CategorySeeder.php +++ /dev/null @@ -1,28 +0,0 @@ -states('asset-laptop-category')->create(); // 1 - factory(Category::class, 1)->states('asset-desktop-category')->create(); // 2 - factory(Category::class, 1)->states('asset-tablet-category')->create(); // 3 - factory(Category::class, 1)->states('asset-mobile-category')->create(); // 4 - factory(Category::class, 1)->states('asset-display-category')->create(); // 5 - factory(Category::class, 1)->states('asset-voip-category')->create(); // 6 - factory(Category::class, 1)->states('asset-conference-category')->create(); // 7 - factory(Category::class, 1)->states('accessory-keyboard-category')->create(); // 8 - factory(Category::class, 1)->states('accessory-mouse-category')->create(); // 9 - factory(Category::class, 1)->states('consumable-paper-category')->create(); // 10 - factory(Category::class, 1)->states('consumable-ink-category')->create(); // 11 - factory(Category::class, 1)->states('component-hdd-category')->create(); // 12 - factory(Category::class, 1)->states('component-ram-category')->create(); // 13 - factory(Category::class, 1)->states('license-graphics-category')->create(); // 14 - factory(Category::class, 1)->states('license-office-category')->create(); // 15 - } - -} diff --git a/database/seeds/ComponentSeeder.php b/database/seeds/ComponentSeeder.php deleted file mode 100644 index bf22c394fe..0000000000 --- a/database/seeds/ComponentSeeder.php +++ /dev/null @@ -1,16 +0,0 @@ -truncate(); - factory(Component::class, 1)->states('ram-crucial4')->create(); // 1 - factory(Component::class, 1)->states('ram-crucial8')->create(); // 1 - factory(Component::class, 1)->states('ssd-crucial120')->create(); // 1 - factory(Component::class, 1)->states('ssd-crucial240')->create(); // 1 - } -} diff --git a/database/seeds/ConsumableSeeder.php b/database/seeds/ConsumableSeeder.php deleted file mode 100644 index 0e5577cdb9..0000000000 --- a/database/seeds/ConsumableSeeder.php +++ /dev/null @@ -1,15 +0,0 @@ -truncate(); - factory(Consumable::class, 1)->states('cardstock')->create(); // 1 - factory(Consumable::class, 1)->states('paper')->create(); // 2 - factory(Consumable::class, 1)->states('ink')->create(); // 3 - } -} diff --git a/database/seeds/CustomFieldSeeder.php b/database/seeds/CustomFieldSeeder.php deleted file mode 100644 index c743b3fc58..0000000000 --- a/database/seeds/CustomFieldSeeder.php +++ /dev/null @@ -1,64 +0,0 @@ -getColumnListing('assets'); - - - foreach ($columns as $column) { - if(strpos($column, '_snipeit_') !== FALSE) { - - Schema::table('assets', function (Blueprint $table) use ($column) { - $table->dropColumn($column); - }); - } - } - CustomField::truncate(); - CustomFieldset::truncate(); - DB::table('custom_field_custom_fieldset')->truncate(); - - factory(CustomFieldset::class, 1)->states('mobile')->create(); - factory(CustomFieldset::class, 1)->states('computer')->create(); - factory(CustomField::class, 1)->states('imei')->create(); - factory(CustomField::class, 1)->states('phone')->create(); - factory(CustomField::class, 1)->states('ram')->create(); - factory(CustomField::class, 1)->states('cpu')->create(); - factory(CustomField::class, 1)->states('mac-address')->create(); - - DB::table('custom_field_custom_fieldset')->insert([ - [ - 'custom_field_id' => '1', - 'custom_fieldset_id' => '1' - ], - [ - 'custom_field_id' => '2', - 'custom_fieldset_id' => '1' - ], - [ - 'custom_field_id' => '3', - 'custom_fieldset_id' => '2' - ], - [ - 'custom_field_id' => '4', - 'custom_fieldset_id' => '2' - ], - [ - 'custom_field_id' => '5', - 'custom_fieldset_id' => '2' - ], - - ]); - - - - - } -} diff --git a/database/seeds/DepartmentSeeder.php b/database/seeds/DepartmentSeeder.php deleted file mode 100644 index b92455a1fc..0000000000 --- a/database/seeds/DepartmentSeeder.php +++ /dev/null @@ -1,17 +0,0 @@ -states('hr')->create(); // 1 - factory(Department::class, 1)->states('engineering')->create(); // 2 - factory(Department::class, 1)->states('marketing')->create(); // 3 - factory(Department::class, 1)->states('client')->create(); // 4 - factory(Department::class, 1)->states('product')->create(); // 5 - factory(Department::class, 1)->states('silly')->create(); // 6 - } -} diff --git a/database/seeds/DepreciationSeeder.php b/database/seeds/DepreciationSeeder.php deleted file mode 100644 index 4cf6055e6f..0000000000 --- a/database/seeds/DepreciationSeeder.php +++ /dev/null @@ -1,14 +0,0 @@ -states('computer')->create(); // 1 - factory(Depreciation::class, 1)->states('display')->create(); // 2 - factory(Depreciation::class, 1)->states('mobile-phones')->create(); // 3 - } -} diff --git a/database/seeds/LicenseSeeder.php b/database/seeds/LicenseSeeder.php deleted file mode 100644 index 75ab8d3b6e..0000000000 --- a/database/seeds/LicenseSeeder.php +++ /dev/null @@ -1,17 +0,0 @@ -states('photoshop')->create(); - factory(License::class, 1)->states('acrobat')->create(); - factory(License::class, 1)->states('indesign')->create(); - factory(License::class, 1)->states('office')->create(); - } -} diff --git a/database/seeds/ManufacturerSeeder.php b/database/seeds/ManufacturerSeeder.php deleted file mode 100644 index a65d12a2e4..0000000000 --- a/database/seeds/ManufacturerSeeder.php +++ /dev/null @@ -1,53 +0,0 @@ -states('apple')->create(); // 1 - factory(Manufacturer::class, 1)->states('microsoft')->create(); // 2 - factory(Manufacturer::class, 1)->states('dell')->create(); // 3 - factory(Manufacturer::class, 1)->states('asus')->create(); // 4 - factory(Manufacturer::class, 1)->states('hp')->create(); // 5 - factory(Manufacturer::class, 1)->states('lenovo')->create(); // 6 - factory(Manufacturer::class, 1)->states('lg')->create(); // 7 - factory(Manufacturer::class, 1)->states('polycom')->create(); // 8 - factory(Manufacturer::class, 1)->states('adobe')->create(); // 9 - factory(Manufacturer::class, 1)->states('avery')->create(); // 10 - factory(Manufacturer::class, 1)->states('crucial')->create(); // 10 - - $src = public_path('/img/demo/manufacturers/'); - $dst = 'manufacturers'.'/'; - $del_files = Storage::files($dst); - - foreach($del_files as $del_file){ // iterate files - $file_to_delete = str_replace($src,'',$del_file); - \Log::debug('Deleting: '.$file_to_delete); - try { - Storage::disk('public')->delete($dst.$del_file); - } catch (\Exception $e) { - \Log::debug($e); - } - } - - - $add_files = glob($src."/*.*"); - foreach($add_files as $add_file){ - $file_to_copy = str_replace($src,'',$add_file); - \Log::debug('Copying: '.$file_to_copy); - try { - Storage::disk('public')->put($dst.$file_to_copy, file_get_contents($src.$file_to_copy)); - } catch (\Exception $e) { - \Log::debug($e); - } - } - - - } - - -} diff --git a/database/seeds/StatuslabelSeeder.php b/database/seeds/StatuslabelSeeder.php deleted file mode 100755 index 1c58d76a0b..0000000000 --- a/database/seeds/StatuslabelSeeder.php +++ /dev/null @@ -1,19 +0,0 @@ -states('rtd')->create(['name' => "Ready to Deploy"]); - factory(Statuslabel::class)->states('pending')->create(['name' => "Pending"]); - factory(Statuslabel::class)->states('archived')->create(['name' => "Archived"]); - factory(Statuslabel::class)->states('out_for_diagnostics')->create(); - factory(Statuslabel::class)->states('out_for_repair')->create(); - factory(Statuslabel::class)->states('broken')->create(); - factory(Statuslabel::class)->states('lost')->create(); - } -} diff --git a/database/seeds/UserSeeder.php b/database/seeds/UserSeeder.php deleted file mode 100644 index 348a26a6b4..0000000000 --- a/database/seeds/UserSeeder.php +++ /dev/null @@ -1,23 +0,0 @@ -states('first-admin')->create(); - factory(User::class, 1)->states('snipe-admin')->create(); - factory(User::class, 3)->states('superuser')->create(); - factory(User::class, 3)->states('admin')->create(); - factory(User::class, 50)->states('view-assets')->create(); - - } -} diff --git a/docker-compose.yml b/docker-compose.yml index 511dfd35d7..4007a94998 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,7 +7,7 @@ services: dockerfile: Dockerfile.alpine container_name: snipeit ports: - - 8000:80 + - "8000:80" volumes: - ./logs:/var/www/html/storage/logs depends_on: @@ -19,7 +19,7 @@ services: - snipeit-backend mariadb: - image: mariadb:latest + image: mariadb:10.6.4-focal volumes: - db:/var/lib/mysql env_file: @@ -28,15 +28,15 @@ services: - snipeit-backend redis: - image: redis:latest + image: redis:6.2.5-buster networks: - snipeit-backend mailhog: - image: mailhog/mailhog:latest + image: mailhog/mailhog:v1.0.1 ports: # - 1025:1025 - - 8025:8025 + - "8025:8025" networks: - snipeit-backend diff --git a/docker/startup.sh b/docker/startup.sh index 726aafd16b..70dace2648 100644 --- a/docker/startup.sh +++ b/docker/startup.sh @@ -40,6 +40,7 @@ done chown -R docker:root /var/lib/snipeit/data/* chown -R docker:root /var/lib/snipeit/dumps chown -R docker:root /var/lib/snipeit/keys +chown -R docker:root /var/www/html/storage/framework/cache # Fix php settings if [ -v "PHP_UPLOAD_LIMIT" ] @@ -54,7 +55,7 @@ then cp -ax /var/www/html/vendor/laravel/passport/database/migrations/* /var/www/html/database/migrations/ fi -if [ $SESSION_DRIVER = "database" ] +if [ "$SESSION_DRIVER" = "database" ] then cp -ax /var/www/html/vendor/laravel/framework/src/Illuminate/Session/Console/stubs/database.stub /var/www/html/database/migrations/2021_05_06_0000_create_sessions_table.php fi diff --git a/heroku/startup.php b/heroku/startup.php new file mode 100644 index 0000000000..15a2c0b4d6 --- /dev/null +++ b/heroku/startup.php @@ -0,0 +1,51 @@ + values are set, ignore parser. +if (getenv("DB_DATABASE") || getenv("DB_HOST") || getenv("DB_USERNAME")) { + echo "Database Environment variables are manually set. Ignoring add-ins."; +} else if (getenv("CLEARDB_DATABASE_URL")) { // ClearDB Add-in + echo "Using ClearDB Heroku add-in." . PHP_EOL; + set_db(getenv('CLEARDB_DATABASE_URL')); +} else if (getenv("JAWSDB_MARIA_URL")) { // JawsDB Maria Add-in + echo "Using JawsDB Maria Heroku add-in." . PHP_EOL; + set_db(getenv("JAWSDB_MARIA_URL")); +} else if (getenv("JAWSDB_MYSQL_URL")) { // JawsDB MySQL Add-in + echo "Using JawsDB MySQL Heroku add-in." . PHP_EOL; + set_db(getenv("JAWSDB_MYSQL_URL")); +} + +function set_db($uri) { + file_put_contents('./.env', 'DB_HOST=' . parse_url($uri, PHP_URL_HOST). PHP_EOL, FILE_APPEND); + file_put_contents('./.env', 'DB_USERNAME=' . parse_url($uri, PHP_URL_USER). PHP_EOL, FILE_APPEND); + file_put_contents('./.env', 'DB_PASSWORD=' . parse_url($uri, PHP_URL_PASS). PHP_EOL, FILE_APPEND); + file_put_contents('./.env', 'DB_DATABASE=' . ltrim(parse_url($uri, PHP_URL_PATH), '/'). PHP_EOL, FILE_APPEND); + file_put_contents('./.env', 'DB_PREFIX=' . 'null' . PHP_EOL, FILE_APPEND); + file_put_contents('./.env', 'DB_DUMP_PATH=' . 'null' . PHP_EOL, FILE_APPEND); + +} + +// If Heroku Redis is setup, let's get it working. +if (getenv("REDIS_URL")) { // Heroku Redis + echo "Setting up Heroku Redis." . PHP_EOL; + $url = getenv("REDIS_URL"); + file_put_contents('./.env', 'REDIS_HOST=' . parse_url($url, PHP_URL_HOST). PHP_EOL, FILE_APPEND); + file_put_contents('./.env', 'REDIS_PASSWORD=' . parse_url($url, PHP_URL_PASS). PHP_EOL, FILE_APPEND); + file_put_contents('./.env', 'REDIS_PORT=' . parse_url($url, PHP_URL_PORT). PHP_EOL, FILE_APPEND); +} + +// Set up APP_TRUSTED_PROXIES to allow for the Heroku Router +// https://devcenter.heroku.com/articles/deploying-symfony4#trusting-the-heroku-router +file_put_contents('./.env', 'APP_TRUSTED_PROXIES=10.0.0.0/8' . PHP_EOL, FILE_APPEND); + +// Set up GD +file_put_contents('./.env', 'IMAGE_LIB=gd' . PHP_EOL, FILE_APPEND); + +// Set local FILESYSTEM_DISK and PUBLIC_FILESYSTEM_DISK +file_put_contents('./.env', 'FILESYSTEM_DISK=local' . PHP_EOL, FILE_APPEND); +file_put_contents('./.env', 'PUBLIC_FILESYSTEM_DISK=local_public' . PHP_EOL, FILE_APPEND); + +// Set APP_CIPHER +file_put_contents('./.env', 'APP_CIPHER=AES-256-CBC' . PHP_EOL, FILE_APPEND); + +?> diff --git a/package-lock.json b/package-lock.json index 32384ba3b9..463ca7dc3d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3,47 +3,47 @@ "lockfileVersion": 1, "dependencies": { "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", "dev": true, "requires": { - "@babel/highlight": "^7.12.13" + "@babel/highlight": "^7.14.5" } }, "@babel/compat-data": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.13.tgz", - "integrity": "sha512-U/hshG5R+SIoW7HVWIdmy1cB7s3ki+r3FpyEZiCgpi4tFgPnX/vynY80ZGSASOIrUM6O7VxOgCZgdt7h97bUGg==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", + "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==", "dev": true }, "@babel/core": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.17.tgz", - "integrity": "sha512-V3CuX1aBywbJvV2yzJScRxeiiw0v2KZZYYE3giywxzFJL13RiyPjaaDwhDnxmgFTTS7FgvM2ijr4QmKNIu0AtQ==", + "version": "7.15.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.5.tgz", + "integrity": "sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg==", "dev": true, "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.12.17", - "@babel/helper-module-transforms": "^7.12.17", - "@babel/helpers": "^7.12.17", - "@babel/parser": "^7.12.17", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.12.17", - "@babel/types": "^7.12.17", + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.4", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helpers": "^7.15.4", + "@babel/parser": "^7.15.5", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4", "convert-source-map": "^1.7.0", "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", + "gensync": "^1.0.0-beta.2", "json5": "^2.1.2", - "lodash": "^4.17.19", - "semver": "^5.4.1", + "semver": "^6.3.0", "source-map": "^0.5.0" }, "dependencies": { "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "dev": true, "requires": { "ms": "2.1.2" @@ -54,85 +54,72 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true } } }, "@babel/generator": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.17.tgz", - "integrity": "sha512-DSA7ruZrY4WI8VxuS1jWSRezFnghEoYEFrZcw9BizQRmOZiUsiHl59+qEARGPqPikwA/GPTyRCi7isuCK/oyqg==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.4.tgz", + "integrity": "sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw==", "dev": true, "requires": { - "@babel/types": "^7.12.17", + "@babel/types": "^7.15.4", "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, "@babel/helper-annotate-as-pure": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", - "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz", + "integrity": "sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA==", "dev": true, "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.15.4" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz", - "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.15.4.tgz", + "integrity": "sha512-P8o7JP2Mzi0SdC6eWr1zF+AEYvrsZa7GSY1lTayjF5XJhVH0kjLYUZPvTMflP7tBgZoe9gIhTa60QwFpqh/E0Q==", "dev": true, "requires": { - "@babel/helper-explode-assignable-expression": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/helper-explode-assignable-expression": "^7.15.4", + "@babel/types": "^7.15.4" } }, "@babel/helper-compilation-targets": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.17.tgz", - "integrity": "sha512-5EkibqLVYOuZ89BSg2lv+GG8feywLuvMXNYgf0Im4MssE0mFWPztSpJbildNnUgw0bLI2EsIN4MpSHC2iUJkQA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", + "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", "dev": true, "requires": { - "@babel/compat-data": "^7.12.13", - "@babel/helper-validator-option": "^7.12.17", - "browserslist": "^4.14.5", - "semver": "^5.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } + "@babel/compat-data": "^7.15.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" } }, "@babel/helper-create-class-features-plugin": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.17.tgz", - "integrity": "sha512-I/nurmTxIxHV0M+rIpfQBF1oN342+yvl2kwZUrQuOClMamHF1w5tknfZubgNOLRoA73SzBFAdFcpb4M9HwOeWQ==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz", + "integrity": "sha512-7ZmzFi+DwJx6A7mHRwbuucEYpyBwmh2Ca0RvI6z2+WLZYCqV0JOaLb+u0zbtmDicebgKBZgqbYfLaKNqSgv5Pw==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-member-expression-to-functions": "^7.12.17", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/helper-replace-supers": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13" + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz", - "integrity": "sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz", + "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-annotate-as-pure": "^7.14.5", "regexpu-core": "^4.7.1" }, "dependencies": { @@ -143,17 +130,17 @@ "dev": true }, "regexpu-core": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", - "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", + "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", "dev": true, "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^9.0.0", + "regjsgen": "^0.5.2", + "regjsparser": "^0.7.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" } }, "regjsgen": { @@ -163,9 +150,9 @@ "dev": true }, "regjsparser": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.7.tgz", - "integrity": "sha512-ib77G0uxsA2ovgiYbCVGx4Pv3PSttAx2vIwidqQzbL2U5S4Q+j00HdSAneSBuyVcMvEnTXMjiGgB+DlXozVhpQ==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz", + "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", "dev": true, "requires": { "jsesc": "~0.5.0" @@ -173,186 +160,218 @@ } } }, - "@babel/helper-explode-assignable-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.13.tgz", - "integrity": "sha512-5loeRNvMo9mx1dA/d6yNi+YiKziJZFylZnCo1nmFF4qPU4yJ14abhWESuSMQSlQxWdxdOFzxXjk/PpfudTtYyw==", + "@babel/helper-define-polyfill-provider": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz", + "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", "dev": true, "requires": { - "@babel/types": "^7.12.13" + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.15.4.tgz", + "integrity": "sha512-J14f/vq8+hdC2KoWLIQSsGrC9EFBKE4NFts8pfMpymfApds+fPqR30AOUWc4tyr56h9l/GA1Sxv2q3dLZWbQ/g==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" } }, "@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", + "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/helper-get-function-arity": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/types": "^7.15.4" } }, "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", + "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", "dev": true, "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.15.4" } }, "@babel/helper-hoist-variables": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.12.13.tgz", - "integrity": "sha512-KSC5XSj5HreRhYQtZ3cnSnQwDzgnbdUDEFsxkN0m6Q3WrCRt72xrnZ8+h+pX7YxM7hr87zIO3a/v5p/H3TrnVw==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", + "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", "dev": true, "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.15.4" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.17.tgz", - "integrity": "sha512-Bzv4p3ODgS/qpBE0DiJ9qf5WxSmrQ8gVTe8ClMfwwsY2x/rhykxxy3bXzG7AGTnPB2ij37zGJ/Q/6FruxHxsxg==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", + "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", "dev": true, "requires": { - "@babel/types": "^7.12.17" + "@babel/types": "^7.15.4" } }, "@babel/helper-module-imports": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz", - "integrity": "sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", + "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", "dev": true, "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.15.4" } }, "@babel/helper-module-transforms": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.17.tgz", - "integrity": "sha512-sFL+p6zOCQMm9vilo06M4VHuTxUAwa6IxgL56Tq1DVtA0ziAGTH1ThmJq7xwPqdQlgAbKX3fb0oZNbtRIyA5KQ==", + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.7.tgz", + "integrity": "sha512-ZNqjjQG/AuFfekFTY+7nY4RgBSklgTu970c7Rj3m/JOhIu5KPBUuTA9AY6zaKcUvk4g6EbDXdBnhi35FAssdSw==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-replace-supers": "^7.12.13", - "@babel/helper-simple-access": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/helper-validator-identifier": "^7.12.11", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.12.17", - "@babel/types": "^7.12.17", - "lodash": "^4.17.19" + "@babel/helper-module-imports": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-simple-access": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.6" } }, "@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", + "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", "dev": true, "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.15.4" } }, "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", "dev": true }, "@babel/helper-remap-async-to-generator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.13.tgz", - "integrity": "sha512-Qa6PU9vNcj1NZacZZI1Mvwt+gXDH6CTfgAkSjeRMLE8HxtDK76+YDId6NQR+z7Rgd5arhD2cIbS74r0SxD6PDA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.15.4.tgz", + "integrity": "sha512-v53MxgvMK/HCwckJ1bZrq6dNKlmwlyRNYM6ypaRTdXWGOE2c1/SCa6dL/HimhPulGhZKw9W0QhREM583F/t0vQ==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-wrap-function": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-wrap-function": "^7.15.4", + "@babel/types": "^7.15.4" } }, "@babel/helper-replace-supers": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.13.tgz", - "integrity": "sha512-pctAOIAMVStI2TMLhozPKbf5yTEXc0OJa0eENheb4w09SrgOWEs+P4nTOZYJQCqs8JlErGLDPDJTiGIp3ygbLg==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", + "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.13", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" } }, "@babel/helper-simple-access": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz", - "integrity": "sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", + "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", "dev": true, "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.15.4" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", - "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.15.4.tgz", + "integrity": "sha512-BMRLsdh+D1/aap19TycS4eD1qELGrCBJwzaY9IE8LrpJtJb+H7rQkPIdsfgnMtLBA6DJls7X9z93Z4U8h7xw0A==", "dev": true, "requires": { - "@babel/types": "^7.12.1" + "@babel/types": "^7.15.4" } }, "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", + "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", "dev": true, "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.15.4" } }, "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", "dev": true }, "@babel/helper-validator-option": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", - "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", "dev": true }, "@babel/helper-wrap-function": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.13.tgz", - "integrity": "sha512-t0aZFEmBJ1LojdtJnhOaQEVejnzYhyjWHSsNSNo8vOYRbAJNh6r6GQF7pd36SqG7OKGbn+AewVQ/0IfYfIuGdw==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.15.4.tgz", + "integrity": "sha512-Y2o+H/hRV5W8QhIfTpRIBwl57y8PrZt6JM3V8FOo5qarjshHItyH5lXlpMfBfmBefOqSCpKZs/6Dxqp0E/U+uw==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/helper-function-name": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" } }, "@babel/helpers": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.17.tgz", - "integrity": "sha512-tEpjqSBGt/SFEsFikKds1sLNChKKGGR17flIgQKXH4fG6m9gTgl3gnOC1giHNyaBCSKuTfxaSzHi7UnvqiVKxg==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz", + "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", "dev": true, "requires": { - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.12.17", - "@babel/types": "^7.12.17" + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" } }, "@babel/highlight": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", - "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.12.11", + "@babel/helper-validator-identifier": "^7.14.5", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -395,142 +414,178 @@ } }, "@babel/parser": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.17.tgz", - "integrity": "sha512-r1yKkiUTYMQ8LiEI0UcQx5ETw5dpTLn9wijn9hk6KkTtOK95FndDN10M+8/s6k/Ymlbivw0Av9q4SlgF80PtHg==", + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.7.tgz", + "integrity": "sha512-rycZXvQ+xS9QyIcJ9HXeDWf1uxqlbVFAUq0Rq0dbc50Zb/+wUe/ehyfzGfm9KZZF0kBejYgxltBXocP+gKdL2g==", "dev": true }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.13.tgz", - "integrity": "sha512-1KH46Hx4WqP77f978+5Ye/VUbuwQld2hph70yaw2hXS2v7ER2f3nlpNMu909HO2rbvP0NKLlMVDPh9KXklVMhA==", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.15.4.tgz", + "integrity": "sha512-eBnpsl9tlhPhpI10kU06JHnrYXwg3+V6CaP2idsCXNef0aeslpqyITXQ74Vfk5uHgY7IG7XP0yIH8b42KSzHog==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/helper-remap-async-to-generator": "^7.12.13", - "@babel/plugin-syntax-async-generators": "^7.8.0" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.15.4", + "@babel/plugin-proposal-optional-chaining": "^7.14.5" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.15.4.tgz", + "integrity": "sha512-2zt2g5vTXpMC3OmK6uyjvdXptbhBXfA77XGrd3gh93zwG8lZYBLOBImiGBEG0RANu3JqKEACCz5CGk73OJROBw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.15.4", + "@babel/plugin-syntax-async-generators": "^7.8.4" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.13.tgz", - "integrity": "sha512-8SCJ0Ddrpwv4T7Gwb33EmW1V9PY5lggTO+A8WjyIwxrSHDUyBw4MtF96ifn1n8H806YlxbVCoKXbbmzD6RD+cA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz", + "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.15.4.tgz", + "integrity": "sha512-M682XWrrLNk3chXCjoPUQWOyYsB93B9z3mRyjtqqYJWDf2mfCdIYgDrA11cgNVhAQieaq6F2fn2f3wI0U4aTjA==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.17.tgz", - "integrity": "sha512-ZNGoFZqrnuy9H2izB2jLlnNDAfVPlGl5NhFEiFe4D84ix9GQGygF+CWMGHKuE+bpyS/AOuDQCnkiRNqW2IzS1Q==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz", + "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/plugin-syntax-dynamic-import": "^7.8.0" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz", - "integrity": "sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz", + "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.13.tgz", - "integrity": "sha512-v9eEi4GiORDg8x+Dmi5r8ibOe0VXoKDeNPYcTTxdGN4eOWikrJfDJCJrr1l5gKGvsNyGJbrfMftC2dTL6oz7pg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz", + "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/plugin-syntax-json-strings": "^7.8.0" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.13.tgz", - "integrity": "sha512-fqmiD3Lz7jVdK6kabeSr1PZlWSUVqSitmHEe3Z00dtGTKieWnX9beafvavc32kjORa5Bai4QNHgFDwWJP+WtSQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz", + "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.13.tgz", - "integrity": "sha512-Qoxpy+OxhDBI5kRqliJFAl4uWXk3Bn24WeFstPH0iLymFehSAUR8MHpqU7njyXv/qbo7oN6yTy5bfCmXdKpo1Q==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz", + "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz", - "integrity": "sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz", + "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.13.tgz", - "integrity": "sha512-WvA1okB/0OS/N3Ldb3sziSrXg6sRphsBgqiccfcQq7woEn5wQLNX82Oc4PlaFcdwcWHuQXAtb8ftbS8Fbsg/sg==", + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.15.6.tgz", + "integrity": "sha512-qtOHo7A1Vt+O23qEAX+GdBpqaIuD3i9VRrWgCJeq7WO6H2d14EK3q11urj5Te2MAeK97nMiIdRpwd/ST4JFbNg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.12.13" + "@babel/compat-data": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.15.4" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.13.tgz", - "integrity": "sha512-9+MIm6msl9sHWg58NvqpNpLtuFbmpFYk37x8kgnGzAHvX35E1FyAwSUt5hIkSoWJFSAH+iwU8bJ4fcD1zKXOzg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz", + "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.17.tgz", - "integrity": "sha512-TvxwI80pWftrGPKHNfkvX/HnoeSTR7gC4ezWnAL39PuktYUe6r8kEpOLTYnkBTsaoeazXm2jHJ22EQ81sdgfcA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-proposal-private-methods": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.13.tgz", - "integrity": "sha512-sV0V57uUwpauixvR7s2o75LmwJI6JECwm5oPUY5beZB1nBl2i37hc7CJGqB5G+58fur5Y6ugvl3LRONk5x34rg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz", + "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.15.4.tgz", + "integrity": "sha512-X0UTixkLf0PCCffxgu5/1RQyGGbgZuKoI+vXP4iSbJSYwPb7hu06omsFGBvQ9lJEvwgrxHdS8B5nbfcd8GyUNA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz", - "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz", + "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-async-generators": { @@ -551,6 +606,15 @@ "@babel/helper-plugin-utils": "^7.12.13" } }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, "@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", @@ -632,65 +696,74 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", - "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.13.tgz", - "integrity": "sha512-tBtuN6qtCTd+iHzVZVOMNp+L04iIJBpqkdY42tWbmjIT5wvR2kx7gxMBsyhQtFzHwBbyGi9h8J8r9HgnOpQHxg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz", + "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.13.tgz", - "integrity": "sha512-psM9QHcHaDr+HZpRuJcE1PXESuGWSCcbiGFFhhwfzdbTxaGDVzuVtdNYliAwcRo3GFg0Bc8MmI+AvIGYIJG04A==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", + "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/helper-remap-async-to-generator": "^7.12.13" + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", - "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz", + "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz", - "integrity": "sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ==", + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz", + "integrity": "sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-classes": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.13.tgz", - "integrity": "sha512-cqZlMlhCC1rVnxE5ZGMtIb896ijL90xppMiuWXcwcOAuFczynpd3KYemb91XFFPi3wJSe/OcrX9lXoowatkkxA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.15.4.tgz", + "integrity": "sha512-Yjvhex8GzBmmPQUvpXRPWQ9WnxXgAFuZSrqOK/eJlOGIXwvv8H3UEdUigl1gb/bnjTrln+e8bkZUYCBt/xYlBg==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/helper-replace-supers": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", "globals": "^11.1.0" }, "dependencies": { @@ -703,185 +776,185 @@ } }, "@babel/plugin-transform-computed-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.13.tgz", - "integrity": "sha512-dDfuROUPGK1mTtLKyDPUavmj2b6kFu82SmgpztBFEO974KMjJT+Ytj3/oWsTUMBmgPcp9J5Pc1SlcAYRpJ2hRA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz", + "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-destructuring": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.13.tgz", - "integrity": "sha512-Dn83KykIFzjhA3FDPA1z4N+yfF3btDGhjnJwxIj0T43tP0flCujnU8fKgEkf0C1biIpSv9NZegPBQ1J6jYkwvQ==", + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz", + "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz", - "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz", + "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz", - "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz", + "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", - "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz", + "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-for-of": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.13.tgz", - "integrity": "sha512-xCbdgSzXYmHGyVX3+BsQjcd4hv4vA/FDy7Kc8eOpzKmBBPEOTurt0w5fCRQaGl+GSBORKgJdstQ1rHl4jbNseQ==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.15.4.tgz", + "integrity": "sha512-DRTY9fA751AFBDh2oxydvVm4SYevs5ILTWLs6xKXps4Re/KG5nfUkr+TdHCrRWB8C69TlzVgA9b3RmGWmgN9LA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", - "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz", + "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", - "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz", + "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", - "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz", + "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.13.tgz", - "integrity": "sha512-JHLOU0o81m5UqG0Ulz/fPC68/v+UTuGTWaZBUwpEk1fYQ1D9LfKV6MPn4ttJKqRo5Lm460fkzjLTL4EHvCprvA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz", + "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.13.tgz", - "integrity": "sha512-OGQoeVXVi1259HjuoDnsQMlMkT9UkZT9TpXAsqWplS/M0N1g3TJAn/ByOCeQu7mfjc5WpSsRU+jV1Hd89ts0kQ==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.4.tgz", + "integrity": "sha512-qg4DPhwG8hKp4BbVDvX1s8cohM8a6Bvptu4l6Iingq5rW+yRUAhe/YRup/YcW2zCOlrysEWVhftIcKzrEZv3sA==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/helper-simple-access": "^7.12.13", + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-simple-access": "^7.15.4", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.13.tgz", - "integrity": "sha512-aHfVjhZ8QekaNF/5aNdStCGzwTbU7SI5hUybBKlMzqIMC7w7Ho8hx5a4R/DkTHfRfLwHGGxSpFt9BfxKCoXKoA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.15.4.tgz", + "integrity": "sha512-fJUnlQrl/mezMneR72CKCgtOoahqGJNVKpompKwzv3BrEXdlPspTcyxrZ1XmDTIr9PpULrgEQo3qNKp6dW7ssw==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.12.13", - "@babel/helper-module-transforms": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/helper-validator-identifier": "^7.12.11", + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.13.tgz", - "integrity": "sha512-BgZndyABRML4z6ibpi7Z98m4EVLFI9tVsZDADC14AElFaNHHBcJIovflJ6wtCqFxwy2YJ1tJhGRsr0yLPKoN+w==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz", + "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz", - "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz", + "integrity": "sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.14.5" } }, "@babel/plugin-transform-new-target": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz", - "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz", + "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-object-super": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", - "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz", + "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/helper-replace-supers": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5" } }, "@babel/plugin-transform-parameters": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.13.tgz", - "integrity": "sha512-e7QqwZalNiBRHCpJg/P8s/VJeSRYgmtWySs1JwvfwPqhBbiWfOcHDKdeAi6oAyIimoKWBlwc8oTgbZHdhCoVZA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.15.4.tgz", + "integrity": "sha512-9WB/GUTO6lvJU3XQsSr6J/WKvBC2hcs4Pew8YxZagi6GkTdniyqp8On5kqdK8MN0LMeu0mGbhPN+O049NV/9FQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-property-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", - "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz", + "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-regenerator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.13.tgz", - "integrity": "sha512-lxb2ZAvSLyJ2PEe47hoGWPmW22v7CtSl9jW8mingV4H2sEX/JOcrAj2nPuGWi56ERUm2bUpjKzONAuT6HCn2EA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz", + "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==", "dev": true, "requires": { "regenerator-transform": "^0.14.2" @@ -899,178 +972,172 @@ } }, "@babel/plugin-transform-reserved-words": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz", - "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz", + "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-runtime": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.17.tgz", - "integrity": "sha512-s+kIJxnaTj+E9Q3XxQZ5jOo+xcogSe3V78/iFQ5RmoT0jROdpcdxhfGdq/VLqW1hFSzw6VjqN8aQqTaAMixWsw==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.15.0.tgz", + "integrity": "sha512-sfHYkLGjhzWTq6xsuQ01oEsUYjkHRux9fW1iUA68dC7Qd8BS1Unq4aZ8itmQp95zUzIcyR2EbNMTzAicFj+guw==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13", - "semver": "^5.5.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "semver": "^6.3.0" } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", - "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz", + "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-spread": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.13.tgz", - "integrity": "sha512-dUCrqPIowjqk5pXsx1zPftSq4sT0aCeZVAxhdgs3AMgyaDmoUT0G+5h3Dzja27t76aUEIJWlFgPJqJ/d4dbTtg==", + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz", + "integrity": "sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", - "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz", + "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-template-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.13.tgz", - "integrity": "sha512-arIKlWYUgmNsF28EyfmiQHJLJFlAJNYkuQO10jL46ggjBpeb2re1P9K9YGxNJB45BqTbaslVysXDYm/g3sN/Qg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz", + "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz", - "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz", + "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz", - "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz", + "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", - "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz", + "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/preset-env": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.17.tgz", - "integrity": "sha512-9PMijx8zFbCwTHrd2P4PJR5nWGH3zWebx2OcpTjqQrHhCiL2ssSR2Sc9ko2BsI2VmVBfoaQmPrlMTCui4LmXQg==", + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.15.6.tgz", + "integrity": "sha512-L+6jcGn7EWu7zqaO2uoTDjjMBW+88FXzV8KvrBl2z6MtRNxlsmUNRlZPaNNPUTgqhyC5DHNFk/2Jmra+ublZWw==", "dev": true, "requires": { - "@babel/compat-data": "^7.12.13", - "@babel/helper-compilation-targets": "^7.12.17", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/helper-validator-option": "^7.12.17", - "@babel/plugin-proposal-async-generator-functions": "^7.12.13", - "@babel/plugin-proposal-class-properties": "^7.12.13", - "@babel/plugin-proposal-dynamic-import": "^7.12.17", - "@babel/plugin-proposal-export-namespace-from": "^7.12.13", - "@babel/plugin-proposal-json-strings": "^7.12.13", - "@babel/plugin-proposal-logical-assignment-operators": "^7.12.13", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.13", - "@babel/plugin-proposal-numeric-separator": "^7.12.13", - "@babel/plugin-proposal-object-rest-spread": "^7.12.13", - "@babel/plugin-proposal-optional-catch-binding": "^7.12.13", - "@babel/plugin-proposal-optional-chaining": "^7.12.17", - "@babel/plugin-proposal-private-methods": "^7.12.13", - "@babel/plugin-proposal-unicode-property-regex": "^7.12.13", - "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/compat-data": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.15.4", + "@babel/plugin-proposal-async-generator-functions": "^7.15.4", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-static-block": "^7.15.4", + "@babel/plugin-proposal-dynamic-import": "^7.14.5", + "@babel/plugin-proposal-export-namespace-from": "^7.14.5", + "@babel/plugin-proposal-json-strings": "^7.14.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", + "@babel/plugin-proposal-numeric-separator": "^7.14.5", + "@babel/plugin-proposal-object-rest-spread": "^7.15.6", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-private-methods": "^7.14.5", + "@babel/plugin-proposal-private-property-in-object": "^7.15.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", + "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.12.13", - "@babel/plugin-transform-arrow-functions": "^7.12.13", - "@babel/plugin-transform-async-to-generator": "^7.12.13", - "@babel/plugin-transform-block-scoped-functions": "^7.12.13", - "@babel/plugin-transform-block-scoping": "^7.12.13", - "@babel/plugin-transform-classes": "^7.12.13", - "@babel/plugin-transform-computed-properties": "^7.12.13", - "@babel/plugin-transform-destructuring": "^7.12.13", - "@babel/plugin-transform-dotall-regex": "^7.12.13", - "@babel/plugin-transform-duplicate-keys": "^7.12.13", - "@babel/plugin-transform-exponentiation-operator": "^7.12.13", - "@babel/plugin-transform-for-of": "^7.12.13", - "@babel/plugin-transform-function-name": "^7.12.13", - "@babel/plugin-transform-literals": "^7.12.13", - "@babel/plugin-transform-member-expression-literals": "^7.12.13", - "@babel/plugin-transform-modules-amd": "^7.12.13", - "@babel/plugin-transform-modules-commonjs": "^7.12.13", - "@babel/plugin-transform-modules-systemjs": "^7.12.13", - "@babel/plugin-transform-modules-umd": "^7.12.13", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13", - "@babel/plugin-transform-new-target": "^7.12.13", - "@babel/plugin-transform-object-super": "^7.12.13", - "@babel/plugin-transform-parameters": "^7.12.13", - "@babel/plugin-transform-property-literals": "^7.12.13", - "@babel/plugin-transform-regenerator": "^7.12.13", - "@babel/plugin-transform-reserved-words": "^7.12.13", - "@babel/plugin-transform-shorthand-properties": "^7.12.13", - "@babel/plugin-transform-spread": "^7.12.13", - "@babel/plugin-transform-sticky-regex": "^7.12.13", - "@babel/plugin-transform-template-literals": "^7.12.13", - "@babel/plugin-transform-typeof-symbol": "^7.12.13", - "@babel/plugin-transform-unicode-escapes": "^7.12.13", - "@babel/plugin-transform-unicode-regex": "^7.12.13", - "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.12.17", - "core-js-compat": "^3.8.0", - "semver": "^5.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.14.5", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/plugin-transform-block-scoped-functions": "^7.14.5", + "@babel/plugin-transform-block-scoping": "^7.15.3", + "@babel/plugin-transform-classes": "^7.15.4", + "@babel/plugin-transform-computed-properties": "^7.14.5", + "@babel/plugin-transform-destructuring": "^7.14.7", + "@babel/plugin-transform-dotall-regex": "^7.14.5", + "@babel/plugin-transform-duplicate-keys": "^7.14.5", + "@babel/plugin-transform-exponentiation-operator": "^7.14.5", + "@babel/plugin-transform-for-of": "^7.15.4", + "@babel/plugin-transform-function-name": "^7.14.5", + "@babel/plugin-transform-literals": "^7.14.5", + "@babel/plugin-transform-member-expression-literals": "^7.14.5", + "@babel/plugin-transform-modules-amd": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.15.4", + "@babel/plugin-transform-modules-systemjs": "^7.15.4", + "@babel/plugin-transform-modules-umd": "^7.14.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.9", + "@babel/plugin-transform-new-target": "^7.14.5", + "@babel/plugin-transform-object-super": "^7.14.5", + "@babel/plugin-transform-parameters": "^7.15.4", + "@babel/plugin-transform-property-literals": "^7.14.5", + "@babel/plugin-transform-regenerator": "^7.14.5", + "@babel/plugin-transform-reserved-words": "^7.14.5", + "@babel/plugin-transform-shorthand-properties": "^7.14.5", + "@babel/plugin-transform-spread": "^7.14.6", + "@babel/plugin-transform-sticky-regex": "^7.14.5", + "@babel/plugin-transform-template-literals": "^7.14.5", + "@babel/plugin-transform-typeof-symbol": "^7.14.5", + "@babel/plugin-transform-unicode-escapes": "^7.14.5", + "@babel/plugin-transform-unicode-regex": "^7.14.5", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.15.6", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "core-js-compat": "^3.16.0", + "semver": "^6.3.0" } }, "@babel/preset-modules": { @@ -1090,7 +1157,6 @@ "version": "7.12.18", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.18.tgz", "integrity": "sha512-BogPQ7ciE6SYAUPtlm9tWbgI9+2AgqSam6QivMgXgAT+fKbgppaj4ZX15MHeLC1PVF5sNk70huBu20XxWOs8Cg==", - "dev": true, "requires": { "regenerator-runtime": "^0.13.4" }, @@ -1098,61 +1164,42 @@ "regenerator-runtime": { "version": "0.13.7", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", - "dev": true - } - } - }, - "@babel/runtime-corejs3": { - "version": "7.12.18", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.12.18.tgz", - "integrity": "sha512-ngR7yhNTjDxxe1VYmhqQqqXZWujGb6g0IoA4qeG6MxNGRnIw2Zo8ImY8HfaQ7l3T6GklWhdNfyhWk0C0iocdVA==", - "optional": true, - "requires": { - "core-js-pure": "^3.0.0", - "regenerator-runtime": "^0.13.4" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", - "optional": true + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" } } }, "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", + "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", "dev": true, "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4" } }, "@babel/traverse": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.17.tgz", - "integrity": "sha512-LGkTqDqdiwC6Q7fWSwQoas/oyiEYw6Hqjve5KOSykXkmFJFqzvGMb9niaUEag3Rlve492Mkye3gLw9FTv94fdQ==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", + "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", "dev": true, "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.12.17", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.12.17", - "@babel/types": "^7.12.17", + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4", "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" + "globals": "^11.1.0" }, "dependencies": { "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "dev": true, "requires": { "ms": "2.1.2" @@ -1173,13 +1220,12 @@ } }, "@babel/types": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.17.tgz", - "integrity": "sha512-tNMDjcv/4DIcHxErTgwB9q2ZcYyN0sUfgGKUK/mm1FJK7Wz+KstoEekxrl/tBiNDgLK1HGi+sppj1An/1DR4fQ==", + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", + "@babel/helper-validator-identifier": "^7.14.9", "to-fast-properties": "^2.0.0" }, "dependencies": { @@ -1191,63 +1237,262 @@ } } }, - "@fortawesome/fontawesome-free": { - "version": "5.15.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.2.tgz", - "integrity": "sha512-7l/AX41m609L/EXI9EKH3Vs3v0iA8tKlIOGtw+kgcoanI7p+e4I4GYLqW3UXWiTnjSFymKSmTTPKYrivzbxxqA==" + "@discoveryjs/json-ext": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.5.tgz", + "integrity": "sha512-6nFkfkmSeV/rqSaS4oWHgmpnYw194f6hmWF5is6b0J1naJZoiD0NTc9AiUwPHvWsowkjuHErCZT1wa0jg+BLIA==", + "dev": true }, - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "@fortawesome/fontawesome-free": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz", + "integrity": "sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg==", + "dev": true + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "requires": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" } }, "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, "@sindresorhus/is": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", - "integrity": "sha1-mgb08TfuhNffBGDB/bETX/psUP0=" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.2.0.tgz", + "integrity": "sha512-VkE3KLBmJwcCaVARtQpfuKcKv8gcBmUubrfHGF84dXuuW6jgsRYxPtzcIhPyK9WAPpRt2/xY6zkD9MnRaJzSyw==" + }, + "@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "requires": { + "defer-to-connect": "^2.0.0" + } + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" + }, + "@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true + }, + "@types/babel__core": { + "version": "7.1.16", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.16.tgz", + "integrity": "sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.3.tgz", + "integrity": "sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", + "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/cacheable-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", + "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", + "requires": { + "@types/http-cache-semantics": "*", + "@types/keyv": "*", + "@types/node": "*", + "@types/responselike": "*" + } + }, + "@types/clean-css": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@types/clean-css/-/clean-css-4.2.5.tgz", + "integrity": "sha512-NEzjkGGpbs9S9fgC4abuBvTpVwE3i+Acu9BBod3PUyjDVZcNsGx61b8r2PphR61QGPnn0JHVs5ey6/I4eTrkxw==", + "dev": true, + "requires": { + "@types/node": "*", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@types/eslint": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.0.tgz", + "integrity": "sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.50", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", + "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", + "dev": true }, "@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==", "dev": true, "requires": { "@types/minimatch": "*", "@types/node": "*" } }, + "@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" + }, + "@types/http-proxy": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.7.tgz", + "integrity": "sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/imagemin": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@types/imagemin/-/imagemin-7.0.1.tgz", + "integrity": "sha512-xEn5+M3lDBtI3JxLy6eU3ksoVurygnlG7OYhTqJfGGP4PcvYnfn+IABCmMve7ziM/SneHDm5xgJFKC8hCYPicw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/imagemin-gifsicle": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@types/imagemin-gifsicle/-/imagemin-gifsicle-7.0.1.tgz", + "integrity": "sha512-kUz6sUh0P95JOS0RGEaaemWUrASuw+dLsWIveK2UZJx74id/B9epgblMkCk/r5MjUWbZ83wFvacG5Rb/f97gyA==", + "dev": true, + "requires": { + "@types/imagemin": "*" + } + }, + "@types/imagemin-mozjpeg": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@types/imagemin-mozjpeg/-/imagemin-mozjpeg-8.0.1.tgz", + "integrity": "sha512-kMQWEoKxxhlnH4POI3qfW9DjXlQfi80ux3l2b3j5R3eudSCoUIzKQLkfMjNJ6eMYnMWBcB+rfQOWqIzdIwFGKw==", + "dev": true, + "requires": { + "@types/imagemin": "*" + } + }, + "@types/imagemin-optipng": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@types/imagemin-optipng/-/imagemin-optipng-5.2.1.tgz", + "integrity": "sha512-XCM/3q+HUL7v4zOqMI+dJ5dTxT+MUukY9KU49DSnYb/4yWtSMHJyADP+WHSMVzTR63J2ZvfUOzSilzBNEQW78g==", + "dev": true, + "requires": { + "@types/imagemin": "*" + } + }, + "@types/imagemin-svgo": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@types/imagemin-svgo/-/imagemin-svgo-8.0.1.tgz", + "integrity": "sha512-YafkdrVAcr38U0Ln1C+L1n4SIZqC47VBHTyxCq7gTUSd1R9MdIvMcrljWlgU1M9O68WZDeQWUrKipKYfEOCOvQ==", + "dev": true, + "requires": { + "@types/imagemin": "*", + "@types/svgo": "^1" + } + }, "@types/json-schema": { "version": "7.0.7", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==" }, + "@types/keyv": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.3.tgz", + "integrity": "sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg==", + "requires": { + "@types/node": "*" + } + }, "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", "dev": true }, "@types/node": { "version": "14.14.31", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.31.tgz", - "integrity": "sha512-vFHy/ezP5qI0rFgJ7aQnjDXwAMrG0KqqIH7tQG5PPv3BWBayOPIQNBjVc/P6hhdZfMx51REc6tfDNXHUio893g==", - "dev": true + "integrity": "sha512-vFHy/ezP5qI0rFgJ7aQnjDXwAMrG0KqqIH7tQG5PPv3BWBayOPIQNBjVc/P6hhdZfMx51REc6tfDNXHUio893g==" }, - "@types/q": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", - "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, "@types/raf": { @@ -1256,23 +1501,74 @@ "integrity": "sha512-taW5/WYqo36N7V39oYyHP9Ipfd5pNFvGTIQsNGj86xV88YQ7GnI30/yMfKDF7Zgin0m3e+ikX88FvImnK4RjGw==", "optional": true }, + "@types/responselike": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "requires": { + "@types/node": "*" + } + }, + "@types/retry": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", + "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==", + "dev": true + }, + "@types/svgo": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@types/svgo/-/svgo-1.3.6.tgz", + "integrity": "sha512-AZU7vQcy/4WFEuwnwsNsJnFwupIpbllH1++LXScN6uxT1Z4zPzdrWG97w4/I7eFKFTvfy/bHFStWjdBAg2Vjug==", + "dev": true + }, "@vue/component-compiler-utils": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.2.0.tgz", - "integrity": "sha512-lejBLa7xAMsfiZfNp7Kv51zOzifnb29FwdnMLa96z26kXErPFioSf9BMcePVIQ6/Gc6/mC0UrPpxAWIHyae0vw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.2.2.tgz", + "integrity": "sha512-rAYMLmgMuqJFWAOb3Awjqqv5X3Q3hVr4jH/kgrFJpiU0j3a90tnNBplqbj+snzrgZhC9W128z+dtgMifOiMfJg==", "dev": true, "requires": { "consolidate": "^0.15.1", "hash-sum": "^1.0.2", "lru-cache": "^4.1.2", "merge-source-map": "^1.1.0", - "postcss": "^7.0.14", + "postcss": "^7.0.36", "postcss-selector-parser": "^6.0.2", "prettier": "^1.18.2", "source-map": "~0.6.1", "vue-template-es2015-compiler": "^1.9.0" }, "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", @@ -1283,12 +1579,32 @@ "yallist": "^2.1.2" } }, + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", @@ -1298,180 +1614,172 @@ } }, "@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", "dev": true, "requires": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", "dev": true }, - "@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", - "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", "dev": true, "requires": { - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", - "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0" + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" } }, "@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", "dev": true, "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" } }, "@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, "@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" } }, "@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", - "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/floating-point-hex-parser": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-code-frame": "1.9.0", - "@webassemblyjs/helper-fsm": "1.9.0", - "@xtuc/long": "4.2.2" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, "@webassemblyjs/wast-printer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", + "@webassemblyjs/ast": "1.11.1", "@xtuc/long": "4.2.2" } }, + "@webpack-cli/configtest": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.4.tgz", + "integrity": "sha512-cs3XLy+UcxiP6bj0A6u7MLLuwdXJ1c3Dtc0RkKg+wiI1g/Ti1om8+/2hc2A2B60NbBNAbMgyBMHvyymWm/j4wQ==", + "dev": true + }, + "@webpack-cli/info": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.3.0.tgz", + "integrity": "sha512-ASiVB3t9LOKHs5DyVUcxpraBXDOKubYu/ihHhU+t1UPpxsivg6Od2E2qU4gJCekfEddzRBzHhzA/Acyw/mlK/w==", + "dev": true, + "requires": { + "envinfo": "^7.7.3" + } + }, + "@webpack-cli/serve": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.5.2.tgz", + "integrity": "sha512-vgJ5OLWadI8aKjDlOH3rb+dYyPd2GTZuQC/Tihjct6F9GpXGZINo3Y/IVuZVTM1eDQB+/AOsjPUWH/WySDaXvw==", + "dev": true + }, "@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -1494,14 +1802,14 @@ } }, "abab": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", - "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", "dev": true, "requires": { "mime-types": "~2.1.24", @@ -1514,20 +1822,20 @@ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" }, "acorn-globals": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz", - "integrity": "sha1-VbtemGkVB7dFedBRNBMhfDgMVM8=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", "requires": { - "acorn": "^2.1.0" - }, - "dependencies": { - "acorn": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", - "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=" - } + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" } }, + "acorn-import-assertions": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.7.6.tgz", + "integrity": "sha512-FlVvVFA1TX6l3lp8VjDnYYq7R1nyW6x3svAt4nDgrWQ9SBaSh9CnbwgSUTasgfNfOG5HlM1ehugCvM+hjo56LA==", + "dev": true + }, "acorn-node": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", @@ -1593,6 +1901,29 @@ } } }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, "aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -1614,12 +1945,6 @@ "uri-js": "^4.2.2" } }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true - }, "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", @@ -1631,87 +1956,49 @@ "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", "dev": true }, - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "dev": true + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "optional": true }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", "dev": true }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true }, "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" } }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" - }, "array-filter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", @@ -1720,9 +2007,14 @@ "array-flatten": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha1-JO+AoowaiTYX4hSbDG0NeIKTsJk=", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", "dev": true }, + "array-from": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", + "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=" + }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", @@ -1736,26 +2028,6 @@ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha1-jSR136tVO7M+d7VOWeiAu4ziMTY=", - "requires": { - "safer-buffer": "~2.1.0" - } - }, "asn1.js": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", @@ -1798,60 +2070,83 @@ } } }, - "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "ast-types": { - "version": "0.9.6", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", - "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=", - "dev": true + "ast-transform": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/ast-transform/-/ast-transform-0.0.0.tgz", + "integrity": "sha1-dJRAWIh9goPhidlUYAlHvJj+AGI=", + "requires": { + "escodegen": "~1.2.0", + "esprima": "~1.0.4", + "through": "~2.3.4" + }, + "dependencies": { + "escodegen": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.2.0.tgz", + "integrity": "sha1-Cd55Z3kcyVi3+Jot220jRRrzJ+E=", + "requires": { + "esprima": "~1.0.4", + "estraverse": "~1.5.0", + "esutils": "~1.0.0", + "source-map": "~0.1.30" + } + }, + "esprima": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", + "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=" + }, + "estraverse": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.5.1.tgz", + "integrity": "sha1-hno+jlip+EYYr7bC3bzZFrfLr3E=" + }, + "esutils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz", + "integrity": "sha1-gVHTWOIMisx/t0XnRywAJf5JZXA=" + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "optional": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } }, "async": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha1-1yYl4jRKNlbjo61Pp0n6gymdgv8=", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, "requires": { "lodash": "^4.17.14" } }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha1-tyfb+H12UWAvBvTUrDh/R9kbDL8=", - "dev": true - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k=" + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, "autoprefixer": { - "version": "9.8.6", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", - "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", + "version": "10.3.5", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.3.5.tgz", + "integrity": "sha512-2H5kQSsyoOMdIehTzIt/sC9ZDIgWqlkG/dbevm9B9xQZ1TDPBHpNUDW5ENqqQQzuaBWEo75JkV0LJe+o5Lnr5g==", "dev": true, "requires": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001109", - "colorette": "^1.2.1", + "browserslist": "^4.17.1", + "caniuse-lite": "^1.0.30001259", + "fraction.js": "^4.1.1", + "nanocolors": "^0.1.5", "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.32", "postcss-value-parser": "^4.1.0" } }, @@ -1863,11 +2158,6 @@ "array-filter": "^1.0.0" } }, - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" - }, "axios": { "version": "0.20.0", "resolved": "https://registry.npmjs.org/axios/-/axios-0.20.0.tgz", @@ -2038,17 +2328,6 @@ } } }, - "babel-merge": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/babel-merge/-/babel-merge-2.0.1.tgz", - "integrity": "sha512-puTQQxuzS+0JlMyVdfsTVaCgzqjBXKPMv7oUANpYcHFY+7IptWZ4PZDYX+qBxrRMtrriuBA44LkKpS99EJzqVA==", - "dev": true, - "requires": { - "@babel/core": "^7.0.0-beta.49", - "deepmerge": "^2.1.0", - "object.omit": "^3.0.0" - } - }, "babel-messages": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", @@ -2076,6 +2355,36 @@ "object.assign": "^4.1.0" } }, + "babel-plugin-polyfill-corejs2": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz", + "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.2", + "semver": "^6.1.1" + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz", + "integrity": "sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.2", + "core-js-compat": "^3.16.2" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz", + "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.2" + } + }, "babel-plugin-syntax-async-functions": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", @@ -2435,7 +2744,6 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, "requires": { "core-js": "^2.4.0", "regenerator-runtime": "^0.11.0" @@ -2494,36 +2802,10 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.2.0.tgz", + "integrity": "sha512-7emyCsu1/xiBXgQZrscw/8KPRT44I4Yq9Pe6EGs3aPRTsWuggML1/1DTuZUuIaJPIm1FTDUVXl4x/yW8s0kQDQ==" }, "base64-js": { "version": "1.5.1", @@ -2536,47 +2818,21 @@ "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", "dev": true }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "integrity": "sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg=" }, "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha1-WYr+VHVbKGilMw0q/51Ou1Mgm2U=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.0.3.tgz", - "integrity": "sha1-/FQhoo/UImA2w7OJGmaiW8ZNIm4=", - "requires": { - "readable-stream": "~2.0.5" - } - }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha1-nyKcFb4nJFT/qXOs4NvueaGww28=", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, "blueimp-canvas-to-blob": { @@ -2615,7 +2871,7 @@ "body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha1-lrJwnlfJxOCab9Zqj9l5hE9p8Io=", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", "dev": true, "requires": { "bytes": "3.1.0", @@ -2633,13 +2889,7 @@ "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY=", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha1-QdwaAV49WB8WIXdr4xr7KHapsbw=", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", "dev": true } } @@ -2664,14 +2914,6 @@ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", "dev": true }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "requires": { - "hoek": "2.x.x" - } - }, "bootstrap": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.4.1.tgz", @@ -2713,9 +2955,9 @@ "integrity": "sha1-EQPWvADPv6jPyaJZmrUYxVZD2j8=" }, "bootstrap-table": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/bootstrap-table/-/bootstrap-table-1.18.2.tgz", - "integrity": "sha512-BShrYY9bcadwxikP5Sd/+tZlbLcYqOBjYm5bdJLu3lRTgXEQ1p937ZNlcCMhIrRhvelUKlSl7EFORnEkSHR7gA==" + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/bootstrap-table/-/bootstrap-table-1.18.3.tgz", + "integrity": "sha512-/eFLkldDlNFi37qC/d9THfRVxMUGD34E8fQBFtXJLDHLBOVKWDTq7BV+udoP7k3FfCEyhM1jWQnQ0rMQdBv//w==" }, "brace-expansion": { "version": "1.1.11", @@ -2727,21 +2969,23 @@ } }, "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" + "fill-range": "^7.0.1" + } + }, + "brfs": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brfs/-/brfs-2.0.2.tgz", + "integrity": "sha512-IrFjVtwu4eTJZyu8w/V2gxU7iLTtcHih67sgEdzrhjLBMHp2uYefUBfdM4k2UvcuWMgV7PQDZHSLeNWnLFKWVQ==", + "requires": { + "quote-stream": "^1.0.1", + "resolve": "^1.1.5", + "static-module": "^3.0.2", + "through2": "^2.0.0" } }, "brorand": { @@ -2749,6 +2993,14 @@ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" }, + "brotli": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.2.tgz", + "integrity": "sha1-UlqcrU/LqWR119OI9q7LE+7VL0Y=", + "requires": { + "base64-js": "^1.1.2" + } + }, "browser-pack": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", @@ -2762,6 +3014,11 @@ "umd": "^3.0.0" } }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + }, "browser-resolve": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", @@ -2916,6 +3173,36 @@ "safe-buffer": "^5.1.2" } }, + "browserify-optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-optional/-/browserify-optional-1.0.1.tgz", + "integrity": "sha1-HhNyLP3g2F8SFnbCpyztUzoBiGk=", + "requires": { + "ast-transform": "0.0.0", + "ast-types": "^0.7.0", + "browser-resolve": "^1.8.1" + }, + "dependencies": { + "ast-types": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.7.8.tgz", + "integrity": "sha1-kC0uDWDQcb3NRtwRXhgJ7RHBOKk=" + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "requires": { + "resolve": "1.1.7" + } + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" + } + } + }, "browserify-rsa": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", @@ -2975,16 +3262,16 @@ } }, "browserslist": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", - "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.1.tgz", + "integrity": "sha512-aLD0ZMDSnF4lUt4ZDNgqi5BUn9BZ7YdQdI/cYlILrhdSSZJLU9aNZoD5/NBmM4SK34APB2e83MOsRt1EnkuyaQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001181", - "colorette": "^1.2.1", - "electron-to-chromium": "^1.3.649", + "caniuse-lite": "^1.0.30001259", + "electron-to-chromium": "^1.3.846", "escalade": "^3.1.1", - "node-releases": "^1.1.70" + "nanocolors": "^0.1.5", + "node-releases": "^1.1.76" } }, "btoa": { @@ -3001,6 +3288,11 @@ "ieee754": "^1.1.4" } }, + "buffer-equal": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", + "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=" + }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -3009,7 +3301,7 @@ "buffer-indexof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha1-Uvq8xqYG0aADAoAmSO9o9jnaJow=", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", "dev": true }, "buffer-xor": { @@ -3028,88 +3320,29 @@ "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", "dev": true }, - "cacache": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz", - "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==", - "dev": true, - "requires": { - "chownr": "^1.1.2", - "figgy-pudding": "^3.5.1", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.2", - "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", - "minipass": "^3.0.0", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "p-map": "^3.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^2.7.1", - "ssri": "^7.0.0", - "unique-filename": "^1.1.1" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - } - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } + "cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==" }, "cacheable-request": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", - "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", + "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", "requires": { - "clone-response": "1.0.2", - "get-stream": "3.0.0", - "http-cache-semantics": "3.8.1", - "keyv": "3.0.0", - "lowercase-keys": "1.0.0", - "normalize-url": "2.0.1", - "responselike": "1.0.2" + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" }, "dependencies": { - "lowercase-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" - }, "normalize-url": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", - "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", - "requires": { - "prepend-http": "^2.0.0", - "query-string": "^5.0.1", - "sort-keys": "^2.0.0" - } + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" } } }, @@ -3127,44 +3360,28 @@ "get-intrinsic": "^1.0.2" } }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "requires": { - "callsites": "^2.0.0" - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", "dev": true, "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "dev": true + } } }, "camelcase": { @@ -3185,44 +3402,81 @@ } }, "caniuse-lite": { - "version": "1.0.30001190", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001190.tgz", - "integrity": "sha512-62KVw474IK8E+bACBYhRS0/L6o/1oeAVkpF2WetjV58S5vkzNh0/Rz3lD8D4YCbOTqi0/aD4X3LtoP7V5xnuAg==", - "dev": true + "version": "1.0.30001260", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001260.tgz", + "integrity": "sha512-Fhjc/k8725ItmrvW5QomzxLeojewxvqiYCKeFcfFEhut28IVLdpHU19dneOmltZQIE5HNbawj1HYD+1f2bM1Dg==", + "dev": true, + "requires": { + "nanocolors": "^0.1.0" + } }, "canvg": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/canvg/-/canvg-3.0.7.tgz", - "integrity": "sha512-4sq6iL5Q4VOXS3PL1BapiXIZItpxYyANVzsAKpTPS5oq4u3SKbGfUcbZh2gdLCQ3jWpG/y5wRkMlBBAJhXeiZA==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/canvg/-/canvg-3.0.8.tgz", + "integrity": "sha512-9De5heHfVRgCkln3CGEeSJMviN5U2RyxL4uutYoe8HxI60BjH2XnT2ZUHIp+ZaAZNTUd5Asqfut8WEEdANqfAg==", "optional": true, "requires": { - "@babel/runtime-corejs3": "^7.9.6", + "@babel/runtime": "^7.12.5", "@types/raf": "^3.4.0", + "core-js": "^3.8.3", "raf": "^3.4.1", + "regenerator-runtime": "^0.13.7", "rgbcolor": "^1.0.1", "stackblur-canvas": "^2.0.0", "svg-pathdata": "^5.0.5" + }, + "dependencies": { + "core-js": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.18.0.tgz", + "integrity": "sha512-WJeQqq6jOYgVgg4NrXKL0KLQhi0CT4ZOCvFL+3CQ5o7I6J8HkT5wd53EadMfqTDp1so/MT1J+w2ujhWcCJtN7w==", + "optional": true + }, + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "optional": true + } } }, - "caseless": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=" - }, "cfb": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.0.tgz", - "integrity": "sha512-sXMvHsKCICVR3Naq+J556K+ExBo9n50iKl6LGarlnvuA2035uMlGA/qVrc0wQtow5P1vJEw9UyrKLCbtIKz+TQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.1.tgz", + "integrity": "sha512-wT2ScPAFGSVy7CY+aauMezZBnNrfnaLSrxHUHdea+Td/86vrk6ZquggV+ssBR88zNs0OnBkL2+lf9q0K+zVGzQ==", "requires": { - "adler-32": "~1.2.0", + "adler-32": "~1.3.0", "crc-32": "~1.2.0", - "printj": "~1.1.2" + "printj": "~1.3.0" + }, + "dependencies": { + "adler-32": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.0.tgz", + "integrity": "sha512-f5nltvjl+PRUh6YNfUstRaXwJxtfnKEWhAWWlmKvh+Y3J2+98a0KKVYDEhz6NdKGqswLhjNGznxfSsZGOvOd9g==", + "requires": { + "printj": "~1.2.2" + }, + "dependencies": { + "printj": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/printj/-/printj-1.2.3.tgz", + "integrity": "sha512-sanczS6xOJOg7IKDvi4sGOUOe7c1tsEzjwlLFH/zgwx/uyImVM9/rgBkc8AfiQa/Vg54nRd8mkm9yI7WV/O+WA==" + } + } + }, + "printj": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/printj/-/printj-1.3.0.tgz", + "integrity": "sha512-017o8YIaz8gLhaNxRB9eBv2mWXI2CtzhPJALnQTP+OPpuUfP0RMWqr/mHCzqVeu1AQxfzSfAtAq66vKB8y7Lzg==" + } } }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, "requires": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", @@ -3269,39 +3523,32 @@ } }, "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha1-gEs6e2qZNYw8XGHnHYco8EHP+Rc=", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", "dev": true, "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" } }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha1-b8nXtC0ypYNZYzdmbn0ICE2izGs=", - "dev": true - }, "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, + "ci-info": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", + "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", + "dev": true }, "cipher-base": { "version": "1.0.4", @@ -3317,75 +3564,15 @@ "resolved": "https://registry.npmjs.org/ckeditor/-/ckeditor-4.12.1.tgz", "integrity": "sha512-pH2Su4oi0D4iN/3U8nUcwI7/lXHoOJi0aiN8e2zxnm4Ow5kq8eZP2ZGmpYyuqRyKZ2tHaU8+OyYi7laXcjiq9Q==" }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - } - } - }, "classie": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/classie/-/classie-1.0.0.tgz", "integrity": "sha1-/JsptH5k43SiBi+2JNBaYc1wOrI=" }, "clean-css": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", - "integrity": "sha1-UHtd59l7SO5T2ErbAWD/YhY4D3g=", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.1.5.tgz", + "integrity": "sha512-9dr/cU/LjMpU57PXlSvDkVRh0rPxJBXiBtD0+SgYt8ahTCsXtfKjCkNYgIoTC6mBg8CFr5EKhW3DKCaGMUbUfQ==", "dev": true, "requires": { "source-map": "~0.6.0" @@ -3394,7 +3581,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } @@ -3405,47 +3592,41 @@ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true }, + "cli-table3": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.0.tgz", + "integrity": "sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ==", + "dev": true, + "requires": { + "colors": "^1.1.2", + "object-assign": "^4.1.0", + "string-width": "^4.2.0" + } + }, "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "wrap-ansi": "^7.0.0" }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } } } @@ -3455,6 +3636,17 @@ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, "clone-response": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", @@ -3463,90 +3655,17 @@ "mimic-response": "^1.0.0" } }, - "coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "dev": true, - "requires": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, "codepage": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.14.0.tgz", - "integrity": "sha1-jL4lSBMjVZ19MHVxsP/5HnodL5k=", - "requires": { - "commander": "~2.14.1", - "exit-on-epipe": "~1.0.1" - }, - "dependencies": { - "commander": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz", - "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==" - } - } + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz", + "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==" }, "collect.js": { - "version": "4.28.6", - "resolved": "https://registry.npmjs.org/collect.js/-/collect.js-4.28.6.tgz", - "integrity": "sha512-NAyuk1DnCotRaDZIS5kJ4sptgkwOeYqElird10yziN5JBuwYOGkOTguhNcPn5g344IfylZecxNYZAVXgv19p5Q==", + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/collect.js/-/collect.js-4.29.0.tgz", + "integrity": "sha512-yhgGYEsLEcqnLT1NmRlN1+1euoz9SDhxQ4QyDhWYsKoWsg7252PKA5++dWaDs8mdFxbkmXDXQUaHXI9J2eTPkQ==", "dev": true }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", - "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", - "dev": true, - "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.4" - } - }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -3567,22 +3686,25 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "color-string": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz", - "integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==", - "dev": true, - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } + "colord": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.8.0.tgz", + "integrity": "sha512-kNkVV4KFta3TYQv0bzs4xNwLaeag261pxgzGQSh4cQ1rEhYjcTJfFRP0SDlbhLONg0eSoLzrDd79PosjbltufA==", + "dev": true }, "colorette": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", - "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", "dev": true }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "optional": true + }, "combine-source-map": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", @@ -3609,15 +3731,15 @@ "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha1-w9RaizT9cwYxoRCoolIGgrMdWn8=", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "requires": { "delayed-stream": "~1.0.0" } }, "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" }, "commondir": { "version": "1.0.1", @@ -3625,16 +3747,10 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha1-FuQHD7qK4ptnnyIVhT7hgasuq8A=", - "dev": true - }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha1-r1PMprBw1MPAdQ+9dyhqbXzEb7o=", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "dev": true, "requires": { "mime-db": ">= 1.43.0 < 2" @@ -3643,7 +3759,7 @@ "compression": { "version": "1.7.4", "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha1-lVI+/xcMpXwpoMpB5v4TH0Hlu48=", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "dev": true, "requires": { "accepts": "~1.3.5", @@ -3669,20 +3785,16 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, - "concat-stream": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.0.tgz", - "integrity": "sha1-U/fUPFHF5D+ByP3QMyHGMb5o1hE=", - "requires": { - "inherits": "~2.0.1", - "readable-stream": "~2.0.0", - "typedarray": "~0.0.5" - } - }, "connect-history-api-fallback": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha1-izIIk1kwjRERFdgcrT/Oq4iPl7w=", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", "dev": true }, "console-browserify": { @@ -3707,7 +3819,7 @@ "content-disposition": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70=", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", "dev": true, "requires": { "safe-buffer": "5.1.2" @@ -3716,14 +3828,13 @@ "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", "dev": true }, "convert-source-map": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, "requires": { "safe-buffer": "~5.1.1" } @@ -3731,7 +3842,7 @@ "cookie": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha1-vrQ35wIrO21JAZ0IhmUwPr6cFLo=", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", "dev": true }, "cookie-signature": { @@ -3748,50 +3859,18 @@ "is-what": "^3.12.0" } }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha1-kilzmMrjSTf8r9bsgTnBgFHwteA=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - } - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, "core-js": { "version": "2.6.12", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "dev": true + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" }, "core-js-compat": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.9.0.tgz", - "integrity": "sha512-YK6fwFjCOKWwGnjFUR3c544YsnA/7DoLL0ysncuOJ4pwbriAtOpvM2bygdlcXbvQCQZ7bBU9CL4t7tGl7ETRpQ==", + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.18.0.tgz", + "integrity": "sha512-tRVjOJu4PxdXjRMEgbP7lqWy1TWJu9a01oBkn8d+dNrhgmBwdTkzhHZpVJnEmhISLdoJI1lX08rcBcHi3TZIWg==", "dev": true, "requires": { - "browserslist": "^4.16.3", + "browserslist": "^4.17.0", "semver": "7.0.0" }, "dependencies": { @@ -3803,27 +3882,22 @@ } } }, - "core-js-pure": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.9.0.tgz", - "integrity": "sha512-3pEcmMZC9Cq0D4ZBh3pe2HLtqxpGNJBLXF/kZ2YzK17RbKp94w0HFbdbSx8H8kAlZG5k76hvLrkPm57Uyef+kg==", - "optional": true - }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha1-BA9yaAnFked6F8CjYmykW08Wixo=", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", "dev": true, "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" } }, "crc-32": { @@ -3876,15 +3950,6 @@ "sha.js": "^2.4.8" } }, - "cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.1" - } - }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -3902,14 +3967,6 @@ "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=", "dev": true }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "requires": { - "boom": "2.x.x" - } - }, "crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", @@ -3928,28 +3985,32 @@ "randomfill": "^1.0.3" } }, + "crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" + }, "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-1.0.1.tgz", + "integrity": "sha512-/loXYOch1qU1biStIFsHH8SxTmOseh1IJqFvy8IujXOm1h+QjUdDhkzOrR5HG8K8mlxREj0yfi8ewCHx0eMxzA==", "dev": true }, "css-declaration-sorter": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", - "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.1.3.tgz", + "integrity": "sha512-SvjQjNRZgh4ULK1LDJ2AduPKUKxIqmtU7ZAyi47BTV+M90Qvxr9AB6lKlLbDUfXqI9IQeYA8LbAsCZPpJEV3aA==", "dev": true, "requires": { - "postcss": "^7.0.1", "timsort": "^0.3.0" } }, "css-line-break": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-1.0.1.tgz", - "integrity": "sha1-GfIGOjPpX7KDG4ZEbAuAwYivRQo=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.0.1.tgz", + "integrity": "sha512-gwKYIMUn7xodIcb346wgUhE2Dt5O1Kmrc16PWi8sL4FTfyDj8P5095rzH7+O8CTZudJr+uw2GCI/hwEkDJFI2w==", "requires": { - "base64-arraybuffer": "^0.1.5" + "base64-arraybuffer": "^0.2.0" } }, "css-loader": { @@ -3970,43 +4031,81 @@ "postcss-value-parser": "^4.1.0", "schema-utils": "^2.7.0", "semver": "^6.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", "dev": true, "requires": { "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", - "dev": true - }, - "css-selector-tokenizer": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", - "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "fastparse": "^1.1.2" + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", + "nth-check": "^2.0.0" } }, "css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", "dev": true, "requires": { - "mdn-data": "2.0.4", + "mdn-data": "2.0.14", "source-map": "^0.6.1" }, "dependencies": { @@ -4019,9 +4118,9 @@ } }, "css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", + "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==", "dev": true }, "cssesc": { @@ -4030,80 +4129,58 @@ "integrity": "sha1-N3QZGZA7hoVl4cCep0dEXNGJg+4=" }, "cssnano": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", - "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.0.8.tgz", + "integrity": "sha512-Lda7geZU0Yu+RZi2SGpjYuQz4HI4/1Y+BhdD0jL7NXAQ5larCzVn+PUGuZbDMYz904AXXCOgO5L1teSvgu7aFg==", "dev": true, "requires": { - "cosmiconfig": "^5.0.0", - "cssnano-preset-default": "^4.0.7", - "is-resolvable": "^1.0.0", - "postcss": "^7.0.0" + "cssnano-preset-default": "^5.1.4", + "is-resolvable": "^1.1.0", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" } }, "cssnano-preset-default": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", - "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.1.4.tgz", + "integrity": "sha512-sPpQNDQBI3R/QsYxQvfB4mXeEcWuw0wGtKtmS5eg8wudyStYMgKOQT39G07EbW1LB56AOYrinRS9f0ig4Y3MhQ==", "dev": true, "requires": { - "css-declaration-sorter": "^4.0.1", - "cssnano-util-raw-cache": "^4.0.1", - "postcss": "^7.0.0", - "postcss-calc": "^7.0.1", - "postcss-colormin": "^4.0.3", - "postcss-convert-values": "^4.0.1", - "postcss-discard-comments": "^4.0.2", - "postcss-discard-duplicates": "^4.0.2", - "postcss-discard-empty": "^4.0.1", - "postcss-discard-overridden": "^4.0.1", - "postcss-merge-longhand": "^4.0.11", - "postcss-merge-rules": "^4.0.3", - "postcss-minify-font-values": "^4.0.2", - "postcss-minify-gradients": "^4.0.2", - "postcss-minify-params": "^4.0.2", - "postcss-minify-selectors": "^4.0.2", - "postcss-normalize-charset": "^4.0.1", - "postcss-normalize-display-values": "^4.0.2", - "postcss-normalize-positions": "^4.0.2", - "postcss-normalize-repeat-style": "^4.0.2", - "postcss-normalize-string": "^4.0.2", - "postcss-normalize-timing-functions": "^4.0.2", - "postcss-normalize-unicode": "^4.0.1", - "postcss-normalize-url": "^4.0.1", - "postcss-normalize-whitespace": "^4.0.2", - "postcss-ordered-values": "^4.1.2", - "postcss-reduce-initial": "^4.0.3", - "postcss-reduce-transforms": "^4.0.2", - "postcss-svgo": "^4.0.2", - "postcss-unique-selectors": "^4.0.1" + "css-declaration-sorter": "^6.0.3", + "cssnano-utils": "^2.0.1", + "postcss-calc": "^8.0.0", + "postcss-colormin": "^5.2.0", + "postcss-convert-values": "^5.0.1", + "postcss-discard-comments": "^5.0.1", + "postcss-discard-duplicates": "^5.0.1", + "postcss-discard-empty": "^5.0.1", + "postcss-discard-overridden": "^5.0.1", + "postcss-merge-longhand": "^5.0.2", + "postcss-merge-rules": "^5.0.2", + "postcss-minify-font-values": "^5.0.1", + "postcss-minify-gradients": "^5.0.2", + "postcss-minify-params": "^5.0.1", + "postcss-minify-selectors": "^5.1.0", + "postcss-normalize-charset": "^5.0.1", + "postcss-normalize-display-values": "^5.0.1", + "postcss-normalize-positions": "^5.0.1", + "postcss-normalize-repeat-style": "^5.0.1", + "postcss-normalize-string": "^5.0.1", + "postcss-normalize-timing-functions": "^5.0.1", + "postcss-normalize-unicode": "^5.0.1", + "postcss-normalize-url": "^5.0.2", + "postcss-normalize-whitespace": "^5.0.1", + "postcss-ordered-values": "^5.0.2", + "postcss-reduce-initial": "^5.0.1", + "postcss-reduce-transforms": "^5.0.1", + "postcss-svgo": "^5.0.2", + "postcss-unique-selectors": "^5.0.1" } }, - "cssnano-util-get-arguments": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", - "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", - "dev": true - }, - "cssnano-util-get-match": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", - "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", - "dev": true - }, - "cssnano-util-raw-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", - "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "cssnano-util-same-parent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", - "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "cssnano-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-2.0.1.tgz", + "integrity": "sha512-i8vLRZTnEH9ubIyfdZCAdIdgnHAUeQeByEeQ2I7oTilvP9oHO6RScpeq3GsFUVqeB8uZgOQ9pw8utofNn32hhQ==", "dev": true }, "csso": { @@ -4113,69 +4190,50 @@ "dev": true, "requires": { "css-tree": "^1.1.2" - }, - "dependencies": { - "css-tree": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.2.tgz", - "integrity": "sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ==", - "dev": true, - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - } - }, - "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" }, "cssstyle": { - "version": "0.2.37", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", - "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", "requires": { - "cssom": "0.3.x" + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + } } }, - "cyclist": { + "d": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } }, "dash-ast": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==" }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", "requires": { - "assert-plus": "^1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" } }, "datatables.net": { @@ -4210,30 +4268,30 @@ "ms": "2.0.0" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + "decimal.js": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==" }, "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "requires": { - "mimic-response": "^1.0.0" + "mimic-response": "^3.1.0" + }, + "dependencies": { + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" + } } }, "deep-equal": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", "integrity": "sha1-tcmMlCzv+vfLBR4k4UNKJaLmB2o=", - "dev": true, "requires": { "is-arguments": "^1.0.4", "is-date-object": "^1.0.1", @@ -4244,26 +4302,30 @@ } }, "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" - }, - "deepmerge": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", - "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==", - "dev": true + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, "default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", "dev": true, "requires": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" + "execa": "^5.0.0" } }, + "defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==" + }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true + }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -4272,47 +4334,46 @@ "object-keys": "^1.0.12" } }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, "defined": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" }, "del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", "dev": true, "requires": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" }, "dependencies": { - "p-map": { + "array-union": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true + "globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } } } }, @@ -4353,16 +4414,10 @@ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", "dev": true }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, "detect-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha1-AU7o+PZpxcWAI9pkuBecCDooxGw=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true }, "detective": { @@ -4375,6 +4430,11 @@ "minimist": "^1.1.1" } }, + "dfa": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz", + "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==" + }, "diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", @@ -4393,13 +4453,12 @@ } }, "dir-glob": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "requires": { - "arrify": "^1.0.1", - "path-type": "^3.0.0" + "path-type": "^4.0.0" } }, "dns-equal": { @@ -4409,9 +4468,9 @@ "dev": true }, "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha1-EqpCaYEHW+UAuRDu3NC0fdfe2lo=", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", "dev": true, "requires": { "ip": "^1.1.0", @@ -4428,21 +4487,14 @@ } }, "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", "dev": true, "requires": { "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz", - "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==", - "dev": true - } } }, "domain-browser": { @@ -4451,11 +4503,35 @@ "integrity": "sha1-PTH1AZGmdJ3RN1p/Ui6CPULlTto=" }, "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", "dev": true }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==" + } + } + }, + "domhandler": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", + "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, "domhelper": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/domhelper/-/domhelper-0.9.1.tgz", @@ -4467,40 +4543,50 @@ } }, "dompurify": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.2.6.tgz", - "integrity": "sha512-7b7ZArhhH0SP6W2R9cqK6RjaU82FZ2UPM7RO8qN1b1wyvC/NY1FNWcX1Pu00fFOAnzEORtwXe4bPaClg6pUybQ==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.3.tgz", + "integrity": "sha512-dqnqRkPMAjOZE0FogZ+ceJNM2dZ3V/yNOuFB7+39qpO93hHhfRpHw3heYQC7DPK9FqbQTfBKUJhiSfz4MvXYwg==", "optional": true }, "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dev": true, "requires": { - "dom-serializer": "0", - "domelementtype": "1" + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" } }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", "dev": true, "requires": { - "is-obj": "^2.0.0" + "no-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "dev": true + } } }, "dotenv": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz", - "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", "dev": true }, "dotenv-expand": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-4.2.0.tgz", - "integrity": "sha1-3vHxyl1gWdJKdm5YeULCEQbOEnU=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", "dev": true }, "duplexer2": { @@ -4511,32 +4597,6 @@ "readable-stream": "^2.0.2" } }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha1-Kk31MX9sz9kfhtb9JdjYoQO4gwk=", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -4549,9 +4609,9 @@ "integrity": "sha1-+/zZ35Oo0c2/h3CtyMBaqsTST1Y=" }, "electron-to-chromium": { - "version": "1.3.671", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.671.tgz", - "integrity": "sha512-RTD97QkdrJKaKwRv9h/wGAaoR2lGxNXEcBXS31vjitgTPwTWAbLdS7cEsBK68eEQy7p6YyT8D5BxBEYHu2SuwQ==", + "version": "1.3.849", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.849.tgz", + "integrity": "sha512-RweyW60HPOqIcxoKTGr38Yvtf2aliSUqX8dB3e9geJ0Bno0YLjcOX5F7/DPVloBkJWaPZ7xOM1A0Yme2T1A34w==", "dev": true }, "elliptic": { @@ -4596,32 +4656,18 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha1-WuZKX0UFe682JuwU2gyl5LJDHrA=", - "dev": true, "requires": { "once": "^1.4.0" } }, "enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz", + "integrity": "sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "dependencies": { - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - } + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" } }, "entities": { @@ -4630,10 +4676,17 @@ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "dev": true }, + "envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "dev": true + }, "errno": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "optional": true, "requires": { "prr": "~1.0.1" } @@ -4641,21 +4694,12 @@ "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha1-tKxAZIEH/c3PriQvQovqihTU8b8=", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { "is-arrayish": "^0.2.1" } }, - "error-stack-parser": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", - "integrity": "sha1-WpmnB716TFinl5AtSNgoA+3mqtg=", - "dev": true, - "requires": { - "stackframe": "^1.1.1" - } - }, "es-abstract": { "version": "1.18.0-next.2", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.2.tgz", @@ -4677,6 +4721,12 @@ "string.prototype.trimstart": "^1.0.3" } }, + "es-module-lexer": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.7.1.tgz", + "integrity": "sha512-MgtWFl5No+4S3TmhDmCz2ObFGm6lEpTnzbQi+Dd+pw4mlTIZTmM2iAs5gRlmx5zS9luzobCSBSI90JM/1/JgOw==", + "dev": true + }, "es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -4687,19 +4737,74 @@ "is-symbol": "^1.0.2" } }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" + } + }, "es6-promise": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" }, - "es6-templates": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/es6-templates/-/es6-templates-0.2.3.tgz", - "integrity": "sha1-XLmsn7He1usSOTQrgdeSu7QHjuQ=", - "dev": true, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", "requires": { - "recast": "~0.11.12", - "through": "~2.3.6" + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-symbol": "3.1.1", + "event-emitter": "~0.3.5" + }, + "dependencies": { + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + } + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" } }, "escalade": { @@ -4740,12 +4845,12 @@ } }, "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { - "esrecurse": "^4.1.0", + "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, @@ -4774,7 +4879,12 @@ "estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=" + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "estree-is-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-is-function/-/estree-is-function-1.0.0.tgz", + "integrity": "sha512-nSCWn1jkSq2QAtkaVLJZY2ezwcFO161HVc174zL1KPW3RJ+O6C3eJb8Nx7OXzvhoEv+nLgSR1g71oWUHUDTrJA==" }, "esutils": { "version": "2.0.3", @@ -4792,6 +4902,15 @@ "resolved": "https://registry.npmjs.org/eve-raphael/-/eve-raphael-0.5.0.tgz", "integrity": "sha1-F8dUt5K+7z+maE15z1pHxjxM2jA=" }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, "eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -4803,15 +4922,6 @@ "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==" }, - "eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", - "dev": true, - "requires": { - "original": "^1.0.0" - } - }, "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", @@ -4822,77 +4932,27 @@ } }, "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" }, "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } } } }, @@ -4901,82 +4961,10 @@ "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==" }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - } - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, "express": { "version": "4.17.1", "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha1-RJH8OGBc9R+GKdOcK10Cb5ikwTQ=", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", "dev": true, "requires": { "accepts": "~1.3.7", @@ -5016,120 +5004,40 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha1-QdwaAV49WB8WIXdr4xr7KHapsbw=", - "dev": true } } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=" - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, - "extract-text-webpack-plugin": { - "version": "4.0.0-beta.0", - "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-4.0.0-beta.0.tgz", - "integrity": "sha512-Hypkn9jUTnFr0DpekNam53X47tXn3ucY08BQumv7kdGgeVUBLq3DJHJTi6HNxv4jl9W+Skxjz9+RnK0sJyqqjA==", - "dev": true, - "requires": { - "async": "^2.4.1", - "loader-utils": "^1.1.0", - "schema-utils": "^0.4.5", - "webpack-sources": "^1.1.0" - }, - "dependencies": { - "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "extract-zip": { + "ext": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.5.0.tgz", - "integrity": "sha1-ksz22B73Cp+kwXRxFMzvbYaIpsQ=", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.5.0.tgz", + "integrity": "sha512-+ONcYoWj/SoQwUofMr94aGu05Ou4FepKi7N7b+O8T4jVfyIsZQV1/xeS8jpaBzF0csAk0KLXoHCxU7cKYZjo1Q==", "requires": { - "concat-stream": "1.5.0", - "debug": "0.7.4", - "mkdirp": "0.5.0", - "yauzl": "2.4.1" + "type": "^2.5.0" }, "dependencies": { - "debug": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", - "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=" + "type": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", + "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==" } } }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-glob": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", - "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", "dev": true, "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" } }, "fast-json-stable-stringify": { @@ -5152,59 +5060,80 @@ "resolved": "https://registry.npmjs.org/fastclick/-/fastclick-1.0.6.tgz", "integrity": "sha1-FhYlsnsaWAZAWTa9qaLBkm0Gvmo=" }, - "fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha1-kXKMWllC7O2FMSg8eUQe5BIsNak=", + "fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", "dev": true }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, "faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "dev": true, "requires": { "websocket-driver": ">=0.5.1" } }, - "fd-slicer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", - "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", - "requires": { - "pend": "~1.2.0" - } - }, "fflate": { "version": "0.4.8", "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.4.8.tgz", "integrity": "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==" }, - "figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "dev": true - }, - "file-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-2.0.0.tgz", - "integrity": "sha512-YCsBfd1ZGCyonOKLxPiKPdu+8ld9HAaMEvJewzz+b2eTF7uL5Zm/HdBF6FjCrpCMRq25Mi0U1gl4pwn2TlH7hQ==", + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, "requires": { - "loader-utils": "^1.0.2", - "schema-utils": "^1.0.0" + "escape-string-regexp": "^1.0.5" + } + }, + "file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" }, "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", "dev": true, "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" } } } @@ -5219,29 +5148,19 @@ "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=" }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" + "to-regex-range": "^5.0.1" } }, "finalhandler": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0=", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "dev": true, "requires": { "debug": "2.6.9", @@ -5254,9 +5173,9 @@ } }, "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, "requires": { "commondir": "^1.0.1", @@ -5285,65 +5204,11 @@ "path-exists": "^4.0.0" } }, - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - }, "flot": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/flot/-/flot-0.8.3.tgz", "integrity": "sha512-xg2otcTJDvS+ERK+my4wxG/ASq90QURXtoM4LhacCq0jQW2jbyjdttbRNqU2cPykrpMvJ6b2uSp6SAgYAzj9tQ==" }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha1-jdfYc6G6vCB9lOrQwuDkQnbr8ug=", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - }, - "dependencies": { - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, "follow-redirects": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.2.tgz", @@ -5355,36 +5220,64 @@ "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz", "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM=" }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true + "fontkit": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/fontkit/-/fontkit-1.8.1.tgz", + "integrity": "sha512-BsNCjDoYRxmNWFdAuK1y9bQt+igIxGtTC9u/jSFjR9MKhmI00rP1fwSvERt+5ddE82544l0XH5mzXozQVUy2Tw==", + "requires": { + "babel-runtime": "^6.26.0", + "brfs": "^2.0.0", + "brotli": "^1.2.0", + "browserify-optional": "^1.0.1", + "clone": "^1.0.4", + "deep-equal": "^1.0.0", + "dfa": "^1.2.0", + "restructure": "^0.5.3", + "tiny-inflate": "^1.0.2", + "unicode-properties": "^1.2.2", + "unicode-trie": "^0.3.0" + }, + "dependencies": { + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" + }, + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=" + }, + "unicode-trie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-0.3.1.tgz", + "integrity": "sha1-1nHd3YkQGgi6w3tqUWEBBgIFIIU=", + "requires": { + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" + } + } + } }, "foreach": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, "form-data": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.1.tgz", - "integrity": "sha1-rjFduaSQf6BlUCMEpm13M0de43w=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "requires": { - "async": "^2.0.1", - "combined-stream": "^1.0.5", - "mime-types": "^2.1.11" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" } }, "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true }, "frac": { @@ -5392,14 +5285,11 @@ "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz", "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==" }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } + "fraction.js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.1.tgz", + "integrity": "sha512-MHOhvvxHTfRFpF1geTK9czMIZ6xclsEor2wkIGYYq+PxcQqT7vStJqjhe6S1TenZrMZzo+wlqOufBDVepUEgPg==", + "dev": true }, "fresh": { "version": "0.5.2", @@ -5407,57 +5297,30 @@ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", "dev": true }, - "friendly-errors-webpack-plugin": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.0.tgz", - "integrity": "sha1-78hsu4FiJFZYYaG+ep2E0Kr+oTY=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "error-stack-parser": "^2.0.0", - "string-width": "^2.0.0" - } - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "dependencies": { + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + } } }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } + "fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "dev": true }, "fs.realpath": { "version": "1.0.0", @@ -5465,28 +5328,9457 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } + "optional": true }, "fullcalendar": { "version": "3.10.2", "resolved": "https://registry.npmjs.org/fullcalendar/-/fullcalendar-3.10.2.tgz", "integrity": "sha512-YWZaHdp8ZLBqhPz615PoXdA49ymsBTUF+MGDM6H3vyz71Pv/ZW9Pm9/Mj3x6n822k6bs2txFO7muRTSvBhsqKg==", "dependencies": { + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", + "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==" + }, + "@babel/highlight": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + } + } + }, + "@types/fancy-log": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@types/fancy-log/-/fancy-log-1.3.0.tgz", + "integrity": "sha512-mQjDxyOM1Cpocd+vm1kZBP7smwKZ4TNokFeds9LV7OZibmPJFEzY3+xZMrKfUdNT71lv8GoCPD6upKwHxubClw==" + }, + "@types/jquery": { + "version": "2.0.47", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-2.0.47.tgz", + "integrity": "sha512-5bidBzyNZ5euxwRjN0UsGsnmCXb6yuNAQkJceJ00Qq7uVLAZ442gJ2I0h56wGfRpIcZyY2wPV103Zq9IMnkjkg==" + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "accepts": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", + "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", + "requires": { + "mime-types": "~2.1.11", + "negotiator": "0.6.1" + } + }, + "acorn": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==" + }, + "acorn-dynamic-import": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", + "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "requires": { + "acorn": "^4.0.3" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" + } + } + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "requires": { + "acorn": "^3.0.4" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" + } + } + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "ajv-keywords": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=" + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "requires": { + "ansi-wrap": "^0.1.0" + } + }, + "ansi-cyan": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", + "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" + }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-red": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=" + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "requires": { + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "^1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + } + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=" + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=" + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" + }, + "array-includes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" + } + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==" + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "array.prototype.flat": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", + "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "arraybuffer.slice": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", + "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=" + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + } + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "requires": { + "lodash": "^4.17.14" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" + }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "autoprefixer": { + "version": "6.7.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", + "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", + "requires": { + "browserslist": "^1.7.6", + "caniuse-db": "^1.0.30000634", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^5.2.16", + "postcss-value-parser": "^3.2.3" + } + }, + "awesome-typescript-loader": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/awesome-typescript-loader/-/awesome-typescript-loader-3.5.0.tgz", + "integrity": "sha512-qzgm9SEvodVkSi9QY7Me1/rujg+YBNMjayNSAyzNghwTEez++gXoPCwMvpbHRG7wrOkDCiF6dquvv9ESmUBAuw==", + "requires": { + "chalk": "^2.3.1", + "enhanced-resolve": "3.3.0", + "loader-utils": "^1.1.0", + "lodash": "^4.17.4", + "micromatch": "^3.0.3", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.3" + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" + }, + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=" + }, + "batch": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.5.3.tgz", + "integrity": "sha1-PzQU84AyF0O/wQQvmoP/HVgk1GQ=" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=" + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "requires": { + "callsite": "1.0.0" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "blob": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=" + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "requires": { + "inherits": "~2.0.0" + } + }, + "bluebird": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.3.3.tgz", + "integrity": "sha1-z5akXXe5qXpDxGo2XEYZ9iv5dtA=" + }, + "bn.js": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.1.tgz", + "integrity": "sha512-IUTD/REb78Z2eodka1QZyyEk66pciRcP6Sroka0aI3tG/iwIdYLrBD62RsubR7vqdt3WyX8p4jxeatzmRSphtA==" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + } + }, + "bootstrap": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.4.1.tgz", + "integrity": "sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + } + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + } + } + }, + "browserify-sign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.0.tgz", + "integrity": "sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==", + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.2", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "requires": { + "caniuse-db": "^1.0.30000639", + "electron-to-chromium": "^1.2.7" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "requires": { + "callsites": "^0.2.0" + } + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=" + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, + "caniuse-api": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", + "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", + "requires": { + "browserslist": "^1.3.6", + "caniuse-db": "^1.0.30000529", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-db": { + "version": "1.0.30001061", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30001061.tgz", + "integrity": "sha512-sZ3cUhhYT/E/FzITIdC9hdo+j8SwDR5SnKuCuc9R8t7XDJ+syH4R+iCPw3kyb5MIYt3t8ii3Na/eHIxOS5gWBA==" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "requires": { + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" + }, + "dependencies": { + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "requires": { + "is-glob": "^2.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==" + }, + "clap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", + "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", + "requires": { + "chalk": "^1.1.3" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-css": { + "version": "3.4.28", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz", + "integrity": "sha1-vxlF6C/ICPVWlebd6uwBQA79A/8=", + "requires": { + "commander": "2.8.x", + "source-map": "0.4.x" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=" + }, + "clone-deep": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz", + "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==", + "requires": { + "for-own": "^1.0.0", + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.0", + "shallow-clone": "^1.0.0" + } + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=" + }, + "cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "coa": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", + "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", + "requires": { + "q": "^1.1.2" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", + "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", + "requires": { + "clone": "^1.0.2", + "color-convert": "^1.3.0", + "color-string": "^0.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "color-string": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", + "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", + "requires": { + "color-name": "^1.0.0" + } + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" + }, + "colormin": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", + "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", + "requires": { + "color": "^0.11.0", + "css-color-names": "0.0.4", + "has": "^1.0.1" + } + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", + "requires": { + "graceful-readlink": ">= 1.0.0" + } + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" + }, + "components-jqueryui": { + "version": "github:components/jqueryui#44ecf3794cc56b65954cc19737234a3119d036cc", + "from": "github:components/jqueryui" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + } + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=" + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + } + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" + }, + "css-loader": { + "version": "0.28.11", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.11.tgz", + "integrity": "sha512-wovHgjAx8ZIMGSL8pTys7edA1ClmzxHeY6n/d97gg5odgsxEgKjULPR0viqyC+FWMCL9sfqoC/QCUBo62tLvPg==", + "requires": { + "babel-code-frame": "^6.26.0", + "css-selector-tokenizer": "^0.7.0", + "cssnano": "^3.10.0", + "icss-utils": "^2.1.0", + "loader-utils": "^1.0.2", + "lodash.camelcase": "^4.3.0", + "object-assign": "^4.1.1", + "postcss": "^5.0.6", + "postcss-modules-extract-imports": "^1.2.0", + "postcss-modules-local-by-default": "^1.2.0", + "postcss-modules-scope": "^1.1.0", + "postcss-modules-values": "^1.3.0", + "postcss-value-parser": "^3.3.0", + "source-list-map": "^2.0.0" + } + }, + "css-selector-tokenizer": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.2.tgz", + "integrity": "sha512-yj856NGuAymN6r8bn8/Jl46pR+OC3eEvAhfGYDUe7YPtTPAYrSSw4oAniZ9Y8T5B92hjhwTBLUen0/vKPxf6pw==", + "requires": { + "cssesc": "^3.0.0", + "fastparse": "^1.1.2", + "regexpu-core": "^4.6.0" + } + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + }, + "cssnano": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", + "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", + "requires": { + "autoprefixer": "^6.3.1", + "decamelize": "^1.1.2", + "defined": "^1.0.0", + "has": "^1.0.1", + "object-assign": "^4.0.1", + "postcss": "^5.0.14", + "postcss-calc": "^5.2.0", + "postcss-colormin": "^2.1.8", + "postcss-convert-values": "^2.3.4", + "postcss-discard-comments": "^2.0.4", + "postcss-discard-duplicates": "^2.0.1", + "postcss-discard-empty": "^2.0.1", + "postcss-discard-overridden": "^0.1.1", + "postcss-discard-unused": "^2.2.1", + "postcss-filter-plugins": "^2.0.0", + "postcss-merge-idents": "^2.1.5", + "postcss-merge-longhand": "^2.0.1", + "postcss-merge-rules": "^2.0.3", + "postcss-minify-font-values": "^1.0.2", + "postcss-minify-gradients": "^1.0.1", + "postcss-minify-params": "^1.0.4", + "postcss-minify-selectors": "^2.0.4", + "postcss-normalize-charset": "^1.1.0", + "postcss-normalize-url": "^3.0.7", + "postcss-ordered-values": "^2.1.0", + "postcss-reduce-idents": "^2.2.2", + "postcss-reduce-initial": "^1.0.0", + "postcss-reduce-transforms": "^1.0.3", + "postcss-svgo": "^2.1.1", + "postcss-unique-selectors": "^2.0.2", + "postcss-value-parser": "^3.2.3", + "postcss-zindex": "^2.0.1" + } + }, + "csso": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", + "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", + "requires": { + "clap": "^1.0.9", + "source-map": "^0.5.3" + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "requires": { + "array-find-index": "^1.0.1" + } + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=" + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "dateformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "requires": { + "clone": "^1.0.2" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "requires": { + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "deprecated": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", + "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=" + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=" + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=" + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + } + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "requires": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" + }, + "dts-generator": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/dts-generator/-/dts-generator-2.1.0.tgz", + "integrity": "sha1-A5uHpPX4R7O47wDd7j6wlUXezv4=", + "requires": { + "bluebird": "3.3.3", + "glob": "7.0.0", + "mkdirp": "0.5.1" + }, + "dependencies": { + "glob": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.0.tgz", + "integrity": "sha1-OyCjV//89GuzhK7W+K6aZH/basQ=", + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + } + } + }, + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "requires": { + "readable-stream": "~1.1.9" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "electron-to-chromium": { + "version": "1.3.441", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.441.tgz", + "integrity": "sha512-leBfJwLuyGs1jEei2QioI+PjVMavmUIvPYidE8dCCYWLAq0uefhN3NYgDNb8WxD3uiUNnJ3ScMXg0upSlwySzQ==" + }, + "elliptic": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", + "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + } + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "end-of-stream": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", + "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", + "requires": { + "once": "~1.3.0" + }, + "dependencies": { + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "requires": { + "wrappy": "1" + } + } + } + }, + "engine.io": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.5.tgz", + "integrity": "sha512-j1DWIcktw4hRwrv6nWx++5nFH2X64x16MAG2P0Lmi5Dvdfi3I+Jhc7JKJIdAmDJa+5aZ/imHV7dWRPy2Cqjh3A==", + "requires": { + "accepts": "1.3.3", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "2.3.3", + "engine.io-parser": "1.3.2", + "ws": "~1.1.5" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=" + } + } + }, + "engine.io-client": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.5.tgz", + "integrity": "sha512-AYTgHyeVUPitsseqjoedjhYJapNVoSPShbZ+tEUX9/73jgZ/Z3sUlJf9oYgdEBBdVhupUpUqSxH0kBCXlQnmZg==", + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "2.3.3", + "engine.io-parser": "1.3.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parsejson": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~1.1.5", + "xmlhttprequest-ssl": "1.5.3", + "yeast": "0.1.2" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=" + } + } + }, + "engine.io-parser": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.2.tgz", + "integrity": "sha1-k3sHnwAH0Ik+xW1GyyILjLQ1Igo=", + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "0.0.6", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.4", + "has-binary": "0.1.7", + "wtf-8": "1.0.0" + } + }, + "enhanced-resolve": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.3.0.tgz", + "integrity": "sha512-2qbxE7ek3YxPJ1ML6V+satHkzHpJQKWkRHmRx6mfAoW59yP8YH8BFplbegSP+u2hBd6B6KCOpvJQ3dZAP+hkpg==", + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "object-assign": "^4.0.1", + "tapable": "^0.2.5" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=" + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" + } + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-symbol": "3.1.1", + "event-emitter": "~0.3.5" + }, + "dependencies": { + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + } + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "requires": { + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", + "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", + "requires": { + "ajv": "^5.3.0", + "babel-code-frame": "^6.22.0", + "chalk": "^2.1.0", + "concat-stream": "^1.6.0", + "cross-spawn": "^5.1.0", + "debug": "^3.1.0", + "doctrine": "^2.1.0", + "eslint-scope": "^3.7.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^3.5.4", + "esquery": "^1.0.0", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.0.1", + "ignore": "^3.3.3", + "imurmurhash": "^0.1.4", + "inquirer": "^3.0.6", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.9.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.4", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "regexpp": "^1.0.1", + "require-uncached": "^1.0.3", + "semver": "^5.3.0", + "strip-ansi": "^4.0.0", + "strip-json-comments": "~2.0.1", + "table": "4.0.2", + "text-table": "~0.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "eslint-config-standard": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-11.0.0.tgz", + "integrity": "sha512-oDdENzpViEe5fwuRCWla7AXQd++/oyIp8zP+iP9jiUPG6NBj3SHgdgtl/kTn00AjeN+1HNvavTKmYbMo+xMOlw==" + }, + "eslint-import-resolver-node": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", + "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", + "requires": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + } + }, + "eslint-module-utils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "requires": { + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" + } + }, + "eslint-plugin-import": { + "version": "2.20.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.2.tgz", + "integrity": "sha512-FObidqpXrR8OnCh4iNsxy+WACztJLXAHBO5hK79T1Hc77PgQZkyDGA5Ag9xAvRpglvLNxhH/zSmZ70/pZ31dHg==", + "requires": { + "array-includes": "^3.0.3", + "array.prototype.flat": "^1.2.1", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.2", + "eslint-module-utils": "^2.4.1", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.0", + "read-pkg-up": "^2.0.0", + "resolve": "^1.12.0" + }, + "dependencies": { + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + } + } + }, + "eslint-plugin-node": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-5.2.1.tgz", + "integrity": "sha512-xhPXrh0Vl/b7870uEbaumb2Q+LxaEcOQ3kS1jtIXanBAwpMre1l5q/l2l/hESYJGEFKuI78bp6Uw50hlpr7B+g==", + "requires": { + "ignore": "^3.3.6", + "minimatch": "^3.0.4", + "resolve": "^1.3.3", + "semver": "5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" + } + } + }, + "eslint-plugin-promise": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.8.0.tgz", + "integrity": "sha512-JiFL9UFR15NKpHyGii1ZcvmtIqa3UTwiDAGb8atSffe43qJ3+1czVGN6UtkklpcJ2DVnqvTMzEKRaJdBkAL2aQ==" + }, + "eslint-plugin-standard": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-3.1.0.tgz", + "integrity": "sha512-fVcdyuKRr0EZ4fjWl3c+gp1BANFJD1+RaWa2UPYfMZ6jCtp5RG00kSaXnK/dE5sYzt4kaWJ9qdxqUfc0d9kX0w==" + }, + "eslint-scope": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==", + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==" + }, + "espree": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "requires": { + "acorn": "^5.5.0", + "acorn-jsx": "^3.0.0" + } + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=" + }, + "esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", + "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==" + } + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "eventemitter3": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==" + }, + "events": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", + "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==" + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "expand-braces": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz", + "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=", + "requires": { + "array-slice": "^0.2.3", + "array-unique": "^0.2.1", + "braces": "^0.1.2" + }, + "dependencies": { + "array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=" + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "braces": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz", + "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=", + "requires": { + "expand-range": "^0.1.0" + } + }, + "expand-range": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz", + "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=", + "requires": { + "is-number": "^0.1.1", + "repeat-string": "^0.2.2" + } + }, + "is-number": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz", + "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=" + }, + "repeat-string": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz", + "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=" + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "requires": { + "fill-range": "^2.1.0" + }, + "dependencies": { + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", + "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==" + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "requires": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extract-text-webpack-plugin": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz", + "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", + "requires": { + "async": "^2.4.1", + "loader-utils": "^1.1.0", + "schema-utils": "^0.3.0", + "webpack-sources": "^1.0.1" + } + }, + "extract-zip": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", + "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "requires": { + "concat-stream": "^1.6.2", + "debug": "^2.6.9", + "mkdirp": "^0.5.4", + "yauzl": "^2.10.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "requires": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + } + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==" + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "requires": { + "pend": "~1.2.0" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "requires": { + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" + }, + "filesize": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-2.0.4.tgz", + "integrity": "sha1-eAWUHGD83+Y/RtfqNYxZreEcEyU=" + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "find-index": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", + "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=" + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + }, + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + } + }, + "first-chunk-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", + "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=" + }, + "flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==" + }, + "flat-cache": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", + "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", + "requires": { + "circular-json": "^0.3.1", + "graceful-fs": "^4.1.2", + "rimraf": "~2.6.2", + "write": "^0.2.1" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "flatten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", + "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==" + }, + "follow-redirects": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.11.0.tgz", + "integrity": "sha512-KZm0V+ll8PfBrKwMzdo5D13b1bur9Iq9Zd/RMmAoQQcl2PxxFml8cxXPaaPYVbV0RjNjq1CU7zIzAOqtUPudmA==", + "requires": { + "debug": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "requires": { + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "^0.2.2" + } + }, + "fs-extra": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", + "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "gaze": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", + "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", + "requires": { + "globule": "~0.1.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "requires": { + "is-glob": "^2.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "glob-stream": { + "version": "3.1.18", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", + "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", + "requires": { + "glob": "^4.3.1", + "glob2base": "^0.0.12", + "minimatch": "^2.0.1", + "ordered-read-streams": "^0.1.0", + "through2": "^0.6.1", + "unique-stream": "^1.0.0" + }, + "dependencies": { + "glob": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", + "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^2.0.1", + "once": "^1.3.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "requires": { + "brace-expansion": "^1.0.0" + } + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + } + } + }, + "glob-watcher": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", + "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", + "requires": { + "gaze": "^0.5.1" + } + }, + "glob2base": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", + "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", + "requires": { + "find-index": "^0.1.1" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "requires": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "globule": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", + "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", + "requires": { + "glob": "~3.1.21", + "lodash": "~1.0.1", + "minimatch": "~0.2.11" + }, + "dependencies": { + "glob": { + "version": "3.1.21", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", + "requires": { + "graceful-fs": "~1.2.0", + "inherits": "1", + "minimatch": "~0.2.11" + } + }, + "graceful-fs": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=" + }, + "inherits": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", + "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=" + }, + "lodash": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", + "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=" + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" + }, + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + } + } + }, + "glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "requires": { + "sparkles": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==" + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" + }, + "gulp": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", + "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", + "requires": { + "archy": "^1.0.0", + "chalk": "^1.0.0", + "deprecated": "^0.0.1", + "gulp-util": "^3.0.0", + "interpret": "^1.0.0", + "liftoff": "^2.1.0", + "minimist": "^1.1.0", + "orchestrator": "^0.3.0", + "pretty-hrtime": "^1.0.0", + "semver": "^4.1.0", + "tildify": "^1.0.0", + "v8flags": "^2.0.2", + "vinyl-fs": "^0.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=" + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "gulp-cssmin": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/gulp-cssmin/-/gulp-cssmin-0.1.7.tgz", + "integrity": "sha1-9Xb+UhHRB7qpQBUEJJv4eu0VVr0=", + "requires": { + "clean-css": "^3.1.9", + "filesize": "~2.0.0", + "graceful-fs": "~2.0.0", + "gulp-rename": "~1.1.0", + "gulp-util": "~2.2.0", + "map-stream": "0.0.4", + "temp-write": "~0.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", + "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=" + }, + "ansi-styles": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", + "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=" + }, + "chalk": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", + "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", + "requires": { + "ansi-styles": "^1.1.0", + "escape-string-regexp": "^1.0.0", + "has-ansi": "^0.1.0", + "strip-ansi": "^0.3.0", + "supports-color": "^0.2.0" + } + }, + "dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "requires": { + "get-stdin": "^4.0.1", + "meow": "^3.3.0" + } + }, + "graceful-fs": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", + "integrity": "sha1-fNLNsiiko/Nule+mzBQt59GhNtA=" + }, + "gulp-rename": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.1.0.tgz", + "integrity": "sha1-kwkKqvTThsB/IFOKaIjxXvunJ6E=", + "requires": { + "map-stream": ">=0.0.4" + } + }, + "gulp-util": { + "version": "2.2.20", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.20.tgz", + "integrity": "sha1-1xRuVyiRC9jwR6awseVJvCLb1kw=", + "requires": { + "chalk": "^0.5.0", + "dateformat": "^1.0.7-1.2.3", + "lodash._reinterpolate": "^2.4.1", + "lodash.template": "^2.4.1", + "minimist": "^0.2.0", + "multipipe": "^0.1.0", + "through2": "^0.5.0", + "vinyl": "^0.2.1" + } + }, + "has-ansi": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", + "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", + "requires": { + "ansi-regex": "^0.2.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "lodash._reinterpolate": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz", + "integrity": "sha1-TxInqlqHEfxjL1sHofRgequLMiI=" + }, + "lodash.escape": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", + "integrity": "sha1-LOEsXghNsKV92l5dHu659dF1o7Q=", + "requires": { + "lodash._escapehtmlchar": "~2.4.1", + "lodash._reunescapedhtml": "~2.4.1", + "lodash.keys": "~2.4.1" + } + }, + "lodash.keys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", + "requires": { + "lodash._isnative": "~2.4.1", + "lodash._shimkeys": "~2.4.1", + "lodash.isobject": "~2.4.1" + } + }, + "lodash.template": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz", + "integrity": "sha1-nmEQB+32KRKal0qzxIuBez4c8g0=", + "requires": { + "lodash._escapestringchar": "~2.4.1", + "lodash._reinterpolate": "~2.4.1", + "lodash.defaults": "~2.4.1", + "lodash.escape": "~2.4.1", + "lodash.keys": "~2.4.1", + "lodash.templatesettings": "~2.4.1", + "lodash.values": "~2.4.1" + } + }, + "lodash.templatesettings": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz", + "integrity": "sha1-6nbHXRHrhtTb6JqDiTu4YZKaxpk=", + "requires": { + "lodash._reinterpolate": "~2.4.1", + "lodash.escape": "~2.4.1" + } + }, + "minimist": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.2.1.tgz", + "integrity": "sha512-GY8fANSrTMfBVfInqJAY41QkOM+upUTytK1jZ0c8+3HdHrJxBJ3rF5i9moClXTE8uUSnUo8cAsCoxDXvSY4DHg==" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "strip-ansi": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", + "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", + "requires": { + "ansi-regex": "^0.2.1" + } + }, + "supports-color": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", + "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=" + }, + "through2": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", + "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", + "requires": { + "readable-stream": "~1.0.17", + "xtend": "~3.0.0" + } + }, + "vinyl": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", + "integrity": "sha1-vKk4IJWC7FpJrVOKAPofEl5RMlI=", + "requires": { + "clone-stats": "~0.0.1" + } + }, + "xtend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", + "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=" + } + } + }, + "gulp-eslint": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/gulp-eslint/-/gulp-eslint-4.0.2.tgz", + "integrity": "sha512-fcFUQzFsN6dJ6KZlG+qPOEkqfcevRUXgztkYCvhNvJeSvOicC8ucutN4qR/ID8LmNZx9YPIkBzazTNnVvbh8wg==", + "requires": { + "eslint": "^4.0.0", + "fancy-log": "^1.3.2", + "plugin-error": "^1.0.0" + } + }, + "gulp-filter": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-4.0.0.tgz", + "integrity": "sha1-OV9YolbFWc254NFX8cqvUkijjcs=", + "requires": { + "gulp-util": "^3.0.6", + "multimatch": "^2.0.0", + "streamfilter": "^1.0.5" + } + }, + "gulp-modify-file": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gulp-modify-file/-/gulp-modify-file-1.0.1.tgz", + "integrity": "sha512-toUFzkLlnz/CGLplG/+vl6zMT7U0ldbS6b6lT/aQ2u243wa4udMQwSPGPRAEdwaIbqZo34lqu4XRdPPx5iPCSQ==", + "requires": { + "gulp": "3.9.1", + "through2": "2.0.3" + }, + "dependencies": { + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + } + } + } + }, + "gulp-rename": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.4.0.tgz", + "integrity": "sha512-swzbIGb/arEoFK89tPY58vg3Ok1bw+d35PfUNwWqdo7KM4jkmuGA78JiDNqR+JeZFaeeHnRg9N7aihX3YPmsyg==" + }, + "gulp-shell": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/gulp-shell/-/gulp-shell-0.6.5.tgz", + "integrity": "sha512-f3m1WcS0o2B72/PGj1Jbv9zYR9rynBh/EQJv64n01xQUo7j7anols0eww9GG/WtDTzGVQLrupVDYkifRFnj5Zg==", + "requires": { + "async": "^2.1.5", + "chalk": "^2.3.0", + "fancy-log": "^1.3.2", + "lodash": "^4.17.4", + "lodash.template": "^4.4.0", + "plugin-error": "^0.1.2", + "through2": "^2.0.3" + }, + "dependencies": { + "arr-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", + "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", + "requires": { + "arr-flatten": "^1.0.1", + "array-slice": "^0.2.3" + } + }, + "arr-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", + "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=" + }, + "array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=" + }, + "extend-shallow": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", + "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", + "requires": { + "kind-of": "^1.1.0" + } + }, + "kind-of": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", + "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=" + }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "plugin-error": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", + "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", + "requires": { + "ansi-cyan": "^0.1.1", + "ansi-red": "^0.1.1", + "arr-diff": "^1.0.1", + "arr-union": "^2.0.1", + "extend-shallow": "^1.1.2" + } + } + } + }, + "gulp-tslint": { + "version": "8.1.4", + "resolved": "https://registry.npmjs.org/gulp-tslint/-/gulp-tslint-8.1.4.tgz", + "integrity": "sha512-wBoZIEMJRz9urHwolsvQpngA9l931p6g/Liwz1b/KrsVP6jEBFZv/o0NS1TFCQZi/l8mXxz8+v3twhf4HOXxPQ==", + "requires": { + "@types/fancy-log": "1.3.0", + "ansi-colors": "^1.0.1", + "fancy-log": "1.3.3", + "map-stream": "~0.0.7", + "plugin-error": "1.0.1", + "through": "~2.3.8" + }, + "dependencies": { + "map-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", + "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=" + } + } + }, + "gulp-uglify": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/gulp-uglify/-/gulp-uglify-2.1.2.tgz", + "integrity": "sha1-bbhbHQ7mPRgFhZK2WGSdZcLsRUE=", + "requires": { + "gulplog": "^1.0.0", + "has-gulplog": "^0.1.0", + "lodash": "^4.13.1", + "make-error-cause": "^1.1.1", + "through2": "^2.0.0", + "uglify-js": "~2.8.10", + "uglify-save-license": "^0.4.1", + "vinyl-sourcemaps-apply": "^0.2.0" + } + }, + "gulp-util": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", + "requires": { + "array-differ": "^1.0.0", + "array-uniq": "^1.0.2", + "beeper": "^1.0.0", + "chalk": "^1.0.0", + "dateformat": "^2.0.0", + "fancy-log": "^1.1.0", + "gulplog": "^1.0.0", + "has-gulplog": "^0.1.0", + "lodash._reescape": "^3.0.0", + "lodash._reevaluate": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.template": "^3.0.0", + "minimist": "^1.1.0", + "multipipe": "^0.1.2", + "object-assign": "^3.0.0", + "replace-ext": "0.0.1", + "through2": "^2.0.0", + "vinyl": "^0.5.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=" + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "gulp-watch": { + "version": "4.3.11", + "resolved": "https://registry.npmjs.org/gulp-watch/-/gulp-watch-4.3.11.tgz", + "integrity": "sha1-Fi/FY96fx3DpH5p845VVE6mhGMA=", + "requires": { + "anymatch": "^1.3.0", + "chokidar": "^1.6.1", + "glob-parent": "^3.0.1", + "gulp-util": "^3.0.7", + "object-assign": "^4.1.0", + "path-is-absolute": "^1.0.1", + "readable-stream": "^2.2.2", + "slash": "^1.0.0", + "vinyl": "^1.2.0", + "vinyl-file": "^2.0.0" + }, + "dependencies": { + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "requires": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + } + } + } + }, + "gulp-zip": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/gulp-zip/-/gulp-zip-3.2.0.tgz", + "integrity": "sha1-69GY2ubcLV9E2BRWnI7EIRipPvk=", + "requires": { + "chalk": "^1.0.0", + "concat-stream": "^1.4.7", + "gulp-util": "^3.0.0", + "through2": "^2.0.1", + "yazl": "^2.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "requires": { + "glogg": "^1.0.0" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-binary": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", + "integrity": "sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=", + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "requires": { + "sparkles": "^1.0.0" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hasha": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", + "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", + "requires": { + "is-stream": "^1.0.1", + "pinkie-promise": "^2.0.0" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" + }, + "html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==" + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=" + }, + "icss-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", + "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", + "requires": { + "postcss": "^6.0.1" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "in-publish": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz", + "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==" + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "requires": { + "repeating": "^2.0.0" + } + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==" + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=" + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=" + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "requires": { + "has": "^1.0.3" + } + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==" + }, + "is-svg": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", + "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", + "requires": { + "html-comment-regex": "^1.1.0" + } + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isbinaryfile": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "requires": { + "buffer-alloc": "^1.2.0" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "jasmine-core": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.5.2.tgz", + "integrity": "sha1-b2G9eQYeJ/Q+b5NV5Es8bKtv8pc=" + }, + "jasmine-fixture": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jasmine-fixture/-/jasmine-fixture-2.0.0.tgz", + "integrity": "sha1-ttDFo7tINNI90TdGTvlvBPk7vWA=" + }, + "jasmine-jquery": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/jasmine-jquery/-/jasmine-jquery-2.1.1.tgz", + "integrity": "sha1-1AleZGlEomdjI1dpqwGNnzDw1Hs=" + }, "jquery": { - "version": "https://registry.npmjs.org/jquery/-/jquery-3.5.1.tgz", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.1.tgz", "integrity": "sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg==" }, + "jquery-mockjax": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jquery-mockjax/-/jquery-mockjax-2.5.1.tgz", + "integrity": "sha512-VObCYFUWI0i14GjhFyqd/9fYz3LyB2iqcMLxJNTH1H2sLpTSgmfty1JMwtql9Dnd744yss1jxwKO1kM0eNrMrA==", + "requires": { + "jquery": ">=1.5.2" + } + }, + "jquery-simulate": { + "version": "github:jquery/jquery-simulate#2eafaa63a0cdc775a8a35f0aa91103b83ed6124c", + "from": "github:jquery/jquery-simulate" + }, + "js-base64": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.2.tgz", + "integrity": "sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ==" + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "js-yaml": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", + "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", + "requires": { + "argparse": "^1.0.7", + "esprima": "^2.6.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + }, + "json-loader": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", + "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "karma": { + "version": "0.13.22", + "resolved": "https://registry.npmjs.org/karma/-/karma-0.13.22.tgz", + "integrity": "sha1-B3ULG9Bj1+fnuRvNLmNU2PKqh0Q=", + "requires": { + "batch": "^0.5.3", + "bluebird": "^2.9.27", + "body-parser": "^1.12.4", + "chokidar": "^1.4.1", + "colors": "^1.1.0", + "connect": "^3.3.5", + "core-js": "^2.1.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.0", + "expand-braces": "^0.1.1", + "glob": "^7.0.0", + "graceful-fs": "^4.1.2", + "http-proxy": "^1.13.0", + "isbinaryfile": "^3.0.0", + "lodash": "^3.8.0", + "log4js": "^0.6.31", + "mime": "^1.3.4", + "minimatch": "^3.0.0", + "optimist": "^0.6.1", + "rimraf": "^2.3.3", + "socket.io": "^1.4.5", + "source-map": "^0.5.3", + "useragent": "^2.1.6" + }, + "dependencies": { + "bluebird": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", + "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=" + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + } + } + }, + "karma-jasmine": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.2.tgz", + "integrity": "sha1-OU8rJf+0pkS5rabyLUQ+L9CIhsM=" + }, + "karma-phantomjs-launcher": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.4.tgz", + "integrity": "sha1-0jyjSAG9qYY60xjju0vUBisTrNI=", + "requires": { + "lodash": "^4.0.1", + "phantomjs-prebuilt": "^2.1.7" + } + }, + "karma-sourcemap-loader": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.7.tgz", + "integrity": "sha1-kTIsd/jxPUb+0GKwQuEAnUxFBdg=", + "requires": { + "graceful-fs": "^4.1.2" + } + }, + "karma-verbose-reporter": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/karma-verbose-reporter/-/karma-verbose-reporter-0.0.6.tgz", + "integrity": "sha1-WQkFJFHGB/Aqx3x2N5Gi/hJRJgw=", + "requires": { + "colors": ">=1.0" + } + }, + "kew": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", + "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=" + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "requires": { + "graceful-fs": "^4.1.9" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "liftoff": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", + "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", + "requires": { + "extend": "^3.0.0", + "findup-sync": "^2.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=" + }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=" + }, + "lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=" + }, + "lodash._escapehtmlchar": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz", + "integrity": "sha1-32fDu2t+jh6DGrSL+geVuSr+iZ0=", + "requires": { + "lodash._htmlescapes": "~2.4.1" + } + }, + "lodash._escapestringchar": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz", + "integrity": "sha1-7P4iYYoq3lC/7qQ5N+Ud9m8O23I=" + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" + }, + "lodash._htmlescapes": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz", + "integrity": "sha1-MtFL8IRLbeb4tioFG09nwii2JMs=" + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=" + }, + "lodash._isnative": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", + "integrity": "sha1-PqZAS3hKe+g2x7V1gOHN95sUgyw=" + }, + "lodash._objecttypes": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", + "integrity": "sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE=" + }, + "lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=" + }, + "lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=" + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" + }, + "lodash._reunescapedhtml": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz", + "integrity": "sha1-dHxPxAED6zu4oJduVx96JlnpO6c=", + "requires": { + "lodash._htmlescapes": "~2.4.1", + "lodash.keys": "~2.4.1" + }, + "dependencies": { + "lodash.keys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", + "requires": { + "lodash._isnative": "~2.4.1", + "lodash._shimkeys": "~2.4.1", + "lodash.isobject": "~2.4.1" + } + } + } + }, + "lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=" + }, + "lodash._shimkeys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", + "integrity": "sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM=", + "requires": { + "lodash._objecttypes": "~2.4.1" + } + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=" + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" + }, + "lodash.clone": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", + "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=" + }, + "lodash.defaults": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", + "integrity": "sha1-p+iIXwXmiFEUS24SqPNngCa8TFQ=", + "requires": { + "lodash._objecttypes": "~2.4.1", + "lodash.keys": "~2.4.1" + }, + "dependencies": { + "lodash.keys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", + "requires": { + "lodash._isnative": "~2.4.1", + "lodash._shimkeys": "~2.4.1", + "lodash.isobject": "~2.4.1" + } + } + } + }, + "lodash.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "requires": { + "lodash._root": "^3.0.0" + } + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" + }, + "lodash.isobject": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", + "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=", + "requires": { + "lodash._objecttypes": "~2.4.1" + } + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "requires": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=" + }, + "lodash.some": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", + "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=" + }, + "lodash.tail": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", + "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=" + }, + "lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "requires": { + "lodash._basecopy": "^3.0.0", + "lodash._basetostring": "^3.0.0", + "lodash._basevalues": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0", + "lodash.keys": "^3.0.0", + "lodash.restparam": "^3.0.0", + "lodash.templatesettings": "^3.0.0" + } + }, + "lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0" + } + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + }, + "lodash.values": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz", + "integrity": "sha1-q/UUQ2s8twUAFieXjLzzCxKA7qQ=", + "requires": { + "lodash.keys": "~2.4.1" + }, + "dependencies": { + "lodash.keys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", + "requires": { + "lodash._isnative": "~2.4.1", + "lodash._shimkeys": "~2.4.1", + "lodash.isobject": "~2.4.1" + } + } + } + }, + "log4js": { + "version": "0.6.38", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-0.6.38.tgz", + "integrity": "sha1-LElBFmldb7JUgJQ9P8hy5mKlIv0=", + "requires": { + "readable-stream": "~1.0.2", + "semver": "~4.3.3" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=" + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, + "make-error-cause": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/make-error-cause/-/make-error-cause-1.2.2.tgz", + "integrity": "sha1-3wOI/NCzeBbf8KX7gQiTl3fcvJ0=", + "requires": { + "make-error": "^1.2.0" + } + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "requires": { + "kind-of": "^6.0.2" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + }, + "map-stream": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.4.tgz", + "integrity": "sha1-XsbekCE+9sey65Nn6a3o2k79tos=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "math-expression-evaluator": { + "version": "1.2.22", + "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.22.tgz", + "integrity": "sha512-L0j0tFVZBQQLeEjmWOvDLoRciIY8gQGWahvkztXUal8jH8R5Rlqo9GCvgqvXcy9LQhEWdQCVvzqAbxgYNt4blQ==" + }, + "math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==" + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "requires": { + "mime-db": "1.44.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mixin-object": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", + "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", + "requires": { + "for-in": "^0.1.3", + "is-extendable": "^0.1.1" + }, + "dependencies": { + "for-in": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", + "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=" + } + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, "moment": { - "version": "https://registry.npmjs.org/moment/-/moment-2.25.3.tgz", + "version": "2.25.3", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.25.3.tgz", "integrity": "sha512-PuYv0PHxZvzc15Sp8ybUCoQ+xpyPWvjOuK72a5ovzp2LI32rJXOiIfyoFoYvG3s6EwwrdkMyWuRiEHSZRLJNdg==" + }, + "moment-timezone": { + "version": "0.5.31", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.31.tgz", + "integrity": "sha512-+GgHNg8xRhMXfEbv81iDtrVeTcWt0kWmTEY1XQK14dICTXnWJnT0dxdlPspwqF3keKMVPXwayEsk1DI0AA/jdA==", + "requires": { + "moment": ">= 2.9.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "multimatch": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", + "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", + "requires": { + "array-differ": "^1.0.0", + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "minimatch": "^3.0.0" + } + }, + "multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "requires": { + "duplexer2": "0.0.2" + } + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + }, + "nan": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", + "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==" + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "native-promise-only": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", + "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=" + }, + "natives": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz", + "integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==" + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, + "node-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" + } + } + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } + } + }, + "node-sass": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz", + "integrity": "sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==", + "requires": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^3.0.0", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "in-publish": "^2.0.0", + "lodash": "^4.17.15", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "nan": "^2.13.2", + "node-gyp": "^3.8.0", + "npmlog": "^4.0.0", + "request": "^2.88.0", + "sass-graph": "2.2.5", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "requires": { + "globule": "^1.0.0" + } + }, + "globule": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.1.tgz", + "integrity": "sha512-OVyWOHgw29yosRHCHo7NncwR1hW5ew0W/UrvtwvjefVJeQ26q4/8r8FmPsSF1hJ93IgWkyv16pCTz6WblMzm/g==", + "requires": { + "glob": "~7.1.1", + "lodash": "~4.17.12", + "minimatch": "~3.0.2" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + }, + "dependencies": { + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "requires": { + "for-in": "^1.0.1" + } + } + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" + } + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=" + }, + "orchestrator": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", + "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", + "requires": { + "end-of-stream": "~0.1.5", + "sequencify": "~0.0.7", + "stream-consume": "~0.1.0" + } + }, + "ordered-read-streams": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", + "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=" + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==" + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" + }, + "parsejson": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", + "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=", + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=" + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "requires": { + "pify": "^2.0.0" + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "phantomjs-prebuilt": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz", + "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=", + "requires": { + "es6-promise": "^4.0.3", + "extract-zip": "^1.6.5", + "fs-extra": "^1.0.0", + "hasha": "^2.2.0", + "kew": "^0.7.0", + "progress": "^1.1.8", + "request": "^2.81.0", + "request-progress": "^2.0.1", + "which": "^1.2.10" + }, + "dependencies": { + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=" + } + } + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "optional": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "requires": { + "find-up": "^2.1.0" + } + }, + "plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "requires": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + } + }, + "pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==" + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-calc": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", + "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", + "requires": { + "postcss": "^5.0.2", + "postcss-message-helpers": "^2.0.0", + "reduce-css-calc": "^1.2.6" + } + }, + "postcss-colormin": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", + "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", + "requires": { + "colormin": "^1.0.5", + "postcss": "^5.0.13", + "postcss-value-parser": "^3.2.3" + } + }, + "postcss-convert-values": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", + "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", + "requires": { + "postcss": "^5.0.11", + "postcss-value-parser": "^3.1.2" + } + }, + "postcss-discard-comments": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", + "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", + "requires": { + "postcss": "^5.0.14" + } + }, + "postcss-discard-duplicates": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", + "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", + "requires": { + "postcss": "^5.0.4" + } + }, + "postcss-discard-empty": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", + "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", + "requires": { + "postcss": "^5.0.14" + } + }, + "postcss-discard-overridden": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", + "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", + "requires": { + "postcss": "^5.0.16" + } + }, + "postcss-discard-unused": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", + "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", + "requires": { + "postcss": "^5.0.14", + "uniqs": "^2.0.0" + } + }, + "postcss-filter-plugins": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz", + "integrity": "sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ==", + "requires": { + "postcss": "^5.0.4" + } + }, + "postcss-merge-idents": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", + "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", + "requires": { + "has": "^1.0.1", + "postcss": "^5.0.10", + "postcss-value-parser": "^3.1.1" + } + }, + "postcss-merge-longhand": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", + "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", + "requires": { + "postcss": "^5.0.4" + } + }, + "postcss-merge-rules": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", + "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", + "requires": { + "browserslist": "^1.5.2", + "caniuse-api": "^1.5.2", + "postcss": "^5.0.4", + "postcss-selector-parser": "^2.2.2", + "vendors": "^1.0.0" + } + }, + "postcss-message-helpers": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", + "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=" + }, + "postcss-minify-font-values": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", + "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", + "requires": { + "object-assign": "^4.0.1", + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.2" + } + }, + "postcss-minify-gradients": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", + "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", + "requires": { + "postcss": "^5.0.12", + "postcss-value-parser": "^3.3.0" + } + }, + "postcss-minify-params": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", + "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", + "requires": { + "alphanum-sort": "^1.0.1", + "postcss": "^5.0.2", + "postcss-value-parser": "^3.0.2", + "uniqs": "^2.0.0" + } + }, + "postcss-minify-selectors": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", + "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", + "requires": { + "alphanum-sort": "^1.0.2", + "has": "^1.0.1", + "postcss": "^5.0.14", + "postcss-selector-parser": "^2.0.0" + } + }, + "postcss-modules-extract-imports": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz", + "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", + "requires": { + "postcss": "^6.0.1" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-modules-local-by-default": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", + "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", + "requires": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-modules-scope": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", + "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", + "requires": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-modules-values": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", + "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", + "requires": { + "icss-replace-symbols": "^1.1.0", + "postcss": "^6.0.1" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-normalize-charset": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", + "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", + "requires": { + "postcss": "^5.0.5" + } + }, + "postcss-normalize-url": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", + "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^1.4.0", + "postcss": "^5.0.14", + "postcss-value-parser": "^3.2.3" + } + }, + "postcss-ordered-values": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", + "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", + "requires": { + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.1" + } + }, + "postcss-reduce-idents": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", + "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", + "requires": { + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.2" + } + }, + "postcss-reduce-initial": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", + "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", + "requires": { + "postcss": "^5.0.4" + } + }, + "postcss-reduce-transforms": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", + "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", + "requires": { + "has": "^1.0.1", + "postcss": "^5.0.8", + "postcss-value-parser": "^3.0.1" + } + }, + "postcss-selector-parser": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", + "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", + "requires": { + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "postcss-svgo": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", + "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", + "requires": { + "is-svg": "^2.0.0", + "postcss": "^5.0.14", + "postcss-value-parser": "^3.2.3", + "svgo": "^0.7.0" + } + }, + "postcss-unique-selectors": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", + "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", + "requires": { + "alphanum-sort": "^1.0.1", + "postcss": "^5.0.4", + "uniqs": "^2.0.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "postcss-zindex": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", + "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", + "requires": { + "has": "^1.0.1", + "postcss": "^5.0.4", + "uniqs": "^2.0.0" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=" + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + }, + "randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" + } + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "^1.1.6" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "reduce-css-calc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", + "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", + "requires": { + "balanced-match": "^0.4.2", + "math-expression-evaluator": "^1.2.14", + "reduce-function-call": "^1.0.1" + } + }, + "reduce-function-call": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.3.tgz", + "integrity": "sha512-Hl/tuV2VDgWgCSEeWMLwxLZqX7OK59eU1guxXsRKTAyeYimivsKdtcV4fu3r710tpG5GmDKDhQ0HSZLExnNmyQ==", + "requires": { + "balanced-match": "^1.0.0" + }, + "dependencies": { + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + } + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "requires": { + "regenerate": "^1.4.0" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "requires": { + "is-equal-shallow": "^0.1.3" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexpp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", + "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==" + }, + "regexpu-core": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", + "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regjsgen": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", + "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==" + }, + "regjsparser": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "requires": { + "jsesc": "~0.5.0" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "^1.0.0" + } + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=" + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } + } + }, + "request-progress": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", + "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", + "requires": { + "throttleit": "^1.0.0" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "requires": { + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" + } + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=" + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "requires": { + "align-text": "^0.1.1" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "requires": { + "rx-lite": "*" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sass-graph": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz", + "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==", + "requires": { + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^13.3.2" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + } + } + }, + "sass-loader": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-6.0.7.tgz", + "integrity": "sha512-JoiyD00Yo1o61OJsoP2s2kb19L1/Y2p3QFcCdWdF6oomBGKVYuZyqHWemRBfQ2uGYsk+CH3eCguXNfpjzlcpaA==", + "requires": { + "clone-deep": "^2.0.1", + "loader-utils": "^1.0.1", + "lodash.tail": "^4.1.1", + "neo-async": "^2.5.0", + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "requires": { + "ajv": "^5.0.0" + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "requires": { + "js-base64": "^2.1.8", + "source-map": "^0.4.2" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "sequencify": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", + "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallow-clone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz", + "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==", + "requires": { + "is-extendable": "^0.1.1", + "kind-of": "^5.0.0", + "mixin-object": "^2.0.1" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + }, + "slice-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "requires": { + "is-fullwidth-code-point": "^2.0.0" + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "socket.io": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.7.4.tgz", + "integrity": "sha1-L37O3DORvy1cc+KR/iM+bjTU3QA=", + "requires": { + "debug": "2.3.3", + "engine.io": "~1.8.4", + "has-binary": "0.1.7", + "object-assign": "4.1.0", + "socket.io-adapter": "0.5.0", + "socket.io-client": "1.7.4", + "socket.io-parser": "2.3.1" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=" + }, + "object-assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", + "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=" + } + } + }, + "socket.io-adapter": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz", + "integrity": "sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s=", + "requires": { + "debug": "2.3.3", + "socket.io-parser": "2.3.1" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=" + } + } + }, + "socket.io-client": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.7.4.tgz", + "integrity": "sha1-7J+CA1btme9tNX8HVtZIcXvdQoE=", + "requires": { + "backo2": "1.0.2", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "2.3.3", + "engine.io-client": "~1.8.4", + "has-binary": "0.1.7", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseuri": "0.0.5", + "socket.io-parser": "2.3.1", + "to-array": "0.1.4" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=" + } + } + }, + "socket.io-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz", + "integrity": "sha1-3VMgJRA85Clpcya+/WQAX8/ltKA=", + "requires": { + "component-emitter": "1.1.2", + "debug": "2.2.0", + "isarray": "0.0.1", + "json3": "3.3.2" + }, + "dependencies": { + "component-emitter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", + "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=" + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + } + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + }, + "sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==" + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "requires": { + "readable-stream": "^2.0.1" + } + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-consume": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz", + "integrity": "sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg==" + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "streamfilter": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/streamfilter/-/streamfilter-1.0.7.tgz", + "integrity": "sha512-Gk6KZM+yNA1JpW0KzlZIhjo3EaBJDkYfXtYSbOwNIQ7Zd6006E6+sCFlW1NDvFG/vnXhKmw6TJJgiEQg/8lXfQ==", + "requires": { + "readable-stream": "^2.0.2" + } + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string.prototype.trimleft": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", + "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" + } + }, + "string.prototype.trimright": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", + "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" + } + }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + }, + "strip-bom-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz", + "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=", + "requires": { + "first-chunk-stream": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "first-chunk-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz", + "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=", + "requires": { + "readable-stream": "^2.0.2" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "requires": { + "get-stdin": "^4.0.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "svgo": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", + "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", + "requires": { + "coa": "~1.0.1", + "colors": "~1.1.2", + "csso": "~2.3.1", + "js-yaml": "~3.7.0", + "mkdirp": "~0.5.1", + "sax": "~1.2.1", + "whet.extend": "~0.9.9" + } + }, + "table": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", + "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", + "requires": { + "ajv": "^5.2.3", + "ajv-keywords": "^2.1.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", + "slice-ansi": "1.0.0", + "string-width": "^2.1.1" + } + }, + "tapable": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.9.tgz", + "integrity": "sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A==" + }, + "tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "requires": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, + "temp-write": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/temp-write/-/temp-write-0.1.1.tgz", + "integrity": "sha1-C2Rng43Xf79/YqDJPah5cy/9qTI=", + "requires": { + "graceful-fs": "~2.0.0", + "tempfile": "~0.1.2" + }, + "dependencies": { + "graceful-fs": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", + "integrity": "sha1-fNLNsiiko/Nule+mzBQt59GhNtA=" + } + } + }, + "tempfile": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-0.1.3.tgz", + "integrity": "sha1-fWtxAEcznTn4RzJ6BW2t8YMQMBA=", + "requires": { + "uuid": "~1.4.0" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=" + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "tildify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", + "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", + "requires": { + "os-homedir": "^1.0.0" + } + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=" + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" + }, + "true-case-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", + "requires": { + "glob": "^7.1.2" + } + }, + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + }, + "tslint": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", + "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", + "requires": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.29.0" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + } + } + }, + "tslint-config-standard": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/tslint-config-standard/-/tslint-config-standard-7.1.0.tgz", + "integrity": "sha512-cETzxZcEQ1RKjwtEScGryAtqwiRFc55xBxhZP6bePyOfXmo6i1/QKQrTgFKBiM4FjCvcqTjJq20/KGrh+TzTfQ==", + "requires": { + "tslint-eslint-rules": "^5.3.1" + } + }, + "tslint-eslint-rules": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz", + "integrity": "sha512-WlSXE+J2vY/VPgIcqQuijMQiel+UtmXS+4nvK4ZzlDiqBfXse8FAvkNnTcYhnQyOTW5KFM+uRRGXxYhFpuBc6w==", + "requires": { + "doctrine": "0.7.2", + "tslib": "1.9.0", + "tsutils": "^3.0.0" + }, + "dependencies": { + "doctrine": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz", + "integrity": "sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM=", + "requires": { + "esutils": "^1.1.6", + "isarray": "0.0.1" + } + }, + "esutils": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz", + "integrity": "sha1-wBzKqa5LiXxtDD4hCuUvPHqEQ3U=" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "tslib": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", + "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==" + }, + "tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "requires": { + "tslib": "^1.8.1" + } + } + } + }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "requires": { + "tslib": "^1.8.1" + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "typescript": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", + "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==" + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "requires": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + } + } + }, + "uglify-save-license": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/uglify-save-license/-/uglify-save-license-0.4.1.tgz", + "integrity": "sha1-lXJsF8xv0XHDYX479NjYKqjEzOE=" + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "optional": true + }, + "uglifyjs-webpack-plugin": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", + "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", + "requires": { + "source-map": "^0.5.6", + "uglify-js": "^2.8.29", + "webpack-sources": "^1.0.1" + } + }, + "ultron": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=" + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==" + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==" + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==" + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" + }, + "unique-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", + "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "optional": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + } + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + }, + "user-home": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=" + }, + "useragent": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", + "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", + "requires": { + "lru-cache": "4.1.x", + "tmp": "0.0.x" + } + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-1.4.2.tgz", + "integrity": "sha1-RTAZ9oaWam34PNxSROfJkOzDMvw=" + }, + "v8flags": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", + "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", + "requires": { + "user-home": "^1.1.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "requires": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + } + }, + "vinyl-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-2.0.0.tgz", + "integrity": "sha1-p+v1/779obfRjRQPyweyI++2dRo=", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.3.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0", + "strip-bom-stream": "^2.0.0", + "vinyl": "^1.1.0" + }, + "dependencies": { + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "requires": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + } + } + } + }, + "vinyl-fs": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", + "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", + "requires": { + "defaults": "^1.0.0", + "glob-stream": "^3.1.5", + "glob-watcher": "^0.0.6", + "graceful-fs": "^3.0.0", + "mkdirp": "^0.5.0", + "strip-bom": "^1.0.0", + "through2": "^0.6.1", + "vinyl": "^0.4.0" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=" + }, + "graceful-fs": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.12.tgz", + "integrity": "sha512-J55gaCS4iTTJfTXIxSVw3EMQckcqkpdRv3IR7gu6sq0+tbC363Zx6KH/SEwXASK9JRbhyZmVjJEVJIOxYsB3Qg==", + "requires": { + "natives": "^1.1.3" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "strip-bom": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", + "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", + "requires": { + "first-chunk-stream": "^1.0.0", + "is-utf8": "^0.2.0" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "requires": { + "clone": "^0.2.0", + "clone-stats": "^0.0.1" + } + } + } + }, + "vinyl-sourcemaps-apply": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", + "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", + "requires": { + "source-map": "^0.5.1" + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=" + }, + "watchpack": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.2.tgz", + "integrity": "sha512-ymVbbQP40MFTp+cNMvpyBpBtygHnPzPkHqoIwRRj/0B8KhqQwV8LaKjtbaxF2lK4vl8zN9wCxS46IFCU5K4W0g==", + "requires": { + "chokidar": "^3.4.0", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.0" + }, + "dependencies": { + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "optional": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", + "optional": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "optional": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", + "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", + "optional": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "optional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "optional": true + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "optional": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "optional": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "optional": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "optional": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "optional": true + }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "optional": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "optional": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "watchpack-chokidar2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", + "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", + "optional": true, + "requires": { + "chokidar": "^2.1.8" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "optional": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "optional": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "optional": true + } + } + }, + "webpack": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.12.0.tgz", + "integrity": "sha512-Sw7MdIIOv/nkzPzee4o0EdvCuPmxT98+vVpIvwtcwcF1Q4SDSNp92vwcKc4REe7NItH9f1S4ra9FuQ7yuYZ8bQ==", + "requires": { + "acorn": "^5.0.0", + "acorn-dynamic-import": "^2.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "async": "^2.1.2", + "enhanced-resolve": "^3.4.0", + "escope": "^3.6.0", + "interpret": "^1.0.0", + "json-loader": "^0.5.4", + "json5": "^0.5.1", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "mkdirp": "~0.5.0", + "node-libs-browser": "^2.0.0", + "source-map": "^0.5.3", + "supports-color": "^4.2.1", + "tapable": "^0.2.7", + "uglifyjs-webpack-plugin": "^0.4.6", + "watchpack": "^1.4.0", + "webpack-sources": "^1.0.1", + "yargs": "^8.0.2" + }, + "dependencies": { + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==" + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "enhanced-resolve": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", + "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "object-assign": "^4.0.1", + "tapable": "^0.2.7" + } + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "requires": { + "has-flag": "^2.0.0" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yargs": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "requires": { + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "webpack-stream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/webpack-stream/-/webpack-stream-4.0.3.tgz", + "integrity": "sha512-Tx7ks7Of/JiPz7/tUM4WqSg4OcXF4m4OzNSaEzNA1TNXQaiTHIjiKqUoL79wGXbFt2q1IP8VG5DcEdaxifY5Ew==", + "requires": { + "fancy-log": "^1.3.2", + "lodash.clone": "^4.3.2", + "lodash.some": "^4.2.2", + "memory-fs": "^0.4.1", + "plugin-error": "^1.0.1", + "supports-color": "^5.3.0", + "through": "^2.3.8", + "vinyl": "^2.1.0", + "webpack": "^3.4.1" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=" + }, + "replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==" + }, + "vinyl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + } + } + }, + "whet.extend": { + "version": "0.9.9", + "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", + "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=" + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "requires": { + "mkdirp": "^0.5.1" + } + }, + "ws": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", + "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", + "requires": { + "options": ">=0.0.5", + "ultron": "1.0.x" + } + }, + "wtf-8": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz", + "integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=" + }, + "xmlhttprequest-ssl": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", + "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=" + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "yargs": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", + "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", + "requires": { + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "lodash.assign": "^4.0.3", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.1", + "which-module": "^1.0.0", + "window-size": "^0.2.0", + "y18n": "^3.2.1", + "yargs-parser": "^2.4.1" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "^1.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" + }, + "window-size": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", + "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=" + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yargs-parser": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", + "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", + "requires": { + "camelcase": "^3.0.0", + "lodash.assign": "^4.0.6" + } + } + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + } + } + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "yazl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", + "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", + "requires": { + "buffer-crc32": "~0.2.3" + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" } } }, @@ -5495,22 +14787,6 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=" }, - "generate-function": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", - "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", - "requires": { - "is-property": "^1.0.2" - } - }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", - "requires": { - "is-property": "^1.0.0" - } - }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -5539,29 +14815,11 @@ } }, "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "requires": { - "assert-plus": "^1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } + "pump": "^3.0.0" } }, "glob": { @@ -5578,69 +14836,20 @@ } }, "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } + "is-glob": "^4.0.1" } }, "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "requires": { - "global-prefix": "^3.0.0" - } - }, - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, "globals": { "version": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", @@ -5660,40 +14869,27 @@ } }, "got": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", - "integrity": "sha1-HSP2Q5Dpf3dsrFLluTbl9RTS6Tc=", + "version": "11.8.2", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.2.tgz", + "integrity": "sha512-D0QywKgIe30ODs+fm8wMZiAcZjypcCodPNuMz5H9Mny7RJ+IjJ10BdmGW7OM7fHXP+O7r6ZwapQ/YQmMSvB0UQ==", "requires": { - "@sindresorhus/is": "^0.7.0", - "cacheable-request": "^2.1.1", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "into-stream": "^3.1.0", - "is-retry-allowed": "^1.1.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "mimic-response": "^1.0.0", - "p-cancelable": "^0.4.0", - "p-timeout": "^2.0.1", - "pify": "^3.0.0", - "safe-buffer": "^5.1.1", - "timed-out": "^4.0.1", - "url-parse-lax": "^3.0.0", - "url-to-options": "^1.0.1" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.1", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" } }, "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" }, "growly": { "version": "1.3.0", @@ -5704,20 +14900,9 @@ "handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha1-hX95zjWVgMNA1DCBzGSJcNC7I04=", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, - "har-validator": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", - "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", - "requires": { - "chalk": "^1.1.1", - "commander": "^2.9.0", - "is-my-json-valid": "^2.12.4", - "pinkie-promise": "^2.0.0" - } - }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -5730,6 +14915,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, "requires": { "ansi-regex": "^2.0.0" } @@ -5739,56 +14925,11 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, - "has-symbol-support-x": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", - "integrity": "sha1-FAn5i8ACR9pF2mfO4KNvKC/yZFU=" - }, "has-symbols": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", "integrity": "sha1-n1IUdYpEGWxAbZvXbOv4HsLdMeg=" }, - "has-to-string-tag-x": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", - "integrity": "sha1-oEWrOD17SyASoAFIqwql8pAETU0=", - "requires": { - "has-symbol-support-x": "^1.4.1" - } - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "hash-base": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", @@ -5839,38 +14980,12 @@ "minimalistic-assert": "^1.0.1" } }, - "hasha": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", - "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", - "requires": { - "is-stream": "^1.0.1", - "pinkie-promise": "^2.0.0" - } - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "requires": { - "boom": "2.x.x", - "cryptiles": "2.x.x", - "hoek": "2.x.x", - "sntp": "1.x.x" - } - }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=", "dev": true }, - "hex-color-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", - "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", - "dev": true - }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -5881,20 +14996,6 @@ "minimalistic-crypto-utils": "^1.0.1" } }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, "hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", @@ -5907,80 +15008,160 @@ "wbuf": "^1.1.0" } }, - "hsl-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", - "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", - "dev": true - }, - "hsla-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", - "dev": true - }, - "html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha1-l9RoiutcgYhqNk+qDK0d2hTUM6c=", - "dev": true + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "requires": { + "whatwg-encoding": "^1.0.5" + } }, "html-entities": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", - "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz", + "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==", "dev": true }, "html-loader": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-0.5.5.tgz", - "integrity": "sha512-7hIW7YinOYUpo//kSYcPB6dCKoceKLmOwjEMmhIobHuWGDVl0Nwe4l68mdG/Ru0wcUxQjVMEoZpkalZ/SE7zog==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-1.3.2.tgz", + "integrity": "sha512-DEkUwSd0sijK5PF3kRWspYi56XP7bTNkyg5YWSzBdjaSDmvCufep5c4Vpb3PBf6lUL0YPtLwBfy9fL0t5hBAGA==", "dev": true, "requires": { - "es6-templates": "^0.2.3", - "fastparse": "^1.1.1", - "html-minifier": "^3.5.8", - "loader-utils": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "html-minifier": { - "version": "3.5.21", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", - "integrity": "sha1-0AQOBUcw41TbAIRjWTGUAVIS0gw=", - "dev": true, - "requires": { - "camel-case": "3.0.x", - "clean-css": "4.2.x", - "commander": "2.17.x", - "he": "1.2.x", - "param-case": "2.1.x", - "relateurl": "0.2.x", - "uglify-js": "3.4.x" + "html-minifier-terser": "^5.1.1", + "htmlparser2": "^4.1.0", + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" }, "dependencies": { - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", + "dev": true, + "requires": { + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", + "he": "^1.2.0", + "param-case": "^3.0.3", + "relateurl": "^0.2.7", + "terser": "^4.6.3" + }, + "dependencies": { + "clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + } + }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } + } } } }, "html2canvas": { - "version": "0.5.0-beta4", - "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-0.5.0-beta4.tgz", - "integrity": "sha1-goLGKsX9eBaPVwK15IdxV8qT854=" + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.3.2.tgz", + "integrity": "sha512-4+zqv87/a1LsaCrINV69wVLGG8GBZcYBboz1JPWEgiXcWoD9kroLzccsBRU/L9UlfV2MAZ+3J92U9IQPVMDeSQ==", + "requires": { + "css-line-break": "2.0.1", + "text-segmentation": "^1.0.2" + } }, "htmlescape": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=" }, + "htmlparser2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz", + "integrity": "sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^3.0.0", + "domutils": "^2.0.0", + "entities": "^2.0.0" + }, + "dependencies": { + "domhandler": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz", + "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1" + } + } + } + }, "http-cache-semantics": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", - "integrity": "sha1-ObDhat2bYFvwqe89nar0hDtMrNI=" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" }, "http-deceiver": { "version": "1.2.7", @@ -5991,7 +15172,7 @@ "http-errors": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8=", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", "dev": true, "requires": { "depd": "~1.1.2", @@ -6026,26 +15207,51 @@ "requires-port": "^1.0.0" } }, - "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", - "dev": true, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } } }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "http-proxy-middleware": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz", + "integrity": "sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg==", + "dev": true, "requires": { - "assert-plus": "^0.2.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "@types/http-proxy": "^1.17.5", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + } + }, + "http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "requires": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" } }, "https-browserify": { @@ -6053,6 +15259,36 @@ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "requires": { + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, "icheck": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/icheck/-/icheck-1.0.2.tgz", @@ -6061,23 +15297,70 @@ "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "requires": { "safer-buffer": ">= 2.1.2 < 3" } }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", - "dev": true - }, "icss-utils": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", "requires": { "postcss": "^7.0.14" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "ieee754": { @@ -6085,16 +15368,10 @@ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", "dev": true }, "image-size": { @@ -6117,102 +15394,59 @@ } }, "img-loader": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/img-loader/-/img-loader-3.0.2.tgz", - "integrity": "sha512-rSriLKgvi85Km7ppSF+AEAM3nU4fxpvCkaXtC/IoCEU7jfks55bEANFs0bB9YXYkxY9JurZQIZFtXh5Gue3upw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/img-loader/-/img-loader-4.0.0.tgz", + "integrity": "sha512-UwRcPQdwdOyEHyCxe1V9s9YFwInwEWCpoO+kJGfIqDrBDqA8jZUsEZTxQ0JteNPGw/Gupmwesk2OhLTcnw6tnQ==", "dev": true, "requires": { "loader-utils": "^1.1.0" } }, "import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", + "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==", "dev": true, "requires": { - "import-from": "^2.1.0" + "import-from": "^3.0.0" } }, "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } } } }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true + "import-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", + "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + } + }, + "import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } }, "indent-string": { "version": "4.0.0", @@ -6225,12 +15459,6 @@ "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -6245,12 +15473,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=" }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, "inline-source-map": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", @@ -6322,30 +15544,31 @@ } }, "internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-6.2.0.tgz", + "integrity": "sha512-D8WGsR6yDt8uq7vDMu7mjcR+yRMm3dW8yufyChmszWRjcSHuxLBkR3GdS2HZAjodsaGuCvXeEJpueisXJULghg==", "dev": true, "requires": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" + "default-gateway": "^6.0.0", + "ipaddr.js": "^1.9.1", + "is-ip": "^3.1.0", + "p-event": "^4.2.0" + }, + "dependencies": { + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + } } }, "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", "dev": true }, - "into-stream": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", - "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", - "requires": { - "from2": "^2.1.1", - "p-is-promise": "^1.1.0" - } - }, "invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -6372,40 +15595,23 @@ "dev": true }, "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", + "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", "dev": true }, "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha1-v/OFQ+64mEglB5/zoqjmy9RngbM=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", "dev": true }, "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", "dev": true }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, "is-arguments": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", @@ -6421,12 +15627,12 @@ "dev": true }, "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "requires": { - "binary-extensions": "^1.0.0" + "binary-extensions": "^2.0.0" } }, "is-buffer": { @@ -6439,20 +15645,6 @@ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==" }, - "is-color-stop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", - "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", - "dev": true, - "requires": { - "css-color-names": "^0.0.4", - "hex-color-regex": "^1.1.0", - "hsl-regex": "^1.0.0", - "hsla-regex": "^1.0.0", - "rgb-regex": "^1.0.1", - "rgba-regex": "^1.0.0" - } - }, "is-core-module": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", @@ -6461,63 +15653,15 @@ "has": "^1.0.3" } }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, "is-date-object": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", "integrity": "sha1-vac28s2P0G0yhE53Q7+nSUw7/X4=" }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true - }, "is-docker": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", - "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", - "dev": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true }, "is-extglob": { @@ -6527,9 +15671,9 @@ "dev": true }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "is-generator-function": { @@ -6540,27 +15684,19 @@ "is-glob": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, "requires": { "is-extglob": "^2.1.1" } }, - "is-my-ip-valid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", - "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==" - }, - "is-my-json-valid": { - "version": "2.20.5", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.20.5.tgz", - "integrity": "sha512-VTPuvvGQtxvCeghwspQu1rBgjYUT6FGxPlvFKbYuFtgc4ADsX3U5ihZOYN0qyU6u+d4X9xXb0IT5O6QpXKt87A==", + "is-ip": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-3.1.0.tgz", + "integrity": "sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==", + "dev": true, "requires": { - "generate-function": "^2.0.0", - "generate-object-property": "^1.1.0", - "is-my-ip-valid": "^1.0.0", - "jsonpointer": "^4.0.0", - "xtend": "^4.0.0" + "ip-regex": "^4.0.0" } }, "is-negative-zero": { @@ -6569,67 +15705,42 @@ "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" }, "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "is-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", - "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==" - }, "is-path-cwd": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", "dev": true }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "requires": { - "is-path-inside": "^2.1.0" - } - }, "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "requires": { - "path-is-inside": "^1.0.2" - } + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true }, "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { "isobject": "^3.0.1" } }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" }, "is-regex": { "version": "1.1.2", @@ -6646,24 +15757,11 @@ "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", "dev": true }, - "is-retry-allowed": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha1-13hIi9CkZmo76KFIK58rqv7eqLQ=" - }, "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-svg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", - "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", - "dev": true, - "requires": { - "html-comment-regex": "^1.1.0" - } + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true }, "is-symbol": { "version": "1.0.3", @@ -6685,27 +15783,19 @@ "has-symbols": "^1.0.1" } }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, "is-what": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.13.0.tgz", - "integrity": "sha512-qYTOcdAo0H0tvMTl9ZhsjpEZH5Q07JDVrPnFMAQgBM0UctGqVsKE7LgZPNZEFPw1EhUkpaBL/BKnRgVX7CoMTw==" - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=", - "dev": true + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==" }, "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } }, "isarray": { "version": "1.0.0", @@ -6715,7 +15805,8 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true }, "isobject": { "version": "3.0.1", @@ -6723,28 +15814,15 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "isurl": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", - "integrity": "sha1-sn9PSfPNqj6kSgpbfzRi5u3DnWc=", - "requires": { - "has-to-string-tag-x": "^1.2.0", - "is-object": "^1.0.1" - } - }, "jest-worker": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.5.0.tgz", - "integrity": "sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.2.0.tgz", + "integrity": "sha512-laB0ZVIBz+voh/QQy9dmUuuDsadixeerrKqyVpgPz+CCWiOYjOBabUXHIXZhsdvkWbLqSHbgkAHWl5cg24Q6RA==", "dev": true, "requires": { + "@types/node": "*", "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" + "supports-color": "^8.0.0" }, "dependencies": { "has-flag": { @@ -6754,9 +15832,9 @@ "dev": true }, "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -6765,9 +15843,9 @@ } }, "jquery": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.1.tgz", - "integrity": "sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg==" + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", + "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" }, "jquery-form-validator": { "version": "2.3.79", @@ -6823,49 +15901,72 @@ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", "dev": true }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, "jsdom": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-8.5.0.tgz", - "integrity": "sha1-1Nj12/J2hjW2KmKCO5R89wcevJg=", + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", "requires": { - "abab": "^1.0.0", - "acorn": "^2.4.0", - "acorn-globals": "^1.0.4", - "array-equal": "^1.0.0", - "cssom": ">= 0.3.0 < 0.4.0", - "cssstyle": ">= 0.2.34 < 0.3.0", - "escodegen": "^1.6.1", - "iconv-lite": "^0.4.13", - "nwmatcher": ">= 1.3.7 < 2.0.0", - "parse5": "^1.5.1", - "request": "^2.55.0", - "sax": "^1.1.4", - "symbol-tree": ">= 3.1.0 < 4.0.0", - "tough-cookie": "^2.2.0", - "webidl-conversions": "^3.0.1", - "whatwg-url": "^2.0.1", - "xml-name-validator": ">= 2.0.1 < 3.0.0" + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" }, "dependencies": { "acorn": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", - "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=" + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==" + }, + "escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + }, + "ws": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz", + "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==" } } }, @@ -6876,37 +15977,27 @@ "dev": true }, "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk=", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=" }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha1-f8EON1/FrkLEcFpcwKpvYr4wW4E=", - "dev": true - }, "json5": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", @@ -6917,12 +16008,21 @@ } }, "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "requires": { - "graceful-fs": "^4.1.6" + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + }, + "dependencies": { + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + } } }, "jsonparse": { @@ -6930,16 +16030,12 @@ "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" }, - "jsonpointer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.1.0.tgz", - "integrity": "sha512-CXcRvMyTlnR53xMcKnuMzfCA5i/nfblTnnr74CZb6C4vG39eu6w51t7nKmU5MfLfbTgGItliNyjO/ciNPDqClg==" - }, "jspdf": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-2.3.0.tgz", - "integrity": "sha512-KdWe3y5YGjuD8E3Yv1vN8BMuuaQR1jvLTlcZ4dQxUSr1ZveuTv1CnyXyafNL7xfi4eDcIdzs6z9tb9JRDiDCbg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-2.4.0.tgz", + "integrity": "sha512-nsZ92YfbNG/EimR1yqmOkxf2D4iJRypBsw7pvP1aPiIEnoGITaLl6XDR/GYA36/R29vMZSBedpEhBCzutSGytA==", "requires": { + "@babel/runtime": "^7.14.0", "atob": "^2.1.2", "btoa": "^1.2.1", "canvg": "^3.0.6", @@ -6949,119 +16045,32 @@ "html2canvas": "^1.0.0-rc.5" }, "dependencies": { - "base64-arraybuffer": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.2.0.tgz", - "integrity": "sha512-7emyCsu1/xiBXgQZrscw/8KPRT44I4Yq9Pe6EGs3aPRTsWuggML1/1DTuZUuIaJPIm1FTDUVXl4x/yW8s0kQDQ==", - "optional": true + "@babel/runtime": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz", + "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==", + "requires": { + "regenerator-runtime": "^0.13.4" + } }, "core-js": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.9.0.tgz", - "integrity": "sha512-PyFBJaLq93FlyYdsndE5VaueA9K5cNB7CGzeCj191YYLhkQM0gdZR2SKihM70oF0wdqKSKClv/tEBOpoRmdOVQ==", + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.18.0.tgz", + "integrity": "sha512-WJeQqq6jOYgVgg4NrXKL0KLQhi0CT4ZOCvFL+3CQ5o7I6J8HkT5wd53EadMfqTDp1so/MT1J+w2ujhWcCJtN7w==", "optional": true }, - "css-line-break": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-1.1.1.tgz", - "integrity": "sha512-1feNVaM4Fyzdj4mKPIQNL2n70MmuYzAXZ1aytlROFX1JsOo070OsugwGjj7nl6jnDJWHDM8zRZswkmeYVWZJQA==", - "optional": true, - "requires": { - "base64-arraybuffer": "^0.2.0" - } - }, - "html2canvas": { - "version": "1.0.0-rc.7", - "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.0.0-rc.7.tgz", - "integrity": "sha512-yvPNZGejB2KOyKleZspjK/NruXVQuowu8NnV2HYG7gW7ytzl+umffbtUI62v2dCHQLDdsK6HIDtyJZ0W3neerA==", - "optional": true, - "requires": { - "css-line-break": "1.1.1" - } + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" } } }, - "jspdf-autotable": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/jspdf-autotable/-/jspdf-autotable-2.0.17.tgz", - "integrity": "sha1-usPRFK4S1E4NeXVjTROZ+GZxbHc=", - "requires": { - "jspdf": "^1.0.272" - }, - "dependencies": { - "canvg": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/canvg/-/canvg-1.5.3.tgz", - "integrity": "sha512-7Gn2IuQzvUQWPIuZuFHrzsTM0gkPz2RRT9OcbdmA03jeKk8kltrD8gqUzNX15ghY/4PV5bbe5lmD6yDLDY6Ybg==", - "requires": { - "jsdom": "^8.1.0", - "rgbcolor": "^1.0.1", - "stackblur-canvas": "^1.4.1", - "xmldom": "^0.1.22" - }, - "dependencies": { - "stackblur-canvas": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-1.4.1.tgz", - "integrity": "sha1-hJqm+UsnL/JvZHH6QTDtH35HlVs=" - } - } - }, - "file-saver": { - "version": "git+ssh://git@github.com/eligrey/FileSaver.js.git#e865e37af9f9947ddcced76b549e27dc45c1cb2e", - "from": "file-saver@github:eligrey/FileSaver.js#1.3.8" - }, - "html2canvas": { - "version": "1.0.0-alpha.12", - "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.0.0-alpha.12.tgz", - "integrity": "sha1-OxmS48mz9WBjw1/WIElPN+uohRM=", - "requires": { - "css-line-break": "1.0.1" - } - }, - "jspdf": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-1.5.3.tgz", - "integrity": "sha512-J9X76xnncMw+wIqb15HeWfPMqPwYxSpPY8yWPJ7rAZN/ZDzFkjCSZObryCyUe8zbrVRNiuCnIeQteCzMn7GnWw==", - "requires": { - "canvg": "1.5.3", - "file-saver": "git+ssh://git@github.com/eligrey/FileSaver.js.git#e865e37af9f9947ddcced76b549e27dc45c1cb2e", - "html2canvas": "1.0.0-alpha.12", - "omggif": "1.0.7", - "promise-polyfill": "8.1.0", - "stackblur-canvas": "2.2.0" - }, - "dependencies": { - "file-saver": { - "version": "git+ssh://git@github.com/eligrey/FileSaver.js.git#e865e37af9f9947ddcced76b549e27dc45c1cb2e", - "from": "git+ssh://git@github.com/eligrey/FileSaver.js.git#e865e37af9f9947ddcced76b549e27dc45c1cb2e" - } - } - }, - "stackblur-canvas": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.2.0.tgz", - "integrity": "sha512-5Gf8dtlf8k6NbLzuly2NkGrkS/Ahh+I5VUjO7TnFizdJtgpfpLLEdQlLe9umbcnZlitU84kfYjXE67xlSXfhfQ==" - } - } - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } - } + "junk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", + "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==", + "dev": true }, "jvectormap": { "version": "1.2.2", @@ -7071,41 +16080,25 @@ "jquery": ">=1.5" } }, - "kew": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", - "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=" - }, "keyv": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", - "integrity": "sha1-RJI7o55osSp87H32wyaMAx8u83M=", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.3.tgz", + "integrity": "sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA==", "requires": { - "json-buffer": "3.0.0" + "json-buffer": "3.0.1" } }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha1-TIzkQRh6Bhx0dPuHygjipjgZSJI=", - "dev": true - }, "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "requires": { - "graceful-fs": "^4.1.9" - } + "klona": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", + "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==", + "dev": true }, "labeled-stream-splicer": { "version": "2.0.2", @@ -7117,236 +16110,324 @@ } }, "laravel-mix": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/laravel-mix/-/laravel-mix-5.0.9.tgz", - "integrity": "sha512-1WCJiHimTRW3KlxcabRTco0q+bo4uKPaFTkc6cJ/bLEq4JT1aPkojoauUK7+PyiIlDJncw0Nt2MtDrv5C6j5IQ==", + "version": "6.0.31", + "resolved": "https://registry.npmjs.org/laravel-mix/-/laravel-mix-6.0.31.tgz", + "integrity": "sha512-T9uFNNARS5hXl5JggCkLKybwAnyYEHBXzPseC0yJ/6EVK7eyvPOq2UAGDVqhfYTZKxrMd5B5ww1kEooDRoH+OA==", "dev": true, "requires": { - "@babel/core": "^7.2.0", - "@babel/plugin-proposal-object-rest-spread": "^7.2.0", - "@babel/plugin-syntax-dynamic-import": "^7.2.0", - "@babel/plugin-transform-runtime": "^7.2.0", - "@babel/preset-env": "^7.2.0", - "@babel/runtime": "^7.2.0", - "autoprefixer": "^9.4.2", - "babel-loader": "^8.0.4", - "babel-merge": "^2.0.1", - "chokidar": "^2.0.3", - "clean-css": "^4.1.3", - "collect.js": "^4.12.8", + "@babel/core": "^7.14.5", + "@babel/plugin-proposal-object-rest-spread": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.14.5", + "@babel/preset-env": "^7.14.5", + "@babel/runtime": "^7.14.5", + "@types/babel__core": "^7.1.14", + "@types/clean-css": "^4.2.4", + "@types/imagemin-gifsicle": "^7.0.0", + "@types/imagemin-mozjpeg": "^8.0.0", + "@types/imagemin-optipng": "^5.2.0", + "@types/imagemin-svgo": "^8.0.0", + "autoprefixer": "^10.2.6", + "babel-loader": "^8.2.2", + "chalk": "^4.1.1", + "chokidar": "^3.5.1", + "clean-css": "^4.2.3 || ^5.1.2", + "cli-table3": "^0.6.0", + "collect.js": "^4.28.5", + "commander": "^7.2.0", "concat": "^1.0.3", - "css-loader": "^1.0.1", - "dotenv": "^6.2.0", - "dotenv-expand": "^4.2.0", - "extract-text-webpack-plugin": "v4.0.0-beta.0", - "file-loader": "^2.0.0", - "friendly-errors-webpack-plugin": "^1.6.1", - "fs-extra": "^7.0.1", - "glob": "^7.1.2", - "html-loader": "^0.5.5", - "imagemin": "^6.0.0", - "img-loader": "^3.0.0", - "lodash": "^4.17.15", - "md5": "^2.2.1", - "optimize-css-assets-webpack-plugin": "^5.0.1", - "postcss-loader": "^3.0.0", - "style-loader": "^0.23.1", - "terser": "^3.11.0", - "terser-webpack-plugin": "^2.2.3", - "vue-loader": "^15.4.2", - "webpack": "^4.36.1", - "webpack-cli": "^3.1.2", - "webpack-dev-server": "^3.1.14", - "webpack-merge": "^4.1.0", - "webpack-notifier": "^1.5.1", - "yargs": "^15.4.1" + "css-loader": "^5.2.6", + "cssnano": "^5.0.6", + "dotenv": "^10.0.0", + "dotenv-expand": "^5.1.0", + "file-loader": "^6.2.0", + "fs-extra": "^10.0.0", + "glob": "^7.1.7", + "html-loader": "^1.3.2", + "imagemin": "^7.0.1", + "img-loader": "^4.0.0", + "lodash": "^4.17.21", + "md5": "^2.3.0", + "mini-css-extract-plugin": "^1.6.0", + "node-libs-browser": "^2.2.1", + "postcss-load-config": "^3.0.1", + "postcss-loader": "^6.1.0", + "semver": "^7.3.5", + "strip-ansi": "^6.0.0", + "style-loader": "^2.0.0", + "terser": "^5.7.0", + "terser-webpack-plugin": "^5.1.3", + "vue-style-loader": "^4.1.3", + "webpack": "^5.38.1", + "webpack-cli": "^4.7.2", + "webpack-dev-server": "4.1.1", + "webpack-merge": "^5.8.0", + "webpack-notifier": "^1.13.0", + "webpackbar": "^5.0.0-3", + "yargs": "^17.0.1" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "@babel/runtime": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz", + "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "regenerator-runtime": "^0.13.4" } }, + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "css-loader": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.1.tgz", - "integrity": "sha512-+ZHAZm/yqvJ2kDtPne3uX0C+Vr3Zn5jFn2N4HywtS5ujwvsVkyg0VArEXpl3BgczDA8anieki1FIzhchX4yrDw==", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "babel-code-frame": "^6.26.0", - "css-selector-tokenizer": "^0.7.0", - "icss-utils": "^2.1.0", - "loader-utils": "^1.0.2", - "lodash": "^4.17.11", - "postcss": "^6.0.23", - "postcss-modules-extract-imports": "^1.2.0", - "postcss-modules-local-by-default": "^1.2.0", - "postcss-modules-scope": "^1.1.0", - "postcss-modules-values": "^1.3.0", - "postcss-value-parser": "^3.3.0", - "source-list-map": "^2.0.0" + "color-name": "~1.1.4" + } + }, + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + }, + "css-loader": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz", + "integrity": "sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==", + "dev": true, + "requires": { + "icss-utils": "^5.1.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.15", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.5" } }, "file-type": { - "version": "10.11.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-10.11.0.tgz", - "integrity": "sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw==", + "version": "12.4.2", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-12.4.2.tgz", + "integrity": "sha512-UssQP5ZgIOKelfsaB5CuGAL+Y+q7EmONuiwF3N5HAH0t27rvrttgi6Ra9k/+DVaY9UF6+ybxu5pOXLUdA8N7Vg==", "dev": true }, - "globby": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", - "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "requires": { - "array-union": "^1.0.1", - "dir-glob": "2.0.0", - "fast-glob": "^2.0.2", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true + }, + "imagemin": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/imagemin/-/imagemin-7.0.1.tgz", + "integrity": "sha512-33AmZ+xjZhg2JMCe+vDf6a9mzWukE7l+wAtesjE7KyteqqKjzxv7aVQeWnul1Ve26mWvEQqyPwl0OctNBfSR9w==", + "dev": true, + "requires": { + "file-type": "^12.0.0", + "globby": "^10.0.0", + "graceful-fs": "^4.2.2", + "junk": "^3.1.0", + "make-dir": "^3.0.0", + "p-pipe": "^3.0.0", + "replace-ext": "^1.0.0" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" }, "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, - "icss-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", - "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", - "dev": true, - "requires": { - "postcss": "^6.0.1" - } - }, - "imagemin": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/imagemin/-/imagemin-6.1.0.tgz", - "integrity": "sha512-8ryJBL1CN5uSHpiBMX0rJw79C9F9aJqMnjGnrd/1CafegpNuA81RBAAru/jQQEOWlOJJlpRnlcVFF6wq+Ist0A==", - "dev": true, - "requires": { - "file-type": "^10.7.0", - "globby": "^8.0.1", - "make-dir": "^1.0.0", - "p-pipe": "^1.1.0", - "pify": "^4.0.1", - "replace-ext": "^1.0.0" - } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "p-pipe": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-3.1.0.tgz", + "integrity": "sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==", "dev": true }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, "postcss-modules-extract-imports": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz", - "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", - "dev": true, - "requires": { - "postcss": "^6.0.1" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true }, "postcss-modules-local-by-default": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", "dev": true, "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" } }, "postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", "dev": true, "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" + "postcss-selector-parser": "^6.0.4" } }, "postcss-modules-values": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", - "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "dev": true, "requires": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^6.0.1" + "icss-utils": "^5.0.0" } }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", "dev": true }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" } } } }, - "last-call-webpack-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", - "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", - "dev": true, - "requires": { - "lodash": "^4.17.5", - "webpack-sources": "^1.1.0" - } - }, "less": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/less/-/less-3.13.1.tgz", - "integrity": "sha512-SwA1aQXGUvp+P5XdZslUOhhLnClSLIjWvJhmd+Vgib5BFIr9lMNlQwmwUNOjXThF/A0x+MCYYPeWEfeWiLRnTw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.1.tgz", + "integrity": "sha512-w09o8tZFPThBscl5d0Ggp3RcrKIouBoQscnOMgFH3n5V3kN/CXGHNfCkRPtxJk6nKryDXaV9aHLK55RXuH4sAw==", "requires": { "copy-anything": "^2.0.1", "errno": "^0.1.1", @@ -7354,7 +16435,8 @@ "image-size": "~0.5.0", "make-dir": "^2.1.0", "mime": "^1.4.1", - "native-request": "^1.0.5", + "needle": "^2.5.2", + "parse-node-version": "^1.0.1", "source-map": "~0.6.0", "tslib": "^1.10.0" }, @@ -7390,19 +16472,19 @@ } }, "less-loader": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-4.1.0.tgz", - "integrity": "sha1-LBNSxbCaT4QQFJAnT9UWdN5BNj4=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-5.0.0.tgz", + "integrity": "sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg==", "requires": { "clone": "^2.1.1", "loader-utils": "^1.1.0", - "pify": "^3.0.0" + "pify": "^4.0.1" }, "dependencies": { "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" } } }, @@ -7415,6 +16497,35 @@ "type-check": "~0.3.2" } }, + "lilconfig": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.3.tgz", + "integrity": "sha512-EHKqr/+ZvdKCifpNrJCKxBTgk5XupZA3y/aCPY9mxfgBzmgh93Mt/WqjjQ38oMxXuvDokaKiM3lAgvSH2sjtHg==", + "dev": true + }, + "linebreak": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/linebreak/-/linebreak-1.0.2.tgz", + "integrity": "sha512-bJwSRsJeAmaZYnkcwl5sCQNfSDAhBuXxb6L27tb+qkBRtUQSSTUa5bcgCPD6hFEkRNlpWHfK7nFMmcANU7ZP1w==", + "requires": { + "base64-js": "0.0.8", + "brfs": "^2.0.2", + "unicode-trie": "^1.0.0" + }, + "dependencies": { + "base64-js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", + "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=" + } + } + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, "list.js": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/list.js/-/list.js-1.5.0.tgz", @@ -7424,9 +16535,9 @@ } }, "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha1-7UcGa/5TTX6ExMe5mYwqdWB9k1c=", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", + "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", "dev": true }, "loader-utils": { @@ -7463,6 +16574,12 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -7475,12 +16592,6 @@ "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", "dev": true }, - "loglevel": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", - "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", - "dev": true - }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -7491,23 +16602,42 @@ } }, "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", - "dev": true - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha1-b54wtHCE2XGnyCD/FabFFnt0wm8=" - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", "dev": true, "requires": { - "yallist": "^3.0.2" + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "dev": true + } + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "magic-string": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.1.tgz", + "integrity": "sha512-sCuTz6pYom8Rlt4ISPFn6wuFodbKMIHUMv4Qko9P17dpxb7s52KJTmRuZZqHdGmLCK9AOcDare039nRIcfdkEg==", + "requires": { + "sourcemap-codec": "^1.4.1" } }, "make-dir": { @@ -7525,21 +16655,6 @@ } } }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, "md5": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", @@ -7562,9 +16677,9 @@ } }, "mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", "dev": true }, "media-typer": { @@ -7573,14 +16688,13 @@ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "memfs": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.3.0.tgz", + "integrity": "sha512-BEE62uMfKOavX3iG7GYX43QJ+hAeeWnwIAuJ/R6q96jaMtiLzhsxHJC8B1L7fK7Pt/vXDRwb3SG/yBpNGDPqzg==", "dev": true, "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "fs-monkey": "1.0.3" } }, "merge-descriptors": { @@ -7625,51 +16739,13 @@ "dev": true }, "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } + "braces": "^3.0.1", + "picomatch": "^2.2.3" } }, "miller-rabin": { @@ -7691,25 +16767,72 @@ "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=" + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "mime-db": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.46.0.tgz", - "integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==" + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", + "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==" }, "mime-types": { - "version": "2.1.29", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.29.tgz", - "integrity": "sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==", + "version": "2.1.32", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", + "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", "requires": { - "mime-db": "1.46.0" + "mime-db": "1.49.0" } }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, "mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha1-SSNTiHju9CBjy4o+OweYeBSHqxs=" + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + }, + "mini-css-extract-plugin": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.6.2.tgz", + "integrity": "sha512-WhDvO3SjGm40oV5y26GjMJYjd2UMqrLAGKy5YS2/3QKJy2F7jgynuHTir/tgUUOiNQu5saXHdc8reo7YuhhT4Q==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", + "webpack-sources": "^1.1.0" + }, + "dependencies": { + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } }, "minimalistic-assert": { "version": "1.0.1", @@ -7734,104 +16857,6 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=" }, - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - }, - "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha1-ESC0PcNZp4Xc5ltVuC4lfM9HlWY=", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", - "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=", - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - } - } - }, "mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", @@ -7909,31 +16934,6 @@ "resolved": "https://registry.npmjs.org/morris.js/-/morris.js-0.5.0.tgz", "integrity": "sha1-cldnE1z64Fmq51mZuyzmocXRtEs=" }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - } - } - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -7943,7 +16943,7 @@ "multicast-dns": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha1-oOx72QVcQoL3kMPIL04o2zsxsik=", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", "dev": true, "requires": { "dns-packet": "^1.3.1", @@ -7956,69 +16956,50 @@ "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", "dev": true }, - "nan": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", - "dev": true, - "optional": true + "nanocolors": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.1.12.tgz", + "integrity": "sha512-2nMHqg1x5PU+unxX7PGY7AuYxl2qDx7PSrTRjizr8sxdd3l/3hBuWWaki62qmtYm2U5i4Z5E7GbjlyDFhs9/EQ==", + "dev": true }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=", - "dev": true, + "nanoid": { + "version": "3.1.25", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", + "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", + "dev": true + }, + "needle": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", + "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", + "optional": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" }, "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "optional": true, "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" + "ms": "^2.1.1" } }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "optional": true } } }, - "native-request": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/native-request/-/native-request-1.0.8.tgz", - "integrity": "sha512-vU2JojJVelUGp6jRcLwToPoWGxSx23z/0iX+I77J3Ht17rf2INGjrhOoQnjVo60nQd8wVsgzKkPfRXBiVdD2ag==", - "optional": true - }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs=", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", "dev": true }, "neo-async": { @@ -8027,19 +17008,27 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha1-ozeKdpbOfSI+iPybdkvX7xCJ42Y=", - "dev": true + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" }, "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "dev": true, "requires": { - "lower-case": "^1.1.1" + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "dev": true + } } }, "node-forge": { @@ -8051,7 +17040,7 @@ "node-libs-browser": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha1-tk9RPRgzhiX5A0bSew0jXmMfZCU=", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", "dev": true, "requires": { "assert": "^1.1.1", @@ -8090,12 +17079,6 @@ "isarray": "^1.0.0" } }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, "path-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", @@ -8192,18 +17175,26 @@ "util": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha1-MjZzNyDsZLsn9uJvQhqqLhtYjWE=", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", "dev": true, "requires": { "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } } } } }, "node-notifier": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-9.0.0.tgz", - "integrity": "sha512-SkwNwGnMMlSPrcoeH4CSo9XyWe72acAHEJGDdPdB+CyBVHsIYaTQ4U/1wk3URsyzC75xZLg2vzU2YaALlqDF1Q==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-9.0.1.tgz", + "integrity": "sha512-fPNFIp2hF/Dq7qLDzSg4vZ0J4e9v60gJR+Qx7RbjbWqzPDdEqeVpEx5CFeDAELIl+A/woaaNn1fQ5nEVerMxJg==", "dev": true, "requires": { "growly": "^1.3.0", @@ -8214,28 +17205,10 @@ "which": "^2.0.2" }, "dependencies": { - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -8246,26 +17219,15 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } }, "node-releases": { - "version": "1.1.70", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.70.tgz", - "integrity": "sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw==", + "version": "1.1.76", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.76.tgz", + "integrity": "sha512-9/IECtNr8dXNmPWmFXepT0/7o5eolGesHUa3mtr0KlgnCvnZxwh2qensKL42JJY2vQKC3nIBXetFAqR+PW1CmA==", "dev": true }, - "node-uuid": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", - "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=" - }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -8278,117 +17240,39 @@ "dev": true }, "normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", "dev": true }, "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "requires": { - "path-key": "^2.0.0" - }, - "dependencies": { - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - } + "path-key": "^3.0.0" } }, "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", "dev": true, "requires": { - "boolbase": "~1.0.0" + "boolbase": "^1.0.0" } }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - }, - "nwmatcher": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", - "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==" - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - } - } - }, "object-inspect": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", @@ -8398,7 +17282,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.4.tgz", "integrity": "sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg==", - "dev": true, "requires": { "call-bind": "^1.0.0", "define-properties": "^1.1.3" @@ -8409,15 +17292,6 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=" }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, "object.assign": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", @@ -8429,69 +17303,12 @@ "object-keys": "^1.1.1" } }, - "object.getownpropertydescriptors": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz", - "integrity": "sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - } - }, - "object.omit": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-3.0.0.tgz", - "integrity": "sha512-EO+BCv6LJfu+gBIF3ggLicFebFLN5zqzz/WWJlMFfkMyGth+oBkhxzDl0wx2W4GkLzuQs/FsSkXZb2IMWQqmBQ==", - "dev": true, - "requires": { - "is-extendable": "^1.0.0" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "object.values": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.2.tgz", - "integrity": "sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "has": "^1.0.3" - } - }, "obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha1-Cb6jND1BhZ69RGKS0RydTbYZCE4=", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "dev": true }, - "omggif": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.7.tgz", - "integrity": "sha1-WdLuywJj3oRjWz/riHwMmXPx5J0=" - }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -8504,7 +17321,7 @@ "on-headers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha1-dysK5qqlJcOZ5Imt+tkMQD6zwo8=", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", "dev": true }, "once": { @@ -8515,23 +17332,24 @@ "wrappy": "1" } }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha1-/HFk+rVtI1kExRw7J9pnWMo7m/w=", + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "requires": { - "is-wsl": "^1.1.0" + "mimic-fn": "^2.1.0" } }, - "optimize-css-assets-webpack-plugin": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz", - "integrity": "sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A==", + "open": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/open/-/open-8.2.1.tgz", + "integrity": "sha512-rXILpcQlkF/QuFez2BJDf3GsqpjGKbkUUToAIGo9A0Q6ZkoSGogZJulrUdwRkrAsoQvoZsrjCYt8+zblOk7JQQ==", "dev": true, "requires": { - "cssnano": "^4.1.10", - "last-call-webpack-plugin": "^3.0.0" + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" } }, "optionator": { @@ -8547,34 +17365,30 @@ "word-wrap": "~1.2.3" } }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha1-5EKmHP/hxf0gpl8yYcJmY7MD8l8=", - "dev": true, - "requires": { - "url-parse": "^1.4.3" - } - }, "os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" }, "p-cancelable": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", - "integrity": "sha1-NfNj1n1SCByNlYXje8zrfgu8sqA=" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==" + }, + "p-event": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", + "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", + "dev": true, + "requires": { + "p-timeout": "^3.1.0" + } }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "p-is-promise": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", - "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=" + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true }, "p-limit": { "version": "2.3.0", @@ -8595,9 +17409,9 @@ } }, "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, "requires": { "aggregate-error": "^3.0.0" @@ -8609,18 +17423,20 @@ "integrity": "sha1-SxoROZoRUgpneQ7loMHViB1r7+k=" }, "p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", + "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==", "dev": true, "requires": { - "retry": "^0.12.0" + "@types/retry": "^0.12.0", + "retry": "^0.13.1" } }, "p-timeout": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", - "integrity": "sha1-2N0ZeVldLcATnh/ka4tkbLPN8Dg=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "dev": true, "requires": { "p-finally": "^1.0.0" } @@ -8649,56 +17465,31 @@ "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-4.6.3.tgz", "integrity": "sha1-dC5eqql/psfhNY0pNNjxj0Su54E=" }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha1-kEnKN9bLIYLDsdLHIL6U0UpYFPw=", + "param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", "dev": true, "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" + "dot-case": "^3.0.4", + "tslib": "^2.0.3" }, "dependencies": { - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } } } }, - "param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "requires": { - "no-case": "^2.2.0" + "callsites": "^3.0.0" } }, "parents": { @@ -8722,49 +17513,56 @@ } }, "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "requires": { + "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" } }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==" }, "parse5": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", - "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=" + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "dev": true + } + } }, "path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -8776,12 +17574,6 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -8805,21 +17597,10 @@ "dev": true }, "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true }, "pbkdf2": { "version": "3.1.1", @@ -8833,10 +17614,38 @@ "sha.js": "^2.4.8" } }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + "pdfkit": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/pdfkit/-/pdfkit-0.12.3.tgz", + "integrity": "sha512-+qDLgm2yq6WOKcxTb43lDeo3EtMIDQs0CK1RNqhHC9iT6u0KOmgwAClkYh9xFw2ATbmUZzt4f7KMwDCOfPDluA==", + "requires": { + "crypto-js": "^4.0.0", + "fontkit": "^1.8.1", + "linebreak": "^1.0.2", + "png-js": "^1.0.0" + } + }, + "pdfmake": { + "version": "0.1.72", + "resolved": "https://registry.npmjs.org/pdfmake/-/pdfmake-0.1.72.tgz", + "integrity": "sha512-xZrPS+Safjf1I8ZYtMoXX83E6C6Pd1zFwa168yNTeeJWHclqf1z9DoYajjlY2uviN7gGyxwVZeou39uSk1oh1g==", + "requires": { + "iconv-lite": "^0.6.2", + "linebreak": "^1.0.2", + "pdfkit": "^0.12.0", + "svg-to-pdfkit": "^0.1.8", + "xmldoc": "^1.1.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } }, "performance-now": { "version": "2.1.0", @@ -8844,57 +17653,11 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "optional": true }, - "phantomjs": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/phantomjs/-/phantomjs-2.1.7.tgz", - "integrity": "sha1-xpEPZ5NcNyhbYRQyn8LyfV8+MTQ=", - "requires": { - "extract-zip": "~1.5.0", - "fs-extra": "~0.26.4", - "hasha": "^2.2.0", - "kew": "~0.7.0", - "progress": "~1.1.8", - "request": "~2.67.0", - "request-progress": "~2.0.1", - "which": "~1.2.2" - }, - "dependencies": { - "fs-extra": { - "version": "0.26.7", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz", - "integrity": "sha1-muH92UiXeY7at20JGM9C0MMYT6k=", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "which": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", - "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", - "requires": { - "isexe": "^2.0.0" - } - } - } - }, "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true, - "optional": true + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true }, "pify": { "version": "2.3.0", @@ -8923,6 +17686,11 @@ "find-up": "^4.0.0" } }, + "png-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/png-js/-/png-js-1.0.0.tgz", + "integrity": "sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g==" + }, "portfinder": { "version": "1.0.28", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", @@ -8960,20 +17728,202 @@ } } }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "postcss": { + "version": "8.3.7", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.7.tgz", + "integrity": "sha512-9SaY7nnyQ63/WittqZYAvkkYPyKxchMKH71UDzeTmWuLSvxTRpeEeABZAzlCi55cuGcoFyoV/amX2BdsafQidQ==", + "dev": true, + "requires": { + "nanocolors": "^0.1.5", + "nanoid": "^3.1.25", + "source-map-js": "^0.6.2" + } + }, + "postcss-calc": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.0.0.tgz", + "integrity": "sha512-5NglwDrcbiy8XXfPM11F3HeC6hoT9W7GUH/Zi5U/p7u3Irv4rHhdDcIZwG0llHXV4ftsBjpfWMXAnXNl4lnt8g==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "postcss-colormin": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.2.0.tgz", + "integrity": "sha512-+HC6GfWU3upe5/mqmxuqYZ9B2Wl4lcoUUNkoaX59nEWV4EtADCMiBqui111Bu8R8IvaZTmqmxrqOAqjbHIwXPw==", + "dev": true, + "requires": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0", + "colord": "^2.0.1", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-convert-values": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.0.1.tgz", + "integrity": "sha512-C3zR1Do2BkKkCgC0g3sF8TS0koF2G+mN8xxayZx3f10cIRmTaAnpgpRQZjNekTZxM2ciSPoh2IWJm0VZx8NoQg==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-discard-comments": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.0.1.tgz", + "integrity": "sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg==", "dev": true }, - "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "postcss-discard-duplicates": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.1.tgz", + "integrity": "sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA==", + "dev": true + }, + "postcss-discard-empty": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.0.1.tgz", + "integrity": "sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw==", + "dev": true + }, + "postcss-discard-overridden": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.0.1.tgz", + "integrity": "sha512-Y28H7y93L2BpJhrdUR2SR2fnSsT+3TVx1NmVQLbcnZWwIUpJ7mfcTC6Za9M2PG6w8j7UQRfzxqn8jU2VwFxo3Q==", + "dev": true + }, + "postcss-load-config": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.0.tgz", + "integrity": "sha512-ipM8Ds01ZUophjDTQYSVP70slFSYg3T0/zyfII5vzhN6V57YSxMgG5syXuwi5VtS8wSf3iL30v0uBdoIVx4Q0g==", + "dev": true, "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "import-cwd": "^3.0.0", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + } + }, + "postcss-loader": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.1.1.tgz", + "integrity": "sha512-lBmJMvRh1D40dqpWKr9Rpygwxn8M74U9uaCSeYGNKLGInbk9mXBt1ultHf2dH9Ghk6Ue4UXlXWwGMH9QdUJ5ug==", + "dev": true, + "requires": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.4", + "semver": "^7.3.5" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "postcss-merge-longhand": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.0.2.tgz", + "integrity": "sha512-BMlg9AXSI5G9TBT0Lo/H3PfUy63P84rVz3BjCFE9e9Y9RXQZD3+h3YO1kgTNsNJy7bBc1YQp8DmSnwLIW5VPcw==", + "dev": true, + "requires": { + "css-color-names": "^1.0.1", + "postcss-value-parser": "^4.1.0", + "stylehacks": "^5.0.1" + } + }, + "postcss-merge-rules": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.0.2.tgz", + "integrity": "sha512-5K+Md7S3GwBewfB4rjDeol6V/RZ8S+v4B66Zk2gChRqLTCC8yjnHQ601omj9TKftS19OPGqZ/XzoqpzNQQLwbg==", + "dev": true, + "requires": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^2.0.1", + "postcss-selector-parser": "^6.0.5", + "vendors": "^1.0.3" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", + "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + } + } + }, + "postcss-minify-font-values": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.0.1.tgz", + "integrity": "sha512-7JS4qIsnqaxk+FXY1E8dHBDmraYFWmuL6cgt0T1SWGRO5bzJf8sUoelwa4P88LEWJZweHevAiDKxHlofuvtIoA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-minify-gradients": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.0.2.tgz", + "integrity": "sha512-7Do9JP+wqSD6Prittitt2zDLrfzP9pqKs2EcLX7HJYxsxCOwrrcLt4x/ctQTsiOw+/8HYotAoqNkrzItL19SdQ==", + "dev": true, + "requires": { + "colord": "^2.6", + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-minify-params": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.0.1.tgz", + "integrity": "sha512-4RUC4k2A/Q9mGco1Z8ODc7h+A0z7L7X2ypO1B6V8057eVK6mZ6xwz6QN64nHuHLbqbclkX1wyzRnIrdZehTEHw==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.2", + "browserslist": "^4.16.0", + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0", + "uniqs": "^2.0.0" + } + }, + "postcss-minify-selectors": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.1.0.tgz", + "integrity": "sha512-NzGBXDa7aPsAcijXZeagnJBKBPMYLaJJzB8CQh6ncvyl2sIndLVWfbcDi0SBjRWk5VqEjXvf8tYwzoKf4Z07og==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.2", + "postcss-selector-parser": "^6.0.5" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", + "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "requires": { + "postcss": "^7.0.5" }, "dependencies": { "ansi-styles": { @@ -9004,6 +17954,16 @@ } } }, + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -9019,267 +17979,6 @@ } } }, - "postcss-calc": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", - "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", - "dev": true, - "requires": { - "postcss": "^7.0.27", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.2" - } - }, - "postcss-colormin": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", - "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "color": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-convert-values": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", - "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-discard-comments": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", - "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-discard-duplicates": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", - "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-discard-empty": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", - "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-discard-overridden": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", - "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-load-config": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", - "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", - "dev": true, - "requires": { - "cosmiconfig": "^5.0.0", - "import-cwd": "^2.0.0" - } - }, - "postcss-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", - "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "postcss": "^7.0.0", - "postcss-load-config": "^2.0.0", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "postcss-merge-longhand": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", - "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", - "dev": true, - "requires": { - "css-color-names": "0.0.4", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "stylehacks": "^4.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-merge-rules": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", - "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "cssnano-util-same-parent": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0", - "vendors": "^1.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "postcss-minify-font-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", - "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-minify-gradients": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", - "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "is-color-stop": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-minify-params": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", - "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "browserslist": "^4.0.0", - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "uniqs": "^2.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-minify-selectors": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", - "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "postcss-modules-extract-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", - "requires": { - "postcss": "^7.0.5" - } - }, "postcss-modules-local-by-default": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", @@ -9289,6 +17988,59 @@ "postcss": "^7.0.32", "postcss-selector-parser": "^6.0.2", "postcss-value-parser": "^4.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-modules-scope": { @@ -9298,6 +18050,59 @@ "requires": { "postcss": "^7.0.6", "postcss-selector-parser": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-modules-values": { @@ -9307,220 +18112,173 @@ "requires": { "icss-utils": "^4.0.0", "postcss": "^7.0.6" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-normalize-charset": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", - "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.0.1.tgz", + "integrity": "sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg==", + "dev": true }, "postcss-normalize-display-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", - "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.1.tgz", + "integrity": "sha512-uupdvWk88kLDXi5HEyI9IaAJTE3/Djbcrqq8YgjvAVuzgVuqIk3SuJWUisT2gaJbZm1H9g5k2w1xXilM3x8DjQ==", "dev": true, "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" } }, "postcss-normalize-positions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", - "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.0.1.tgz", + "integrity": "sha512-rvzWAJai5xej9yWqlCb1OWLd9JjW2Ex2BCPzUJrbaXmtKtgfL8dBMOOMTX6TnvQMtjk3ei1Lswcs78qKO1Skrg==", "dev": true, "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } + "postcss-value-parser": "^4.1.0" } }, "postcss-normalize-repeat-style": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", - "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.1.tgz", + "integrity": "sha512-syZ2itq0HTQjj4QtXZOeefomckiV5TaUO6ReIEabCh3wgDs4Mr01pkif0MeVwKyU/LHEkPJnpwFKRxqWA/7O3w==", "dev": true, "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" } }, "postcss-normalize-string": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", - "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.0.1.tgz", + "integrity": "sha512-Ic8GaQ3jPMVl1OEn2U//2pm93AXUcF3wz+OriskdZ1AOuYV25OdgS7w9Xu2LO5cGyhHCgn8dMXh9bO7vi3i9pA==", "dev": true, "requires": { - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } + "postcss-value-parser": "^4.1.0" } }, "postcss-normalize-timing-functions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", - "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.1.tgz", + "integrity": "sha512-cPcBdVN5OsWCNEo5hiXfLUnXfTGtSFiBU9SK8k7ii8UD7OLuznzgNRYkLZow11BkQiiqMcgPyh4ZqXEEUrtQ1Q==", "dev": true, "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" } }, "postcss-normalize-unicode": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", - "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.1.tgz", + "integrity": "sha512-kAtYD6V3pK0beqrU90gpCQB7g6AOfP/2KIPCVBKJM2EheVsBQmx/Iof+9zR9NFKLAx4Pr9mDhogB27pmn354nA==", "dev": true, "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } + "browserslist": "^4.16.0", + "postcss-value-parser": "^4.1.0" } }, "postcss-normalize-url": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", - "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.0.2.tgz", + "integrity": "sha512-k4jLTPUxREQ5bpajFQZpx8bCF2UrlqOTzP9kEqcEnOfwsRshWs2+oAFIHfDQB8GO2PaUaSE0NlTAYtbluZTlHQ==", "dev": true, "requires": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } + "is-absolute-url": "^3.0.3", + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.1.0" } }, "postcss-normalize-whitespace": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", - "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.1.tgz", + "integrity": "sha512-iPklmI5SBnRvwceb/XH568yyzK0qRVuAG+a1HFUsFRf11lEJTiQQa03a4RSCQvLKdcpX7XsI1Gen9LuLoqwiqA==", "dev": true, "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } + "postcss-value-parser": "^4.1.0" } }, "postcss-ordered-values": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", - "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.0.2.tgz", + "integrity": "sha512-8AFYDSOYWebJYLyJi3fyjl6CqMEG/UVworjiyK1r573I56kb3e879sCJLGvR3merj+fAdPpVplXKQZv+ey6CgQ==", "dev": true, "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" } }, "postcss-reduce-initial": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", - "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.0.1.tgz", + "integrity": "sha512-zlCZPKLLTMAqA3ZWH57HlbCjkD55LX9dsRyxlls+wfuRfqCi5mSlZVan0heX5cHr154Dq9AfbH70LyhrSAezJw==", "dev": true, "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0" + "browserslist": "^4.16.0", + "caniuse-api": "^3.0.0" } }, "postcss-reduce-transforms": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", - "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.1.tgz", + "integrity": "sha512-a//FjoPeFkRuAguPscTVmRQUODP+f3ke2HqFNgGPwdYnpeC29RZdCBvGRGTsKpMURb/I3p6jdKoBQ2zI+9Q7kA==", "dev": true, "requires": { - "cssnano-util-get-match": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" } }, "postcss-selector-parser": { @@ -9535,34 +18293,36 @@ } }, "postcss-svgo": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", - "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.0.2.tgz", + "integrity": "sha512-YzQuFLZu3U3aheizD+B1joQ94vzPfE6BNUcSYuceNxlVnKKsOtdo6hL9/zyC168Q8EwfLSgaDSalsUGa9f2C0A==", "dev": true, "requires": { - "is-svg": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "svgo": "^1.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } + "postcss-value-parser": "^4.1.0", + "svgo": "^2.3.0" } }, "postcss-unique-selectors": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", - "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.0.1.tgz", + "integrity": "sha512-gwi1NhHV4FMmPn+qwBNuot1sG1t2OmacLQ/AX29lzyggnjd+MnVD5uqQmpXO3J17KGL2WAxQruj1qTd3H0gG/w==", "dev": true, "requires": { - "alphanum-sort": "^1.0.0", - "postcss": "^7.0.0", + "alphanum-sort": "^1.0.2", + "postcss-selector-parser": "^6.0.5", "uniqs": "^2.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", + "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + } } }, "postcss-value-parser": { @@ -9575,18 +18335,19 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" - }, "prettier": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha1-99f1/4qc2HKnvkyhQglZVqYHl8s=", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", "dev": true, "optional": true }, + "pretty-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", + "dev": true + }, "printj": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", @@ -9608,36 +18369,29 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" }, - "progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=" - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "promise-polyfill": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.1.0.tgz", - "integrity": "sha512-OzSf6gcCUQ01byV4BgwyUCswlaQQ6gzXc23aLQWhicvfX9kfsUiUhgt3CCQej8jDnl8/PhGF31JdHX2/MzF3WA==" - }, "proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha1-/cIzZQVEfT8vLGOO0nLK9hS7sr8=", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dev": true, "requires": { - "forwarded": "~0.1.2", + "forwarded": "0.2.0", "ipaddr.js": "1.9.1" + }, + "dependencies": { + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + } } }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "optional": true }, "pseudomap": { "version": "1.0.2", @@ -9645,6 +18399,11 @@ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", "dev": true }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, "public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", @@ -9669,60 +18428,21 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha1-NlE74karJ1cLGjdKXOJ4v9dDcM4=", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, "qs": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.1.tgz", - "integrity": "sha1-gB/uAw4LlFDWOFrcSKTMVbRK7fw=" - }, - "query-string": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha1-p4wBK3HBfgXy4/ojGd0zBoLvs8s=", - "requires": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true }, "querystring": { "version": "0.2.0", @@ -9734,12 +18454,27 @@ "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" + }, + "quote-stream": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz", + "integrity": "sha1-hJY/jJwmuULhU/7rU6rnRlK34LI=", + "requires": { + "buffer-equal": "0.0.1", + "minimist": "^1.1.3", + "through2": "^2.0.0" + } + }, "raf": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", @@ -9769,7 +18504,7 @@ "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE=", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true }, "raphael": { @@ -9783,7 +18518,7 @@ "raw-body": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha1-oc5vucm8NWylLoklarWQWeE9AzI=", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", "dev": true, "requires": { "bytes": "3.1.0", @@ -9795,7 +18530,7 @@ "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY=", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", "dev": true } } @@ -9822,34 +18557,21 @@ } }, "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" + "picomatch": "^2.2.1" } }, - "recast": { - "version": "0.11.23", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", - "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", + "rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", "dev": true, "requires": { - "ast-types": "0.9.6", - "esprima": "~3.1.0", - "private": "~0.1.5", - "source-map": "~0.5.0" - }, - "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true - } + "resolve": "^1.9.0" } }, "regenerate": { @@ -9859,19 +18581,18 @@ "dev": true }, "regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz", + "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", "dev": true, "requires": { - "regenerate": "^1.4.0" + "regenerate": "^1.4.2" } }, "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk=", - "dev": true + "integrity": "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk=" }, "regenerator-transform": { "version": "0.10.1", @@ -9884,42 +18605,10 @@ "private": "^0.1.6" } }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, "regexp.prototype.flags": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", - "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" @@ -9965,76 +18654,17 @@ "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", "dev": true }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha1-eC4NglwMWjuzlzH4Tv7mt0Lmsc4=", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, "replace-ext": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==" }, - "request": { - "version": "2.67.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.67.0.tgz", - "integrity": "sha1-ivdHgOK/EeoK6aqWXBHxGv0nJ0I=", - "requires": { - "aws-sign2": "~0.6.0", - "bl": "~1.0.0", - "caseless": "~0.11.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.0", - "forever-agent": "~0.6.1", - "form-data": "~1.0.0-rc3", - "har-validator": "~2.0.2", - "hawk": "~3.1.0", - "http-signature": "~1.1.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.7", - "node-uuid": "~1.4.7", - "oauth-sign": "~0.8.0", - "qs": "~5.2.0", - "stringstream": "~0.0.4", - "tough-cookie": "~2.2.0", - "tunnel-agent": "~0.4.1" - } - }, - "request-progress": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", - "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", - "requires": { - "throttleit": "^1.0.0" - } - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -10050,113 +18680,65 @@ "path-parse": "^1.0.6" } }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } + "resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "dependencies": { - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } + "resolve-from": "^5.0.0" } }, "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", + "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", "requires": { - "lowercase-keys": "^1.0.0" + "lowercase-keys": "^2.0.0" } }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=", - "dev": true + "restructure": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/restructure/-/restructure-0.5.4.tgz", + "integrity": "sha1-9U591WNZD7NP1r9Vh2EJrsyyjeg=", + "requires": { + "browserify-optional": "^1.0.0" + } }, "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true }, - "rgb-regex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", - "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", - "dev": true - }, - "rgba-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", - "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true }, "rgbcolor": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/rgbcolor/-/rgbcolor-1.0.1.tgz", - "integrity": "sha1-1lBezbMEplldom+ktDMHMGd1lF0=" + "integrity": "sha1-1lBezbMEplldom+ktDMHMGd1lF0=", + "optional": true }, "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, "requires": { "glob": "^7.1.3" } @@ -10170,13 +18752,13 @@ "inherits": "^2.0.1" } }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "requires": { - "aproba": "^1.1.1" + "queue-microtask": "^1.2.2" } }, "safe-buffer": { @@ -10184,15 +18766,6 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -10201,7 +18774,15 @@ "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=" + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "requires": { + "xmlchars": "^2.2.0" + } }, "schema-utils": { "version": "2.7.1", @@ -10213,6 +18794,20 @@ "ajv-keywords": "^3.5.2" } }, + "scope-analyzer": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/scope-analyzer/-/scope-analyzer-2.1.1.tgz", + "integrity": "sha512-azEAihtQ9mEyZGhfgTJy3IbOWEzeOrYbg7NcYEshPKnKd+LZmC3TNd5dmDxbLBsTG/JVWmCp+vDJ03vJjeXMHg==", + "requires": { + "array-from": "^2.1.1", + "dash-ast": "^1.0.0", + "es6-map": "^0.1.5", + "es6-set": "^0.1.5", + "es6-symbol": "^3.1.1", + "estree-is-function": "^1.0.0", + "get-assigned-identifiers": "^1.1.0" + } + }, "select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -10225,9 +18820,9 @@ "integrity": "sha1-Db43ffP5YWfEwWJgM+kkNy2O9E0=" }, "selfsigned": { - "version": "1.10.8", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", - "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", + "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", "dev": true, "requires": { "node-forge": "^0.10.0" @@ -10241,7 +18836,7 @@ "send": { "version": "0.17.1", "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha1-wdiwWfeQD3Rm3Uk4vcROEd2zdsg=", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", "dev": true, "requires": { "debug": "2.6.9", @@ -10262,15 +18857,15 @@ "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true } } }, "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, "requires": { "randombytes": "^2.1.0" @@ -10312,7 +18907,7 @@ "setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY=", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", "dev": true } } @@ -10320,7 +18915,7 @@ "serve-static": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk=", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", "dev": true, "requires": { "encodeurl": "~1.0.2", @@ -10329,24 +18924,6 @@ "send": "0.17.1" } }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha1-oY1AUw5vB95CKMfe/kInr4ytAFs=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - } - }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -10356,7 +18933,7 @@ "setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM=", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", "dev": true }, "sha.js": { @@ -10368,6 +18945,20 @@ "safe-buffer": "^5.0.1" } }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "shallow-copy": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", + "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=" + }, "shasum-object": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz", @@ -10404,13 +18995,13 @@ "shellwords": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha1-1rkYHBpI05cyTISHHvvPxz/AZUs=", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", "dev": true }, "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha1-oUEMLt2PB3sItOJTyOrPyvBXRhw=", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.4.tgz", + "integrity": "sha512-rqYhcAnZ6d/vTPGghdrw7iumdcbXpsk1b8IG/rz+VWV51DM0p7XCtMoJ3qhPLIbp3tvyt3pKRbaaEMZYpHto8Q==", "dev": true }, "simple-concat": { @@ -10418,27 +19009,10 @@ "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dev": true, - "requires": { - "is-arrayish": "^0.3.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true - } - } - }, "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, "slimscroll": { @@ -10452,109 +19026,6 @@ "util-extend": "^1.0.1" } }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - } - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "requires": { - "hoek": "2.x.x" - } - }, "sockjs": { "version": "0.3.21", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", @@ -10566,49 +19037,10 @@ "websocket-driver": "^0.7.4" } }, - "sockjs-client": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.0.tgz", - "integrity": "sha512-8Dt3BDi4FYNrCFGTL/HtwVzkARrENdwOUf1ZoW/9p3M8lZdFT35jVdrHza+qgxuG9H3/shR4cuX/X9umUrjP8Q==", - "dev": true, - "requires": { - "debug": "^3.2.6", - "eventsource": "^1.0.7", - "faye-websocket": "^0.11.3", - "inherits": "^2.0.4", - "json3": "^3.3.3", - "url-parse": "^1.4.7" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, - "sort-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", - "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", - "requires": { - "is-plain-obj": "^1.0.0" - } - }, "source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha1-OZO9hzv8SEecyp6jpUeDXHwVSzQ=", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", "dev": true }, "source-map": { @@ -10616,23 +19048,16 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha1-GQhmvs51U+H48mei7oLGBrVQmho=", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } + "source-map-js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", + "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", + "dev": true }, "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", + "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -10647,16 +19072,15 @@ } } }, - "source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "dev": true + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" }, "spdy": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha1-t09GYgOj7aRSwCSSuR+56EonZ3s=", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "dev": true, "requires": { "debug": "^4.1.0", @@ -10667,9 +19091,9 @@ }, "dependencies": { "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "dev": true, "requires": { "ms": "2.1.2" @@ -10678,7 +19102,7 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true } } @@ -10686,7 +19110,7 @@ "spdy-transport": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha1-ANSGOmQArXXfkzYaFghgXl3NzzE=", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "dev": true, "requires": { "debug": "^4.1.0", @@ -10698,9 +19122,9 @@ }, "dependencies": { "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "dev": true, "requires": { "ms": "2.1.2" @@ -10709,13 +19133,13 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -10740,42 +19164,6 @@ } } }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, "ssf": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz", @@ -10784,39 +19172,6 @@ "frac": "~1.1.2" } }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha1-+2YcC+8ps520B2nuOfpwCT1vaHc=", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } - } - }, - "ssri": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz", - "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1", - "minipass": "^3.1.1" - } - }, "stable": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", @@ -10829,66 +19184,79 @@ "integrity": "sha512-EeNzTVfj+1In7aSLPKDD03F/ly4RxEuF/EX0YcOG0cKoPXs+SLZxDawQbexQDBzwROs4VKLWTOaZQlZkGBFEIQ==", "optional": true }, - "stackframe": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", - "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, + "static-eval": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.0.tgz", + "integrity": "sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw==", "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" + "escodegen": "^1.11.1" + } + }, + "static-module": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/static-module/-/static-module-3.0.4.tgz", + "integrity": "sha512-gb0v0rrgpBkifXCa3yZXxqVmXDVE+ETXj6YlC/jt5VzOnGXR2C15+++eXuMDUYsePnbhf+lwW0pE1UXyOLtGCw==", + "requires": { + "acorn-node": "^1.3.0", + "concat-stream": "~1.6.0", + "convert-source-map": "^1.5.1", + "duplexer2": "~0.1.4", + "escodegen": "^1.11.1", + "has": "^1.0.1", + "magic-string": "0.25.1", + "merge-source-map": "1.0.4", + "object-inspect": "^1.6.0", + "readable-stream": "~2.3.3", + "scope-analyzer": "^2.0.1", + "shallow-copy": "~0.0.1", + "static-eval": "^2.0.5", + "through2": "~2.0.3" }, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "requires": { - "is-descriptor": "^0.1.0" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, + "merge-source-map": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz", + "integrity": "sha1-pd5GU42uhNQRTMXqArR3KmNGcB8=", "requires": { - "kind-of": "^3.0.2" + "source-map": "^0.5.6" } }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "requires": { - "kind-of": "^3.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } + "safe-buffer": "~5.1.0" } } } @@ -10899,6 +19267,15 @@ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", "dev": true }, + "std-env": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-2.3.0.tgz", + "integrity": "sha512-4qT5B45+Kjef2Z6pE0BkskzsH0GO7GrND0wGlTM1ioUe3v0dGYx9ZJH0Aro/YyA8fqQ5EyIKDRjZojJYMFTflw==", + "dev": true, + "requires": { + "ci-info": "^3.0.0" + } + }, "stream-browserify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", @@ -10942,16 +19319,6 @@ "readable-stream": "^2.0.2" } }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha1-6+J6DDibBPvMIzZClS4Qcxr6m64=", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, "stream-http": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.1.tgz", @@ -10988,12 +19355,6 @@ } } }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha1-1wiCgVWasneEJCebCHfaPDktWj0=", - "dev": true - }, "stream-splicer": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz", @@ -11003,39 +19364,35 @@ "readable-stream": "^2.0.2" } }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" - }, "string-natural-compare": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-2.0.3.tgz", "integrity": "sha1-nb4d1lSQpf4U96XJvGhvxny5xuQ=" }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^5.0.1" } } } @@ -11063,70 +19420,69 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" }, - "stringstream": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", - "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==" - }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, "requires": { "ansi-regex": "^2.0.0" } }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, "style-loader": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", - "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz", + "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==", "dev": true, "requires": { - "loader-utils": "^1.1.0", - "schema-utils": "^1.0.0" + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" }, "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", "dev": true, "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" } } } }, "stylehacks": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", - "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.0.1.tgz", + "integrity": "sha512-Es0rVnHIqbWzveU1b24kbw92HsebBepxfcqe5iix7t9j0PQqhs0IxXVXv0pY2Bxa08CgMkzD6OWql7kbGOuEdA==", "dev": true, "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } + "browserslist": "^4.16.0", + "postcss-selector-parser": "^6.0.4" } }, "subarg": { @@ -11140,7 +19496,8 @@ "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true }, "svg-pathdata": { "version": "5.0.5", @@ -11148,64 +19505,34 @@ "integrity": "sha512-TAAvLNSE3fEhyl/Da19JWfMAdhSXTYeviXsLSoDT1UM76ADj5ndwAPX1FKQEgB/gFMPavOy6tOqfalXKUiXrow==", "optional": true }, + "svg-to-pdfkit": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/svg-to-pdfkit/-/svg-to-pdfkit-0.1.8.tgz", + "integrity": "sha512-QItiGZBy5TstGy+q8mjQTMGRlDDOARXLxH+sgVm1n/LYeo0zFcQlcCh8m4zi8QxctrxB9Kue/lStc/RD5iLadQ==", + "requires": { + "pdfkit": ">=0.8.1" + } + }, "svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.7.0.tgz", + "integrity": "sha512-aDLsGkre4fTDCWvolyW+fs8ZJFABpzLXbtdK1y71CKnHzAnpDxKXPj2mNKj+pyOXUCzFHzuxRJ94XOFygOWV3w==", "dev": true, "requires": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "nanocolors": "^0.1.12", + "stable": "^0.1.8" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true } } }, @@ -11223,77 +19550,95 @@ } }, "tableexport.jquery.plugin": { - "version": "1.10.21", - "resolved": "https://registry.npmjs.org/tableexport.jquery.plugin/-/tableexport.jquery.plugin-1.10.21.tgz", - "integrity": "sha512-mLzuFmL1zo1hBjGqdG0Ico92LQOHo7AECHhe+GFyywdTBE6fWX93Ww9pKhWJW3MqzRghJYl4cEGz1a9KjppiUw==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/tableexport.jquery.plugin/-/tableexport.jquery.plugin-1.20.0.tgz", + "integrity": "sha512-B8BfbFLlXjYIFvqUv6sdavrqwpReGPS/hE2Xl/hdwTrtU/YstWZNZIM4w4g52J9lhXCpqZg+xwsV7MJV2lmmqA==", "requires": { "es6-promise": ">=4.2.4", - "file-saver": ">=1.2.0", - "html2canvas": ">=0.5.0-beta4", + "file-saver": ">=2.0.1", + "html2canvas": ">=1.0.0", "jquery": ">=1.9.1", - "jspdf": ">=1.3.4", - "jspdf-autotable": "2.0.14 || 2.0.17", - "xlsx": ">=0.12.5" + "jspdf": ">=2.0.0", + "pdfmake": "^0.1.71", + "xlsx": ">=0.16.0" } }, "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true }, "terser": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz", - "integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz", + "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", "dev": true, "requires": { - "commander": "^2.19.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.10" + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" }, "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true } } }, "terser-webpack-plugin": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.8.tgz", - "integrity": "sha512-/fKw3R+hWyHfYx7Bv6oPqmk4HGQcrWLtV3X6ggvPuwPNHSnzvVV51z6OaaCOus4YLjutYGOz3pEpbhe6Up2s1w==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.4.tgz", + "integrity": "sha512-E2CkNMN+1cho04YpdANyRrn8CyN4yMy+WdFKZIySFZrGXZxJwJP6PMNGGc/Mcr6qygQHUUqRxnAPmi0M9f00XA==", "dev": true, "requires": { - "cacache": "^13.0.1", - "find-cache-dir": "^3.3.1", - "jest-worker": "^25.4.0", - "p-limit": "^2.3.0", - "schema-utils": "^2.6.6", - "serialize-javascript": "^4.0.0", + "jest-worker": "^27.0.6", + "p-limit": "^3.1.0", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", "source-map": "^0.6.1", - "terser": "^4.6.12", - "webpack-sources": "^1.4.3" + "terser": "^5.7.2" }, "dependencies": { + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true - }, - "terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - } } } }, @@ -11302,10 +19647,19 @@ "resolved": "https://registry.npmjs.org/tether/-/tether-1.4.7.tgz", "integrity": "sha1-1WqBhZDY/nLjh/d6Z/k6uW2OH7I=" }, - "throttleit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", - "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=" + "text-segmentation": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.2.tgz", + "integrity": "sha512-uTqvLxdBrVnx/CFQOtnf8tfzSXFm+1Qxau7Xi54j4OPTZokuDOX8qncQzrg2G8ZicAMOM8TgzFAYTb+AqNO4Cw==", + "requires": { + "utrie": "^1.0.1" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true }, "through": { "version": "2.3.8", @@ -11353,14 +19707,9 @@ "thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha1-Wrr3FKlAXbBQRzK7zNLO3Z75U30=", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" - }, "timers-browserify": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", @@ -11375,6 +19724,11 @@ "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", "dev": true }, + "tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==" + }, "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", @@ -11387,73 +19741,52 @@ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", "dev": true }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "is-number": "^7.0.0" } }, "toidentifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM=", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", "dev": true }, "tough-cookie": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.2.tgz", - "integrity": "sha1-yDoYMPTl7wuT7yo0iOck+N4Basc=" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + } + } }, "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "requires": { + "punycode": "^2.1.1" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + } + } }, "tslib": { "version": "1.14.1", @@ -11465,15 +19798,10 @@ "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==" }, - "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=" - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" }, "type-check": { "version": "0.3.2", @@ -11483,10 +19811,16 @@ "prelude-ls": "~1.1.2" } }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha1-TlUs0F3wlGfcvE73Od6J8s83wTE=", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, "requires": { "media-typer": "0.3.0", @@ -11498,30 +19832,6 @@ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, - "uglify-js": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", - "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", - "dev": true, - "requires": { - "commander": "~2.19.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, "umd": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", @@ -11540,43 +19850,72 @@ } }, "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", "dev": true }, "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" } }, "unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", "dev": true }, + "unicode-properties": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.3.1.tgz", + "integrity": "sha512-nIV3Tf3LcUEZttY/2g4ZJtGXhWwSkuLL+rCu0DIAMbjyVPj+8j5gNVz4T/sVbnQybIsd5SFGkPKg/756OY6jlA==", + "requires": { + "base64-js": "^1.3.0", + "unicode-trie": "^2.0.0" + }, + "dependencies": { + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=" + }, + "unicode-trie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", + "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", + "requires": { + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" + } + } + } + }, "unicode-property-aliases-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", "dev": true }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha1-C2/nuDWuzaYcbqTU8CwUIh4QmEc=", - "dev": true, + "unicode-trie": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-1.0.0.tgz", + "integrity": "sha512-v5raLKsobbFbWLMoX9+bChts/VhPPj3XpkNr/HbqkirXR1DPk8eo9IYKyvk0MQZFkaoRsFj2Rmaqgi2rfAZYtA==", "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" + }, + "dependencies": { + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=" + } } }, "uniq": { @@ -11590,29 +19929,10 @@ "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", "dev": true }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha1-HWl2k2mtoFgxA6HmrodoG1ZXMjA=", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha1-uqvOkQg/xk6UWw861hPiZPfNTmw=", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY=", - "dev": true + "integrity": "sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY=" }, "unpipe": { "version": "1.0.0", @@ -11620,64 +19940,6 @@ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "dev": true }, - "unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha1-j2bbzVWog6za5ECK+LA1pQRMGJQ=", - "dev": true - }, - "upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", - "dev": true - }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -11693,12 +19955,6 @@ } } }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, "url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", @@ -11715,35 +19971,6 @@ } } }, - "url-parse": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", - "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "requires": { - "prepend-http": "^2.0.0" - } - }, - "url-to-options": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", - "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=", - "dev": true - }, "util": { "version": "0.12.3", "resolved": "https://registry.npmjs.org/util/-/util-0.12.3.tgz", @@ -11767,55 +19994,37 @@ "resolved": "https://registry.npmjs.org/util-extend/-/util-extend-1.0.3.tgz", "integrity": "sha1-p8IW0mdUUWljeztu3GypEZ4v+T8=" }, - "util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } - } - }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", "dev": true }, + "utrie": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.1.tgz", + "integrity": "sha512-JPaDXF3vzgZxfeEwutdGzlrNoVFL5UvZcbO6Qo9D4GoahrieUPoMU8GCpVpR7MQqcKhmShIh8VlbEN3PLM3EBg==", + "requires": { + "base64-arraybuffer": "^1.0.1" + }, + "dependencies": { + "base64-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.1.tgz", + "integrity": "sha512-vFIUq7FdLtjZMhATwDul5RZWv2jpXQ09Pd6jcVEOvIsqCWTRFD/ONHNfyOS8dA/Ippi5dsIgpyKWKZaAKZltbA==" + } + } + }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4=", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "dev": true }, "v8-compile-cache": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", - "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, "vary": { @@ -11827,26 +20036,9 @@ "vendors": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", - "integrity": "sha1-4rgApT56Kbk1BsPPQRANFsTErY4=", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", "dev": true }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } - } - }, "vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -11861,13 +20053,13 @@ "vue-hot-reload-api": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", - "integrity": "sha1-UylVzB6yCKPZkLOp+acFdGV+CPI=", + "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==", "dev": true }, "vue-loader": { - "version": "15.9.6", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.6.tgz", - "integrity": "sha512-j0cqiLzwbeImIC6nVIby2o/ABAWhlppyL/m5oJ67R5MloP0hj/DtFgb0Zmq3J9CG7AJ+AXIvHVnJAPBvrLyuDg==", + "version": "15.9.8", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.8.tgz", + "integrity": "sha512-GwSkxPrihfLR69/dSV3+5CdMQ0D+jXg8Ma1S4nQXKJAznYFX14vHdc/NetQc34Dw+rBbIJyP7JOuVb9Fhprvog==", "dev": true, "requires": { "@vue/component-compiler-utils": "^3.1.0", @@ -11878,17 +20070,17 @@ } }, "vue-resource": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/vue-resource/-/vue-resource-1.5.1.tgz", - "integrity": "sha1-Dz1oXjJU0hgAvr2Wbtz1bDSztuQ=", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/vue-resource/-/vue-resource-1.5.3.tgz", + "integrity": "sha512-REhTuEuYSpwmEH/VN4fgDQVC/VXxDK/xsguuiDPnINxOwy1s0CSu//p++osTUkiAXi6d/vptwBpb0AcBIDsXzw==", "requires": { - "got": "^8.0.3" + "got": ">=8.0 <12.0" } }, "vue-style-loader": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.2.tgz", - "integrity": "sha512-0ip8ge6Gzz/Bk0iHovU9XAUQaFt/G2B61bnWa2tCcqqdgfHs1lF9xXorFbE55Gmy92okFT+8bfmySuUOu13vxQ==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", + "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==", "dev": true, "requires": { "hash-sum": "^1.0.2", @@ -11908,863 +20100,248 @@ "vue-template-es2015-compiler": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", - "integrity": "sha1-HuO8mhbsv1EYvjNLsV+cRvgvWCU=", + "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", "dev": true }, - "watchpack": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", - "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", - "dev": true, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", "requires": { - "chokidar": "^3.4.1", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.1" - }, - "dependencies": { - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "optional": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "optional": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "optional": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", - "dev": true, - "optional": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "optional": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "optional": true - }, - "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "dev": true, - "optional": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "optional": true, - "requires": { - "is-number": "^7.0.0" - } - } + "browser-process-hrtime": "^1.0.0" } }, - "watchpack-chokidar2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", - "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", - "dev": true, - "optional": true, + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", "requires": { - "chokidar": "^2.1.8" + "xml-name-validator": "^3.0.0" + } + }, + "watchpack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz", + "integrity": "sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA==", + "dev": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" } }, "wbuf": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha1-wdjRSTFtPqhShIiVy2oL/oh7h98=", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "dev": true, "requires": { "minimalistic-assert": "^1.0.0" } }, "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" }, "webpack": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", - "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.53.0.tgz", + "integrity": "sha512-RZ1Z3z3ni44snoWjfWeHFyzvd9HMVYDYC5VXmlYUT6NWgEOWdCNpad5Fve2CzzHoRED7WtsKe+FCyP5Vk4pWiQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/wasm-edit": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.4.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", + "@types/eslint-scope": "^3.7.0", + "@types/estree": "^0.0.50", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.5.0", - "eslint-scope": "^4.0.3", + "enhanced-resolve": "^5.8.0", + "es-module-lexer": "^0.7.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.4", "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.3", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.7.4", - "webpack-sources": "^1.4.1" + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.2.0", + "webpack-sources": "^3.2.0" }, "dependencies": { + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, "acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", "dev": true }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" } }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "webpack-sources": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.1.tgz", + "integrity": "sha512-t6BMVLQ0AkjBOoRTZgqrWm7xbXMBzD+XDq2EZ96+vMfn3qKgsvdXZhbPZ4ElUOpdv4u+iiGe+w3+J75iy/bYGA==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - } - }, - "terser-webpack-plugin": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", - "dev": true, - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^4.0.0", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - } } } }, "webpack-cli": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", - "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.8.0.tgz", + "integrity": "sha512-+iBSWsX16uVna5aAYN6/wjhJy1q/GKk4KjKvfg90/6hykCTSgozbfz5iRgDTSJt/LgSbYxdBX3KBHeobIs+ZEw==", "dev": true, "requires": { - "chalk": "^2.4.2", - "cross-spawn": "^6.0.5", - "enhanced-resolve": "^4.1.1", - "findup-sync": "^3.0.0", - "global-modules": "^2.0.0", - "import-local": "^2.0.0", - "interpret": "^1.4.0", - "loader-utils": "^1.4.0", - "supports-color": "^6.1.0", - "v8-compile-cache": "^2.1.1", - "yargs": "^13.3.2" + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.0.4", + "@webpack-cli/info": "^1.3.0", + "@webpack-cli/serve": "^1.5.2", + "colorette": "^1.2.1", + "commander": "^7.0.0", + "execa": "^5.0.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "v8-compile-cache": "^2.2.0", + "webpack-merge": "^5.7.3" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } } } }, "webpack-dev-middleware": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", - "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.1.0.tgz", + "integrity": "sha512-oT660AR1gOnU/NTdUQi3EiGR0iXG7CFxmKsj3ylWCBA2khJ8LFHK+sKv3BZEsC11gl1eChsltRhzUq7nWj7XIQ==", "dev": true, "requires": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", + "colorette": "^1.2.2", + "memfs": "^3.2.2", + "mime-types": "^2.1.31", "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" + "schema-utils": "^3.1.0" }, "dependencies": { - "mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "requires": { - "minimist": "^1.2.5" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" } } } }, "webpack-dev-server": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", - "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.1.1.tgz", + "integrity": "sha512-Kl1mnCEw8Cy1Kw173gCxLIB242LfPKEOj9WoKhKz/MbryZTNrILzOJTk8kiczw/YUEPzn3gcltCQv6hDsLudRg==", "dev": true, "requires": { - "ansi-html": "0.0.7", + "ansi-html-community": "^0.0.8", "bonjour": "^3.5.0", - "chokidar": "^2.1.8", + "chokidar": "^3.5.1", + "colorette": "^1.2.2", "compression": "^1.7.4", "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", + "del": "^6.0.0", "express": "^4.17.1", - "html-entities": "^1.3.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.8", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.26", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.8", - "semver": "^6.3.0", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.0", + "internal-ip": "^6.2.0", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "portfinder": "^1.0.28", + "schema-utils": "^3.1.0", + "selfsigned": "^1.10.11", "serve-index": "^1.9.1", "sockjs": "^0.3.21", - "sockjs-client": "^1.5.0", "spdy": "^4.0.2", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", + "strip-ansi": "^7.0.0", "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "^13.3.2" + "webpack-dev-middleware": "^5.0.0", + "ws": "^8.1.0" }, "dependencies": { + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", - "dev": true - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true }, "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" } }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "dependencies": { - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "ansi-regex": "^6.0.1" } } } }, - "webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "dev": true, - "requires": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - } - }, "webpack-merge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", - "integrity": "sha1-onxS6ng9E5iv0gh/VH17nS9DY00=", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", "dev": true, "requires": { - "lodash": "^4.17.15" + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" } }, "webpack-notifier": { @@ -12778,18 +20355,18 @@ }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } } } @@ -12797,7 +20374,7 @@ "webpack-sources": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha1-7t2OwLko+/HL/plOItLYkPMwqTM=", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", "dev": true, "requires": { "source-list-map": "^2.0.0", @@ -12807,11 +20384,72 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, + "webpackbar": { + "version": "5.0.0-3", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.0-3.tgz", + "integrity": "sha512-viW6KCYjMb0NPoDrw2jAmLXU2dEOhRrtku28KmOfeE1vxbfwCYuTbTaMhnkrCZLFAFyY9Q49Z/jzYO80Dw5b8g==", + "dev": true, + "requires": { + "ansi-escapes": "^4.3.1", + "chalk": "^4.1.0", + "consola": "^2.15.0", + "figures": "^3.2.0", + "pretty-time": "^1.1.0", + "std-env": "^2.2.1", + "text-table": "^0.2.0", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "websocket-driver": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", @@ -12829,13 +20467,27 @@ "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true }, - "whatwg-url": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-2.0.1.tgz", - "integrity": "sha1-U5ayBD8CDub3BNnEXqhRnnJN5lk=", + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + }, + "whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" } }, "which": { @@ -12847,12 +20499,6 @@ "isexe": "^2.0.0" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, "which-typed-array": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.4.tgz", @@ -12867,34 +20513,35 @@ "is-typed-array": "^1.1.3" } }, + "wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, "wmf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz", "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==" }, "word": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz", - "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/word/-/word-0.4.0.tgz", + "integrity": "sha512-Aq84KjS7Z9HSU14qf4l/NEouaqfJAZtE9zEz7TIvw9V/3oJeUbjQwhz7ggqbL7I7REt4Bz+9HuCWsBO5N7xChw==", + "requires": { + "cfb": "^1.2.0", + "jsdom": "^16.2.2" + } }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha1-JqlMU5G7ypJhUgAvabhKS/dy5ag=", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { "ansi-styles": "^4.0.0", @@ -12903,9 +20550,9 @@ }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "ansi-styles": { @@ -12926,30 +20573,13 @@ "color-name": "~1.1.4" } }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } } } @@ -12960,36 +20590,28 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.2.tgz", + "integrity": "sha512-Q6B6H2oc8QY3llc3cB8kVmQ6pnJWVQbP7Q5algTcIxx7YEpc0oU4NBVHlztA7Ekzfhw2r0rPducMUiCGWKQRzw==", + "dev": true }, "xlsx": { - "version": "0.16.9", - "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.16.9.tgz", - "integrity": "sha512-gxi1I3EasYvgCX1vN9pGyq920Ron4NO8PNfhuoA3Hpq6Y8f0ECXiy4OLrK4QZBnj1jx3QD+8Fq5YZ/3mPZ5iXw==", + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.17.2.tgz", + "integrity": "sha512-RIhN6/oc/ZqYZqY4jz4AX92yNfULhtNrcZP1lknIcsyR+Ra8Zu/9F1lAZWncYbDex95iYQX/XNNNzNFXZjlNOQ==", "requires": { "adler-32": "~1.2.0", "cfb": "^1.1.4", - "codepage": "~1.14.0", + "codepage": "~1.15.0", "commander": "~2.17.1", "crc-32": "~1.2.0", "exit-on-epipe": "~1.0.1", "fflate": "^0.3.8", "ssf": "~0.11.2", "wmf": "~1.0.1", - "word": "~0.3.0" + "word": "~0.4.0" }, "dependencies": { - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" - }, "fflate": { "version": "0.3.11", "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.3.11.tgz", @@ -12998,14 +20620,22 @@ } }, "xml-name-validator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", - "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" }, - "xmldom": { - "version": "0.1.31", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", - "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==" + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "xmldoc": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-1.1.2.tgz", + "integrity": "sha512-ruPC/fyPNck2BD1dpz0AZZyrEwMOrWTO5lDdIXS91rs3wtm4j+T8Rp2o+zoOYkkAxJTZRPOSnOGei1egoRmKMQ==", + "requires": { + "sax": "^1.2.1" + } }, "xtend": { "version": "4.0.2", @@ -13013,87 +20643,49 @@ "integrity": "sha1-u3J3n1+kZRhrH0OPZ0+jR/2121Q=" }, "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true }, "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true }, "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.2.0.tgz", + "integrity": "sha512-UPeZv4h9Xv510ibpt5rdsUNzgD78nMa1rhxxCgvkKiq06hlKCEHJLiJ6Ub8zDg/wR6hedEI6ovnd2vCvJ4nusA==", "dev": true, "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" } }, "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true }, - "yauzl": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", - "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", - "requires": { - "fd-slicer": "~1.0.1" - } + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true } } } diff --git a/package.json b/package.json index 064898bb74..08a18509fb 100644 --- a/package.json +++ b/package.json @@ -1,58 +1,57 @@ { - "private": true, - "scripts": { - "dev": "npm run development", - "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --config=node_modules/laravel-mix/setup/webpack.config.js", - "watch": "npm run development -- --watch", - "watch-poll": "npm run watch -- --watch-poll", - "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --disable-host-check --config=node_modules/laravel-mix/setup/webpack.config.js", - "prod": "npm run production", - "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --config=node_modules/laravel-mix/setup/webpack.config.js" - }, - "engines": { - "node": ">=0.12" - }, - "devDependencies": { - "axios": "^0.20.0", - "babel-preset-latest": "^6.24.1", - "cross-env": "^7.0", - "jquery": "^3.5.1", - "laravel-mix": "^5.0.1", - "lodash": "^4.17.20", - "vue": "2.4.4", - "vue-loader": "^15.9.6", - "vue-template-compiler": "2.4.4" - }, - "dependencies": { - "@fortawesome/fontawesome-free": "^5.15.1", - "admin-lte": "^2.4.18", - "ajv": "^6.12.6", - "blueimp-file-upload": "^9.34.0", - "bootstrap": "^3.4.1", - "bootstrap-colorpicker": "^2.5.3", - "bootstrap-datepicker": "^1.9.0", - "bootstrap-less": "^3.3.8", - "bootstrap-table": "^1.18.0", - "chart.js": "^2.9.4", - "css-loader": "^3.6.0", - "ekko-lightbox": "^5.1.1", - "font-awesome": "^4.7.0", - "icheck": "^1.0.2", - "imagemin": "^5.3.1", - "jquery-form-validator": "^2.3.79", - "jquery-slimscroll": "^1.3.8", - "jquery-ui": "^1.12.1", - "jquery-ui-bundle": "^1.12.1", - "jquery.iframe-transport": "^1.0.0", - "less": "^3.13.1", - "less-loader": "^4.1.0", - "list.js": "^1.5.0", - "papaparse": "^4.3.3", - "phantomjs": "^2.1.7", - "select2": "4.0.13", - "sheetjs": "^2.0.0", - "tableexport.jquery.plugin": "^1.10.20", - "tether": "^1.4.0", - "vue-resource": "^1.3.3" - } + "private": true, + "scripts": { + "dev": "npm run development", + "development": "mix", + "watch": "mix watch", + "watch-poll": "mix watch -- --watch-options-poll=1000", + "hot": "mix watch --hot", + "prod": "npm run production", + "production": "mix --production" + }, + "engines": { + "node": ">=0.12" + }, + "devDependencies": { + "@fortawesome/fontawesome-free": "^5.15.4", + "axios": "^0.20.0", + "babel-preset-latest": "^6.24.1", + "jquery": "^3.6.0", + "laravel-mix": "^6.0.12", + "lodash": "^4.17.20", + "postcss": "^8.2.8", + "vue": "2.4.4", + "vue-loader": "^15.9.7", + "vue-template-compiler": "2.4.4" + }, + "dependencies": { + "admin-lte": "^2.4.18", + "ajv": "^6.12.6", + "blueimp-file-upload": "^9.34.0", + "bootstrap": "^3.4.1", + "bootstrap-colorpicker": "^2.5.3", + "bootstrap-datepicker": "^1.9.0", + "bootstrap-less": "^3.3.8", + "bootstrap-table": "^1.18.3", + "chart.js": "^2.9.4", + "css-loader": "^3.6.0", + "ekko-lightbox": "^5.1.1", + "font-awesome": "^4.7.0", + "icheck": "^1.0.2", + "imagemin": "^5.3.1", + "jquery-form-validator": "^2.3.79", + "jquery-slimscroll": "^1.3.8", + "jquery-ui": "^1.12.1", + "jquery-ui-bundle": "^1.12.1", + "jquery.iframe-transport": "^1.0.0", + "less": "^4.1.1", + "less-loader": "^5.0.0", + "list.js": "^1.5.0", + "papaparse": "^4.3.3", + "select2": "4.0.13", + "sheetjs": "^2.0.0", + "tableexport.jquery.plugin": "^1.10.26", + "tether": "^1.4.0", + "vue-resource": "^1.5.2" + } } diff --git a/public/.htaccess b/public/.htaccess index 5061585ade..34676618ed 100644 --- a/public/.htaccess +++ b/public/.htaccess @@ -5,6 +5,9 @@ RewriteEngine On + # Needed for https://letsencrypt.org/ certificates. + RewriteRule ^\.well-known/acme-challenge/ - [END] + # Uncomment these two lines to force SSL redirect in Apache # RewriteCond %{HTTPS} off # RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] @@ -33,3 +36,7 @@ Options -Indexes + + + Deny from all + diff --git a/public/css/build/AdminLTE.css b/public/css/build/AdminLTE.css index 9aeb043740..a774ea1a77 100644 Binary files a/public/css/build/AdminLTE.css and b/public/css/build/AdminLTE.css differ diff --git a/public/css/build/app.css b/public/css/build/app.css index a190092b6c..ffd9f4398b 100644 Binary files a/public/css/build/app.css and b/public/css/build/app.css differ diff --git a/public/css/build/fontawesome.css b/public/css/build/fontawesome.css new file mode 100644 index 0000000000..19b4368f94 Binary files /dev/null and b/public/css/build/fontawesome.css differ diff --git a/public/css/build/overrides.css b/public/css/build/overrides.css index 0e38d4e70c..2ce2c23272 100644 Binary files a/public/css/build/overrides.css and b/public/css/build/overrides.css differ diff --git a/public/css/dist/all.css b/public/css/dist/all.css index f290340fb2..d0ae4b8a21 100644 Binary files a/public/css/dist/all.css and b/public/css/dist/all.css differ diff --git a/public/css/dist/bootstrap-table.css b/public/css/dist/bootstrap-table.css index 7692a5ef27..c6485ceb43 100644 Binary files a/public/css/dist/bootstrap-table.css and b/public/css/dist/bootstrap-table.css differ diff --git a/public/css/dist/signature-pad.min.css b/public/css/dist/signature-pad.min.css index 7065929572..218b9c2365 100644 Binary files a/public/css/dist/signature-pad.min.css and b/public/css/dist/signature-pad.min.css differ diff --git a/public/css/dist/skins/skin-black-dark.css b/public/css/dist/skins/skin-black-dark.css index 83c0fae28f..308d6bcbdd 100644 Binary files a/public/css/dist/skins/skin-black-dark.css and b/public/css/dist/skins/skin-black-dark.css differ diff --git a/public/css/dist/skins/skin-black-dark.min.css b/public/css/dist/skins/skin-black-dark.min.css index 4525ec5b46..308d6bcbdd 100644 Binary files a/public/css/dist/skins/skin-black-dark.min.css and b/public/css/dist/skins/skin-black-dark.min.css differ diff --git a/public/css/dist/skins/skin-black.css b/public/css/dist/skins/skin-black.css index 65e7252612..5dc1130f96 100644 Binary files a/public/css/dist/skins/skin-black.css and b/public/css/dist/skins/skin-black.css differ diff --git a/public/css/dist/skins/skin-black.min.css b/public/css/dist/skins/skin-black.min.css index 438c6dbebf..5dc1130f96 100644 Binary files a/public/css/dist/skins/skin-black.min.css and b/public/css/dist/skins/skin-black.min.css differ diff --git a/public/css/dist/skins/skin-blue-dark.css b/public/css/dist/skins/skin-blue-dark.css index 617a453a4f..9c069b39b6 100644 Binary files a/public/css/dist/skins/skin-blue-dark.css and b/public/css/dist/skins/skin-blue-dark.css differ diff --git a/public/css/dist/skins/skin-blue-dark.min.css b/public/css/dist/skins/skin-blue-dark.min.css index 7a93f2ca41..9c069b39b6 100644 Binary files a/public/css/dist/skins/skin-blue-dark.min.css and b/public/css/dist/skins/skin-blue-dark.min.css differ diff --git a/public/css/dist/skins/skin-blue.css b/public/css/dist/skins/skin-blue.css index 82e1d08ea0..8c8066fa58 100644 Binary files a/public/css/dist/skins/skin-blue.css and b/public/css/dist/skins/skin-blue.css differ diff --git a/public/css/dist/skins/skin-blue.min.css b/public/css/dist/skins/skin-blue.min.css index 3509b8d78d..8c8066fa58 100644 Binary files a/public/css/dist/skins/skin-blue.min.css and b/public/css/dist/skins/skin-blue.min.css differ diff --git a/public/css/dist/skins/skin-contrast.css b/public/css/dist/skins/skin-contrast.css index 4112ec16d7..71ed3137b9 100644 Binary files a/public/css/dist/skins/skin-contrast.css and b/public/css/dist/skins/skin-contrast.css differ diff --git a/public/css/dist/skins/skin-contrast.min.css b/public/css/dist/skins/skin-contrast.min.css index 6162cbe4f6..71ed3137b9 100644 Binary files a/public/css/dist/skins/skin-contrast.min.css and b/public/css/dist/skins/skin-contrast.min.css differ diff --git a/public/css/dist/skins/skin-green-dark.css b/public/css/dist/skins/skin-green-dark.css index 3f01ca998d..ac683b4e8c 100644 Binary files a/public/css/dist/skins/skin-green-dark.css and b/public/css/dist/skins/skin-green-dark.css differ diff --git a/public/css/dist/skins/skin-green-dark.min.css b/public/css/dist/skins/skin-green-dark.min.css index afb0e10836..ac683b4e8c 100644 Binary files a/public/css/dist/skins/skin-green-dark.min.css and b/public/css/dist/skins/skin-green-dark.min.css differ diff --git a/public/css/dist/skins/skin-green.css b/public/css/dist/skins/skin-green.css index dbeb9379d6..ed5a829fe1 100644 Binary files a/public/css/dist/skins/skin-green.css and b/public/css/dist/skins/skin-green.css differ diff --git a/public/css/dist/skins/skin-green.min.css b/public/css/dist/skins/skin-green.min.css index d7605a7d86..ed5a829fe1 100644 Binary files a/public/css/dist/skins/skin-green.min.css and b/public/css/dist/skins/skin-green.min.css differ diff --git a/public/css/dist/skins/skin-orange-dark.css b/public/css/dist/skins/skin-orange-dark.css index f338d4646a..5f92b70f79 100644 Binary files a/public/css/dist/skins/skin-orange-dark.css and b/public/css/dist/skins/skin-orange-dark.css differ diff --git a/public/css/dist/skins/skin-orange-dark.min.css b/public/css/dist/skins/skin-orange-dark.min.css index 383d599336..5f92b70f79 100644 Binary files a/public/css/dist/skins/skin-orange-dark.min.css and b/public/css/dist/skins/skin-orange-dark.min.css differ diff --git a/public/css/dist/skins/skin-orange.css b/public/css/dist/skins/skin-orange.css index ae849dde50..7791e20be0 100644 Binary files a/public/css/dist/skins/skin-orange.css and b/public/css/dist/skins/skin-orange.css differ diff --git a/public/css/dist/skins/skin-orange.min.css b/public/css/dist/skins/skin-orange.min.css index d0dd393551..7791e20be0 100644 Binary files a/public/css/dist/skins/skin-orange.min.css and b/public/css/dist/skins/skin-orange.min.css differ diff --git a/public/css/dist/skins/skin-purple-dark.css b/public/css/dist/skins/skin-purple-dark.css index e24854ea58..406e570497 100644 Binary files a/public/css/dist/skins/skin-purple-dark.css and b/public/css/dist/skins/skin-purple-dark.css differ diff --git a/public/css/dist/skins/skin-purple-dark.min.css b/public/css/dist/skins/skin-purple-dark.min.css index a4d2d6c315..406e570497 100644 Binary files a/public/css/dist/skins/skin-purple-dark.min.css and b/public/css/dist/skins/skin-purple-dark.min.css differ diff --git a/public/css/dist/skins/skin-purple.css b/public/css/dist/skins/skin-purple.css index 89d76c0742..978009852b 100644 Binary files a/public/css/dist/skins/skin-purple.css and b/public/css/dist/skins/skin-purple.css differ diff --git a/public/css/dist/skins/skin-purple.min.css b/public/css/dist/skins/skin-purple.min.css index 07197e4d8b..978009852b 100644 Binary files a/public/css/dist/skins/skin-purple.min.css and b/public/css/dist/skins/skin-purple.min.css differ diff --git a/public/css/dist/skins/skin-red-dark.css b/public/css/dist/skins/skin-red-dark.css index 499aeea591..a07f9e52a6 100644 Binary files a/public/css/dist/skins/skin-red-dark.css and b/public/css/dist/skins/skin-red-dark.css differ diff --git a/public/css/dist/skins/skin-red-dark.min.css b/public/css/dist/skins/skin-red-dark.min.css index e6c50b8c81..a07f9e52a6 100644 Binary files a/public/css/dist/skins/skin-red-dark.min.css and b/public/css/dist/skins/skin-red-dark.min.css differ diff --git a/public/css/dist/skins/skin-red.css b/public/css/dist/skins/skin-red.css index d2fced6d22..5152b6f555 100644 Binary files a/public/css/dist/skins/skin-red.css and b/public/css/dist/skins/skin-red.css differ diff --git a/public/css/dist/skins/skin-red.min.css b/public/css/dist/skins/skin-red.min.css index 00ef63beff..5152b6f555 100644 Binary files a/public/css/dist/skins/skin-red.min.css and b/public/css/dist/skins/skin-red.min.css differ diff --git a/public/css/dist/skins/skin-yellow-dark.css b/public/css/dist/skins/skin-yellow-dark.css index cc0b6749fb..f742fa04f1 100644 Binary files a/public/css/dist/skins/skin-yellow-dark.css and b/public/css/dist/skins/skin-yellow-dark.css differ diff --git a/public/css/dist/skins/skin-yellow-dark.min.css b/public/css/dist/skins/skin-yellow-dark.min.css index 100ec919bc..f742fa04f1 100644 Binary files a/public/css/dist/skins/skin-yellow-dark.min.css and b/public/css/dist/skins/skin-yellow-dark.min.css differ diff --git a/public/css/dist/skins/skin-yellow.css b/public/css/dist/skins/skin-yellow.css index 625b700e65..c754cacf07 100644 Binary files a/public/css/dist/skins/skin-yellow.css and b/public/css/dist/skins/skin-yellow.css differ diff --git a/public/css/dist/skins/skin-yellow.min.css b/public/css/dist/skins/skin-yellow.min.css index 41ccb21972..c754cacf07 100644 Binary files a/public/css/dist/skins/skin-yellow.min.css and b/public/css/dist/skins/skin-yellow.min.css differ diff --git a/public/css/fonts/FontAwesome.otf b/public/css/fonts/FontAwesome.otf deleted file mode 100644 index 401ec0f36e..0000000000 Binary files a/public/css/fonts/FontAwesome.otf and /dev/null differ diff --git a/public/css/fonts/fa-brands-400.eot b/public/css/fonts/fa-brands-400.eot new file mode 100644 index 0000000000..cba6c6cce8 Binary files /dev/null and b/public/css/fonts/fa-brands-400.eot differ diff --git a/public/css/fonts/fa-brands-400.svg b/public/css/fonts/fa-brands-400.svg new file mode 100644 index 0000000000..b9881a43b7 Binary files /dev/null and b/public/css/fonts/fa-brands-400.svg differ diff --git a/public/css/fonts/fa-brands-400.ttf b/public/css/fonts/fa-brands-400.ttf new file mode 100644 index 0000000000..8d75deddae Binary files /dev/null and b/public/css/fonts/fa-brands-400.ttf differ diff --git a/public/css/fonts/fa-brands-400.woff b/public/css/fonts/fa-brands-400.woff new file mode 100644 index 0000000000..3375bef091 Binary files /dev/null and b/public/css/fonts/fa-brands-400.woff differ diff --git a/public/css/fonts/fa-brands-400.woff2 b/public/css/fonts/fa-brands-400.woff2 new file mode 100644 index 0000000000..402f81c0bc Binary files /dev/null and b/public/css/fonts/fa-brands-400.woff2 differ diff --git a/public/css/fonts/fa-regular-400.eot b/public/css/fonts/fa-regular-400.eot new file mode 100644 index 0000000000..a4e598936b Binary files /dev/null and b/public/css/fonts/fa-regular-400.eot differ diff --git a/public/css/fonts/fa-regular-400.svg b/public/css/fonts/fa-regular-400.svg new file mode 100644 index 0000000000..463af27c02 Binary files /dev/null and b/public/css/fonts/fa-regular-400.svg differ diff --git a/public/css/fonts/fa-regular-400.ttf b/public/css/fonts/fa-regular-400.ttf new file mode 100644 index 0000000000..7157aafbac Binary files /dev/null and b/public/css/fonts/fa-regular-400.ttf differ diff --git a/public/css/fonts/fa-regular-400.woff b/public/css/fonts/fa-regular-400.woff new file mode 100644 index 0000000000..ad077c6bec Binary files /dev/null and b/public/css/fonts/fa-regular-400.woff differ diff --git a/public/css/fonts/fa-regular-400.woff2 b/public/css/fonts/fa-regular-400.woff2 new file mode 100644 index 0000000000..56328948b3 Binary files /dev/null and b/public/css/fonts/fa-regular-400.woff2 differ diff --git a/public/css/fonts/fa-solid-900.eot b/public/css/fonts/fa-solid-900.eot new file mode 100644 index 0000000000..e99417197e Binary files /dev/null and b/public/css/fonts/fa-solid-900.eot differ diff --git a/public/css/fonts/fa-solid-900.svg b/public/css/fonts/fa-solid-900.svg new file mode 100644 index 0000000000..00296e9598 Binary files /dev/null and b/public/css/fonts/fa-solid-900.svg differ diff --git a/public/css/fonts/fa-solid-900.ttf b/public/css/fonts/fa-solid-900.ttf new file mode 100644 index 0000000000..25abf389e2 Binary files /dev/null and b/public/css/fonts/fa-solid-900.ttf differ diff --git a/public/css/fonts/fa-solid-900.woff b/public/css/fonts/fa-solid-900.woff new file mode 100644 index 0000000000..23ee663443 Binary files /dev/null and b/public/css/fonts/fa-solid-900.woff differ diff --git a/public/css/fonts/fa-solid-900.woff2 b/public/css/fonts/fa-solid-900.woff2 new file mode 100644 index 0000000000..2217164f0c Binary files /dev/null and b/public/css/fonts/fa-solid-900.woff2 differ diff --git a/public/css/fonts/fontawesome-webfont.eot b/public/css/fonts/fontawesome-webfont.eot deleted file mode 100644 index e9f60ca953..0000000000 Binary files a/public/css/fonts/fontawesome-webfont.eot and /dev/null differ diff --git a/public/css/fonts/fontawesome-webfont.svg b/public/css/fonts/fontawesome-webfont.svg deleted file mode 100644 index 855c845e53..0000000000 Binary files a/public/css/fonts/fontawesome-webfont.svg and /dev/null differ diff --git a/public/css/fonts/fontawesome-webfont.ttf b/public/css/fonts/fontawesome-webfont.ttf deleted file mode 100644 index 35acda2fa1..0000000000 Binary files a/public/css/fonts/fontawesome-webfont.ttf and /dev/null differ diff --git a/public/css/fonts/fontawesome-webfont.woff b/public/css/fonts/fontawesome-webfont.woff deleted file mode 100644 index 400014a4b0..0000000000 Binary files a/public/css/fonts/fontawesome-webfont.woff and /dev/null differ diff --git a/public/css/fonts/fontawesome-webfont.woff2 b/public/css/fonts/fontawesome-webfont.woff2 deleted file mode 100644 index 4d13fc6040..0000000000 Binary files a/public/css/fonts/fontawesome-webfont.woff2 and /dev/null differ diff --git a/public/css/skins/dist/skin-black-dark.css b/public/css/skins/dist/skin-black-dark.css index 357442c6dc..118362d9c5 100644 Binary files a/public/css/skins/dist/skin-black-dark.css and b/public/css/skins/dist/skin-black-dark.css differ diff --git a/public/img/demo/avatars/1.jpg b/public/img/demo/avatars/1.jpg new file mode 100644 index 0000000000..78c59a67d5 Binary files /dev/null and b/public/img/demo/avatars/1.jpg differ diff --git a/public/img/demo/avatars/10.jpg b/public/img/demo/avatars/10.jpg new file mode 100644 index 0000000000..95150c433d Binary files /dev/null and b/public/img/demo/avatars/10.jpg differ diff --git a/public/img/demo/avatars/11.jpg b/public/img/demo/avatars/11.jpg new file mode 100644 index 0000000000..8aa9f82911 Binary files /dev/null and b/public/img/demo/avatars/11.jpg differ diff --git a/public/img/demo/avatars/12.jpg b/public/img/demo/avatars/12.jpg new file mode 100644 index 0000000000..fc741d0fd0 Binary files /dev/null and b/public/img/demo/avatars/12.jpg differ diff --git a/public/img/demo/avatars/13.jpg b/public/img/demo/avatars/13.jpg new file mode 100644 index 0000000000..bb3634c720 Binary files /dev/null and b/public/img/demo/avatars/13.jpg differ diff --git a/public/img/demo/avatars/14.jpg b/public/img/demo/avatars/14.jpg new file mode 100644 index 0000000000..ee6f3bc702 Binary files /dev/null and b/public/img/demo/avatars/14.jpg differ diff --git a/public/img/demo/avatars/15.jpg b/public/img/demo/avatars/15.jpg new file mode 100644 index 0000000000..e32542453a Binary files /dev/null and b/public/img/demo/avatars/15.jpg differ diff --git a/public/img/demo/avatars/16.jpg b/public/img/demo/avatars/16.jpg new file mode 100644 index 0000000000..ca16a1ac51 Binary files /dev/null and b/public/img/demo/avatars/16.jpg differ diff --git a/public/img/demo/avatars/17.jpg b/public/img/demo/avatars/17.jpg new file mode 100644 index 0000000000..5e1589053c Binary files /dev/null and b/public/img/demo/avatars/17.jpg differ diff --git a/public/img/demo/avatars/18.jpg b/public/img/demo/avatars/18.jpg new file mode 100644 index 0000000000..34cd548539 Binary files /dev/null and b/public/img/demo/avatars/18.jpg differ diff --git a/public/img/demo/avatars/19.jpg b/public/img/demo/avatars/19.jpg new file mode 100644 index 0000000000..0ad858b003 Binary files /dev/null and b/public/img/demo/avatars/19.jpg differ diff --git a/public/img/demo/avatars/2.jpg b/public/img/demo/avatars/2.jpg new file mode 100644 index 0000000000..2e929c8540 Binary files /dev/null and b/public/img/demo/avatars/2.jpg differ diff --git a/public/img/demo/avatars/20.jpg b/public/img/demo/avatars/20.jpg new file mode 100644 index 0000000000..81d90c7862 Binary files /dev/null and b/public/img/demo/avatars/20.jpg differ diff --git a/public/img/demo/avatars/3.jpg b/public/img/demo/avatars/3.jpg new file mode 100644 index 0000000000..751b3dad8f Binary files /dev/null and b/public/img/demo/avatars/3.jpg differ diff --git a/public/img/demo/avatars/4.jpg b/public/img/demo/avatars/4.jpg new file mode 100644 index 0000000000..aab81c5592 Binary files /dev/null and b/public/img/demo/avatars/4.jpg differ diff --git a/public/img/demo/avatars/5.jpg b/public/img/demo/avatars/5.jpg new file mode 100644 index 0000000000..118defa791 Binary files /dev/null and b/public/img/demo/avatars/5.jpg differ diff --git a/public/img/demo/avatars/6.jpg b/public/img/demo/avatars/6.jpg new file mode 100644 index 0000000000..113a1d2692 Binary files /dev/null and b/public/img/demo/avatars/6.jpg differ diff --git a/public/img/demo/avatars/7.jpg b/public/img/demo/avatars/7.jpg new file mode 100644 index 0000000000..1051532161 Binary files /dev/null and b/public/img/demo/avatars/7.jpg differ diff --git a/public/img/demo/avatars/8.jpg b/public/img/demo/avatars/8.jpg new file mode 100644 index 0000000000..c9691ac944 Binary files /dev/null and b/public/img/demo/avatars/8.jpg differ diff --git a/public/img/demo/avatars/9.jpg b/public/img/demo/avatars/9.jpg new file mode 100644 index 0000000000..544f7c907d Binary files /dev/null and b/public/img/demo/avatars/9.jpg differ diff --git a/public/img/demo/models/iphone11.jpeg b/public/img/demo/models/iphone11.jpeg new file mode 100644 index 0000000000..a7c406aea2 Binary files /dev/null and b/public/img/demo/models/iphone11.jpeg differ diff --git a/public/img/demo/models/iphone12.jpeg b/public/img/demo/models/iphone12.jpeg new file mode 100644 index 0000000000..e251cbd717 Binary files /dev/null and b/public/img/demo/models/iphone12.jpeg differ diff --git a/public/img/demo/models/iphone6.jpg b/public/img/demo/models/iphone6.jpg deleted file mode 100644 index 5a0bc9ba0f..0000000000 Binary files a/public/img/demo/models/iphone6.jpg and /dev/null differ diff --git a/public/img/demo/models/iphone7.jpg b/public/img/demo/models/iphone7.jpg deleted file mode 100644 index 4d73fb6e40..0000000000 Binary files a/public/img/demo/models/iphone7.jpg and /dev/null differ diff --git a/public/index.php b/public/index.php index 348b3d9785..66ea93cd05 100644 --- a/public/index.php +++ b/public/index.php @@ -1,11 +1,24 @@ - */ +use Illuminate\Contracts\Http\Kernel; +use Illuminate\Http\Request; + +define('LARAVEL_START', microtime(true)); + +/* +|-------------------------------------------------------------------------- +| Check If The Application Is Under Maintenance +|-------------------------------------------------------------------------- +| +| If the application is in maintenance / demo mode via the "down" command +| we will load this file so that any pre-rendered content can be shown +| instead of starting the framework, which could cause an exception. +| +*/ + +if (file_exists(__DIR__.'/../storage/framework/maintenance.php')) { + require __DIR__.'/../storage/framework/maintenance.php'; +} /* |-------------------------------------------------------------------------- @@ -13,51 +26,30 @@ |-------------------------------------------------------------------------- | | Composer provides a convenient, automatically generated class loader for -| our application. We just need to utilize it! We'll simply require it -| into the script here so that we don't have to worry about manual -| loading any of our classes later on. It feels nice to relax. +| this application. We just need to utilize it! We'll simply require it +| into the script here so we don't need to manually load our classes. | */ -require __DIR__.'/../bootstrap/autoload.php'; - -/* -|-------------------------------------------------------------------------- -| Turn On The Lights -|-------------------------------------------------------------------------- -| -| We need to illuminate PHP development, so let us turn on the lights. -| This bootstraps the framework and gets it ready for use, then it -| will load up this application so that we can run it and send -| the responses back to the browser and delight our users. -| -*/ - -$app = require_once __DIR__.'/../bootstrap/app.php'; - -// set the public path to this directory -$app->bind('path.public', function() { - return __DIR__; -}); +require __DIR__.'/../vendor/autoload.php'; /* |-------------------------------------------------------------------------- | Run The Application |-------------------------------------------------------------------------- | -| Once we have the application, we can handle the incoming request -| through the kernel, and send the associated response back to -| the client's browser allowing them to enjoy the creative -| and wonderful application we have prepared for them. +| Once we have the application, we can handle the incoming request using +| the application's HTTP kernel. Then, we will send the response back +| to this client's browser, allowing them to enjoy our application. | */ -$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class); +$app = require_once __DIR__.'/../bootstrap/app.php'; -$response = $kernel->handle( - $request = Illuminate\Http\Request::capture() -); +$kernel = $app->make(Kernel::class); -$response->send(); +$response = tap($kernel->handle( + $request = Request::capture() +))->send(); $kernel->terminate($request, $response); diff --git a/public/js/bootstrap.datepicker.js b/public/js/bootstrap.datepicker.js index 4005b732b3..444f9a3d68 100755 Binary files a/public/js/bootstrap.datepicker.js and b/public/js/bootstrap.datepicker.js differ diff --git a/public/js/build/app.js b/public/js/build/app.js index 7f36b2e30d..041da5eeed 100644 Binary files a/public/js/build/app.js and b/public/js/build/app.js differ diff --git a/public/js/build/vendor.js b/public/js/build/vendor.js index 9b1199a816..e0c404f6bb 100644 Binary files a/public/js/build/vendor.js and b/public/js/build/vendor.js differ diff --git a/public/js/build/vue.js b/public/js/build/vue.js index 15472ee4dc..03c27acbbc 100644 Binary files a/public/js/build/vue.js and b/public/js/build/vue.js differ diff --git a/public/js/demo.js b/public/js/demo.js index 104f1462fb..806e1624d2 100755 Binary files a/public/js/demo.js and b/public/js/demo.js differ diff --git a/public/js/dist/all.js b/public/js/dist/all.js index fcace54995..f22f12b489 100644 Binary files a/public/js/dist/all.js and b/public/js/dist/all.js differ diff --git a/public/js/dist/bootstrap-table.js b/public/js/dist/bootstrap-table.js index bef68619cf..11e73e214a 100644 Binary files a/public/js/dist/bootstrap-table.js and b/public/js/dist/bootstrap-table.js differ diff --git a/public/js/extensions/export/bootstrap-table-export.js b/public/js/extensions/export/bootstrap-table-export.js index b399681e5e..5e4a7271af 100755 Binary files a/public/js/extensions/export/bootstrap-table-export.js and b/public/js/extensions/export/bootstrap-table-export.js differ diff --git a/public/js/extensions/export/bootstrap-table-export.min.js b/public/js/extensions/export/bootstrap-table-export.min.js index f2550f6265..dd2649b6b5 100755 Binary files a/public/js/extensions/export/bootstrap-table-export.min.js and b/public/js/extensions/export/bootstrap-table-export.min.js differ diff --git a/public/js/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.js b/public/js/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.js index 03289b78d6..08f86ff078 100755 Binary files a/public/js/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.js and b/public/js/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.js differ diff --git a/public/js/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.min.js b/public/js/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.min.js index 7752408de7..4e1d7d4be1 100755 Binary files a/public/js/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.min.js and b/public/js/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.min.js differ diff --git a/public/js/plugins/daterangepicker/daterangepicker.js b/public/js/plugins/daterangepicker/daterangepicker.js index 228612b9bb..60339b516f 100755 Binary files a/public/js/plugins/daterangepicker/daterangepicker.js and b/public/js/plugins/daterangepicker/daterangepicker.js differ diff --git a/public/js/snipeit.js b/public/js/snipeit.js index 2be8145758..cfa646d9e5 100644 Binary files a/public/js/snipeit.js and b/public/js/snipeit.js differ diff --git a/public/mix-manifest.json b/public/mix-manifest.json index 844bb82359..cd55b16f02 100644 --- a/public/mix-manifest.json +++ b/public/mix-manifest.json @@ -1,45 +1,45 @@ { - "/js/build/app.js": "/js/build/app.js?id=b23ec8d1be42f9d3d810", - "/css/build/AdminLTE.css": "/css/build/AdminLTE.css?id=59413334823616b81341", - "/css/build/app.css": "/css/build/app.css?id=032fd8c3fce99c7fd862", - "/css/build/overrides.css": "/css/build/overrides.css?id=0b4aefd7ef0c117ef23a", - "/css/dist/skins/skin-blue.css": "/css/dist/skins/skin-blue.css?id=1f87813d401bf76aa1c0", - "/css/dist/skins/skin-red.css": "/css/dist/skins/skin-red.css?id=b09d08f1bce1ce6ef565", - "/css/dist/skins/skin-contrast.css": "/css/dist/skins/skin-contrast.css?id=4fce68ca7086890d9029", - "/css/dist/skins/skin-green.css": "/css/dist/skins/skin-green.css?id=caf97a95374a38d8645e", - "/css/dist/skins/skin-green-dark.css": "/css/dist/skins/skin-green-dark.css?id=d6fc509af348f74dbe80", - "/css/dist/skins/skin-black.css": "/css/dist/skins/skin-black.css?id=8babe0615220ced5e869", - "/css/dist/skins/skin-black-dark.css": "/css/dist/skins/skin-black-dark.css?id=a1be7d448d0a7a677aa4", - "/css/dist/skins/skin-red-dark.css": "/css/dist/skins/skin-red-dark.css?id=36c5a414e9b5dfff5010", - "/css/dist/skins/skin-purple.css": "/css/dist/skins/skin-purple.css?id=73e98a9a8e41cd044475", - "/css/dist/skins/skin-purple-dark.css": "/css/dist/skins/skin-purple-dark.css?id=bc80aa3d9d5ab9f72514", - "/css/dist/skins/skin-yellow.css": "/css/dist/skins/skin-yellow.css?id=40988b7e9e4bbd9baa06", - "/css/dist/skins/skin-yellow-dark.css": "/css/dist/skins/skin-yellow-dark.css?id=39a7bdc303ea2cd82641", - "/css/dist/skins/skin-blue-dark.css": "/css/dist/skins/skin-blue-dark.css?id=bd4e8277d360eac19b2b", - "/css/dist/skins/skin-orange-dark.css": "/css/dist/skins/skin-orange-dark.css?id=289676d6c84e2f4980d6", - "/css/dist/skins/skin-orange.css": "/css/dist/skins/skin-orange.css?id=0426fbe408151f690505", - "/css/dist/all.css": "/css/dist/all.css?id=199fdf677ce0dce6cef8", - "/css/blue.png": "/css/blue.png?id=4c85d6a97173123bd14a", - "/css/blue@2x.png": "/css/blue@2x.png?id=62c67c6a822439e8a4ac", + "/js/build/app.js": "/js/build/app.js?id=c8a70594c0d99275266d", + "/css/dist/skins/skin-blue.css": "/css/dist/skins/skin-blue.css?id=83e39e254b7f9035eddc", + "/css/build/overrides.css": "/css/build/overrides.css?id=b1866ec98d44c0a8ceea", + "/css/build/app.css": "/css/build/app.css?id=61d5535cb27cce41d422", + "/css/build/AdminLTE.css": "/css/build/AdminLTE.css?id=65ca7a34198fa16ba846", + "/css/dist/skins/skin-orange.css": "/css/dist/skins/skin-orange.css?id=83271cb3576583918804", + "/css/dist/skins/skin-orange-dark.css": "/css/dist/skins/skin-orange-dark.css?id=d81888449b72ecd8dd24", + "/css/dist/skins/skin-blue-dark.css": "/css/dist/skins/skin-blue-dark.css?id=04b51f791329b22290c3", + "/css/dist/skins/skin-yellow-dark.css": "/css/dist/skins/skin-yellow-dark.css?id=8b631c0444622bf0bfd3", + "/css/dist/skins/skin-yellow.css": "/css/dist/skins/skin-yellow.css?id=a663ec2c7842a3507df9", + "/css/dist/skins/skin-purple-dark.css": "/css/dist/skins/skin-purple-dark.css?id=32c66312057953f69651", + "/css/dist/skins/skin-purple.css": "/css/dist/skins/skin-purple.css?id=0a901949068bc7ce7f80", + "/css/dist/skins/skin-red-dark.css": "/css/dist/skins/skin-red-dark.css?id=523144d33c7706098ed2", + "/css/dist/skins/skin-black-dark.css": "/css/dist/skins/skin-black-dark.css?id=fafb61603f6db2f250df", + "/css/dist/skins/skin-black.css": "/css/dist/skins/skin-black.css?id=ec96c42439cdeb022133", + "/css/dist/skins/skin-green-dark.css": "/css/dist/skins/skin-green-dark.css?id=6e35fb4cb2f1063b3047", + "/css/dist/skins/skin-green.css": "/css/dist/skins/skin-green.css?id=efda2335fa5243175850", + "/css/dist/skins/skin-contrast.css": "/css/dist/skins/skin-contrast.css?id=6a9d0ac448c28b88e5d6", + "/css/dist/skins/skin-red.css": "/css/dist/skins/skin-red.css?id=c24716a423d375902723", + "/css/dist/all.css": "/css/dist/all.css?id=138874c5ffe57b679997", + "/css/blue.png": "/css/blue.png?id=e83a6c29e04fe851f212", + "/css/blue@2x.png": "/css/blue@2x.png?id=51135dd4d24f88f5de0b", "/css/dist/signature-pad.css": "/css/dist/signature-pad.css?id=6a89d3cd901305e66ced", "/css/dist/signature-pad.min.css": "/css/dist/signature-pad.min.css?id=6a89d3cd901305e66ced", - "/css/dist/bootstrap-table.css": "/css/dist/bootstrap-table.css?id=1e77fde04b3f42432581", - "/js/build/vendor.js": "/js/build/vendor.js?id=b93877b4a88a76e1b18b", - "/js/dist/bootstrap-table.js": "/js/dist/bootstrap-table.js?id=fd6e727609678bf04984", - "/js/dist/all.js": "/js/dist/all.js?id=dde965016a515da2f8d2", - "/css/dist/skins/skin-green.min.css": "/css/dist/skins/skin-green.min.css?id=caf97a95374a38d8645e", - "/css/dist/skins/skin-green-dark.min.css": "/css/dist/skins/skin-green-dark.min.css?id=d6fc509af348f74dbe80", - "/css/dist/skins/skin-black.min.css": "/css/dist/skins/skin-black.min.css?id=8babe0615220ced5e869", - "/css/dist/skins/skin-black-dark.min.css": "/css/dist/skins/skin-black-dark.min.css?id=a1be7d448d0a7a677aa4", - "/css/dist/skins/skin-blue.min.css": "/css/dist/skins/skin-blue.min.css?id=1f87813d401bf76aa1c0", - "/css/dist/skins/skin-blue-dark.min.css": "/css/dist/skins/skin-blue-dark.min.css?id=bd4e8277d360eac19b2b", - "/css/dist/skins/skin-yellow.min.css": "/css/dist/skins/skin-yellow.min.css?id=40988b7e9e4bbd9baa06", - "/css/dist/skins/skin-yellow-dark.min.css": "/css/dist/skins/skin-yellow-dark.min.css?id=39a7bdc303ea2cd82641", - "/css/dist/skins/skin-red.min.css": "/css/dist/skins/skin-red.min.css?id=b09d08f1bce1ce6ef565", - "/css/dist/skins/skin-red-dark.min.css": "/css/dist/skins/skin-red-dark.min.css?id=36c5a414e9b5dfff5010", - "/css/dist/skins/skin-purple.min.css": "/css/dist/skins/skin-purple.min.css?id=73e98a9a8e41cd044475", - "/css/dist/skins/skin-purple-dark.min.css": "/css/dist/skins/skin-purple-dark.min.css?id=bc80aa3d9d5ab9f72514", - "/css/dist/skins/skin-orange.min.css": "/css/dist/skins/skin-orange.min.css?id=0426fbe408151f690505", - "/css/dist/skins/skin-orange-dark.min.css": "/css/dist/skins/skin-orange-dark.min.css?id=289676d6c84e2f4980d6", - "/css/dist/skins/skin-contrast.min.css": "/css/dist/skins/skin-contrast.min.css?id=4fce68ca7086890d9029" + "/css/dist/bootstrap-table.css": "/css/dist/bootstrap-table.css?id=93c24b4c89490bbfd73e", + "/js/build/vendor.js": "/js/build/vendor.js?id=651427cc4b45d8e68d0c", + "/js/dist/bootstrap-table.js": "/js/dist/bootstrap-table.js?id=867755a1544f6c0ea828", + "/js/dist/all.js": "/js/dist/all.js?id=a233dcde4650f5d34491", + "/css/dist/skins/skin-green.min.css": "/css/dist/skins/skin-green.min.css?id=efda2335fa5243175850", + "/css/dist/skins/skin-green-dark.min.css": "/css/dist/skins/skin-green-dark.min.css?id=6e35fb4cb2f1063b3047", + "/css/dist/skins/skin-black.min.css": "/css/dist/skins/skin-black.min.css?id=ec96c42439cdeb022133", + "/css/dist/skins/skin-black-dark.min.css": "/css/dist/skins/skin-black-dark.min.css?id=fafb61603f6db2f250df", + "/css/dist/skins/skin-blue.min.css": "/css/dist/skins/skin-blue.min.css?id=83e39e254b7f9035eddc", + "/css/dist/skins/skin-blue-dark.min.css": "/css/dist/skins/skin-blue-dark.min.css?id=04b51f791329b22290c3", + "/css/dist/skins/skin-yellow.min.css": "/css/dist/skins/skin-yellow.min.css?id=a663ec2c7842a3507df9", + "/css/dist/skins/skin-yellow-dark.min.css": "/css/dist/skins/skin-yellow-dark.min.css?id=8b631c0444622bf0bfd3", + "/css/dist/skins/skin-red.min.css": "/css/dist/skins/skin-red.min.css?id=c24716a423d375902723", + "/css/dist/skins/skin-red-dark.min.css": "/css/dist/skins/skin-red-dark.min.css?id=523144d33c7706098ed2", + "/css/dist/skins/skin-purple.min.css": "/css/dist/skins/skin-purple.min.css?id=0a901949068bc7ce7f80", + "/css/dist/skins/skin-purple-dark.min.css": "/css/dist/skins/skin-purple-dark.min.css?id=32c66312057953f69651", + "/css/dist/skins/skin-orange.min.css": "/css/dist/skins/skin-orange.min.css?id=83271cb3576583918804", + "/css/dist/skins/skin-orange-dark.min.css": "/css/dist/skins/skin-orange-dark.min.css?id=d81888449b72ecd8dd24", + "/css/dist/skins/skin-contrast.min.css": "/css/dist/skins/skin-contrast.min.css?id=6a9d0ac448c28b88e5d6" } diff --git a/public/vendor/livewire/livewire.js b/public/vendor/livewire/livewire.js new file mode 100644 index 0000000000..15bb8c48ec --- /dev/null +++ b/public/vendor/livewire/livewire.js @@ -0,0 +1,14 @@ +!function(global,factory){"object"==typeof exports&&"undefined"!=typeof module?module.exports=factory():"function"==typeof define&&define.amd?define(factory):(global="undefined"!=typeof globalThis?globalThis:global||self).Livewire=factory()}(this,(function(){"use strict";function ownKeys$1(object,enumerableOnly){var keys=Object.keys(object);if(Object.getOwnPropertySymbols){var symbols=Object.getOwnPropertySymbols(object);enumerableOnly&&(symbols=symbols.filter((function(sym){return Object.getOwnPropertyDescriptor(object,sym).enumerable}))),keys.push.apply(keys,symbols)}return keys}function _objectSpread2(target){for(var i=1;iarr.length)&&(len=arr.length);for(var i=0,arr2=new Array(len);i0&&void 0!==arguments[0]?arguments[0]:"right";return this.modifiers.includes("up")?"up":this.modifiers.includes("down")?"down":this.modifiers.includes("left")?"left":this.modifiers.includes("right")?"right":fallback}}]),Directive}();function walk(root,callback){if(!1!==callback(root))for(var node=root.firstElementChild;node;)walk(node,callback),node=node.nextElementSibling}function dispatch(eventName){var event=document.createEvent("Events");return event.initEvent(eventName,!0,!0),document.dispatchEvent(event),event}function getCsrfToken(){var _window$livewire_toke,tokenTag=document.head.querySelector('meta[name="csrf-token"]');return tokenTag?tokenTag.content:null!==(_window$livewire_toke=window.livewire_token)&&void 0!==_window$livewire_toke?_window$livewire_toke:void 0}function kebabCase(subject){return subject.replace(/([a-z])([A-Z])/g,"$1-$2").replace(/[_\s]/,"-").toLowerCase()} +/*! + * isobject + * + * Copyright (c) 2014-2017, Jon Schlinkert. + * Released under the MIT License. + */var isobject=function(val){return null!=val&&"object"==typeof val&&!1===Array.isArray(val)},getValue=function(target,path,options){if(isobject(options)||(options={default:options}),!isValidObject(target))return void 0!==options.default?options.default:target;"number"==typeof path&&(path=String(path));const isArray=Array.isArray(path),isString="string"==typeof path,splitChar=options.separator||".",joinChar=options.joinChar||("string"==typeof splitChar?splitChar:".");if(!isString&&!isArray)return target;if(isString&&path in target)return isValid(path,target,options)?target[path]:options.default;let segs=isArray?path:split$1(path,splitChar,options),len=segs.length,idx=0;do{let prop=segs[idx];for("number"==typeof prop&&(prop=String(prop));prop&&"\\"===prop.slice(-1);)prop=join([prop.slice(0,-1),segs[++idx]||""],joinChar,options);if(prop in target){if(!isValid(prop,target,options))return options.default;target=target[prop]}else{let hasProp=!1,n=idx+1;for(;n + * + * Copyright (c) 2014-2018, Jon Schlinkert. + * Released under the MIT License. + */function join(segs,joinChar,options){return"function"==typeof options.join?options.join(segs):segs[0]+joinChar+segs[1]}function split$1(path,splitChar,options){return"function"==typeof options.split?options.split(path):path.split(splitChar)}function isValid(key,target,options){return"function"!=typeof options.isValid||options.isValid(key,target)}function isValidObject(val){return isobject(val)||Array.isArray(val)||"function"==typeof val}var _default$6=function(){function _default(el){var skipWatcher=arguments.length>1&&void 0!==arguments[1]&&arguments[1];_classCallCheck(this,_default),this.el=el,this.skipWatcher=skipWatcher,this.resolveCallback=function(){},this.rejectCallback=function(){},this.signature=(Math.random()+1).toString(36).substring(8)}return _createClass(_default,[{key:"toId",value:function(){return btoa(encodeURIComponent(this.el.outerHTML))}},{key:"onResolve",value:function(callback){this.resolveCallback=callback}},{key:"onReject",value:function(callback){this.rejectCallback=callback}},{key:"resolve",value:function(thing){this.resolveCallback(thing)}},{key:"reject",value:function(thing){this.rejectCallback(thing)}}]),_default}(),_default$5=function(_Action){_inherits(_default,_Action);var _super=_createSuper(_default);function _default(event,params,el){var _this;return _classCallCheck(this,_default),(_this=_super.call(this,el)).type="fireEvent",_this.payload={id:_this.signature,event:event,params:params},_this}return _createClass(_default,[{key:"toId",value:function(){return btoa(encodeURIComponent(this.type,this.payload.event,JSON.stringify(this.payload.params)))}}]),_default}(_default$6),MessageBus=function(){function MessageBus(){_classCallCheck(this,MessageBus),this.listeners={}}return _createClass(MessageBus,[{key:"register",value:function(name,callback){this.listeners[name]||(this.listeners[name]=[]),this.listeners[name].push(callback)}},{key:"call",value:function(name){for(var _len=arguments.length,params=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)params[_key-1]=arguments[_key];(this.listeners[name]||[]).forEach((function(callback){callback.apply(void 0,params)}))}},{key:"has",value:function(name){return Object.keys(this.listeners).includes(name)}}]),MessageBus}(),HookManager={availableHooks:["component.initialized","element.initialized","element.updating","element.updated","element.removed","message.sent","message.failed","message.received","message.processed","interceptWireModelSetValue","interceptWireModelAttachListener","beforeReplaceState","beforePushState"],bus:new MessageBus,register:function(name,callback){if(!this.availableHooks.includes(name))throw"Livewire: Referencing unknown hook: [".concat(name,"]");this.bus.register(name,callback)},call:function(name){for(var _this$bus,_len=arguments.length,params=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)params[_key-1]=arguments[_key];(_this$bus=this.bus).call.apply(_this$bus,[name].concat(params))}},DirectiveManager={directives:new MessageBus,register:function(name,callback){if(this.has(name))throw"Livewire: Directive already registered: [".concat(name,"]");this.directives.register(name,callback)},call:function(name,el,directive,component){this.directives.call(name,el,directive,component)},has:function(name){return this.directives.has(name)}},store$2={componentsById:{},listeners:new MessageBus,initialRenderIsFinished:!1,livewireIsInBackground:!1,livewireIsOffline:!1,sessionHasExpired:!1,directives:DirectiveManager,hooks:HookManager,onErrorCallback:function(){},components:function(){var _this=this;return Object.keys(this.componentsById).map((function(key){return _this.componentsById[key]}))},addComponent:function(component){return this.componentsById[component.id]=component},findComponent:function(id){return this.componentsById[id]},getComponentsByName:function(name){return this.components().filter((function(component){return component.name===name}))},hasComponent:function(id){return!!this.componentsById[id]},tearDownComponents:function(){var _this2=this;this.components().forEach((function(component){_this2.removeComponent(component)}))},on:function(event,callback){this.listeners.register(event,callback)},emit:function(event){for(var _this$listeners,_len=arguments.length,params=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)params[_key-1]=arguments[_key];(_this$listeners=this.listeners).call.apply(_this$listeners,[event].concat(params)),this.componentsListeningForEvent(event).forEach((function(component){return component.addAction(new _default$5(event,params))}))},emitUp:function(el,event){for(var _len2=arguments.length,params=new Array(_len2>2?_len2-2:0),_key2=2;_key2<_len2;_key2++)params[_key2-2]=arguments[_key2];this.componentsListeningForEventThatAreTreeAncestors(el,event).forEach((function(component){return component.addAction(new _default$5(event,params))}))},emitSelf:function(componentId,event){var component=this.findComponent(componentId);if(component.listeners.includes(event)){for(var _len3=arguments.length,params=new Array(_len3>2?_len3-2:0),_key3=2;_key3<_len3;_key3++)params[_key3-2]=arguments[_key3];component.addAction(new _default$5(event,params))}},emitTo:function(componentName,event){for(var _len4=arguments.length,params=new Array(_len4>2?_len4-2:0),_key4=2;_key4<_len4;_key4++)params[_key4-2]=arguments[_key4];var components=this.getComponentsByName(componentName);components.forEach((function(component){component.listeners.includes(event)&&component.addAction(new _default$5(event,params))}))},componentsListeningForEventThatAreTreeAncestors:function(el,event){for(var parentIds=[],parent=el.parentElement.closest("[wire\\:id]");parent;)parentIds.push(parent.getAttribute("wire:id")),parent=parent.parentElement.closest("[wire\\:id]");return this.components().filter((function(component){return component.listeners.includes(event)&&parentIds.includes(component.id)}))},componentsListeningForEvent:function(event){return this.components().filter((function(component){return component.listeners.includes(event)}))},registerDirective:function(name,callback){this.directives.register(name,callback)},registerHook:function(name,callback){this.hooks.register(name,callback)},callHook:function(name){for(var _this$hooks,_len5=arguments.length,params=new Array(_len5>1?_len5-1:0),_key5=1;_key5<_len5;_key5++)params[_key5-1]=arguments[_key5];(_this$hooks=this.hooks).call.apply(_this$hooks,[name].concat(params))},changeComponentId:function(component,newId){var oldId=component.id;component.id=newId,component.fingerprint.id=newId,this.componentsById[newId]=component,delete this.componentsById[oldId],this.components().forEach((function(component){var children=component.serverMemo.children||{};Object.entries(children).forEach((function(_ref){var _ref2=_slicedToArray(_ref,2),key=_ref2[0],_ref2$=_ref2[1],id=_ref2$.id;_ref2$.tagName,id===oldId&&(children[key].id=newId)}))}))},removeComponent:function(component){component.tearDown(),delete this.componentsById[component.id]},onError:function(callback){this.onErrorCallback=callback},getClosestParentId:function(childId,subsetOfParentIds){var _this3=this,distancesByParentId={};subsetOfParentIds.forEach((function(parentId){var distance=_this3.getDistanceToChild(parentId,childId);distance&&(distancesByParentId[parentId]=distance)}));var closestParentId,smallestDistance=Math.min.apply(Math,_toConsumableArray(Object.values(distancesByParentId)));return Object.entries(distancesByParentId).forEach((function(_ref3){var _ref4=_slicedToArray(_ref3,2),parentId=_ref4[0];_ref4[1]===smallestDistance&&(closestParentId=parentId)})),closestParentId},getDistanceToChild:function(parentId,childId){var distanceMemo=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,parentComponent=this.findComponent(parentId);if(parentComponent){var childIds=parentComponent.childIds;if(childIds.includes(childId))return distanceMemo;for(var i=0;i0&&void 0!==arguments[0]?arguments[0]:null;null===node&&(node=document);var allEls=Array.from(node.querySelectorAll("[wire\\:initial-data]")),onlyChildEls=Array.from(node.querySelectorAll("[wire\\:initial-data] [wire\\:initial-data]"));return allEls.filter((function(el){return!onlyChildEls.includes(el)}))},allModelElementsInside:function(root){return Array.from(root.querySelectorAll("[wire\\:model]"))},getByAttributeAndValue:function(attribute,value){return document.querySelector("[wire\\:".concat(attribute,'="').concat(value,'"]'))},nextFrame:function(fn){var _this=this;requestAnimationFrame((function(){requestAnimationFrame(fn.bind(_this))}))},closestRoot:function(el){return this.closestByAttribute(el,"id")},closestByAttribute:function(el,attribute){var closestEl=el.closest("[wire\\:".concat(attribute,"]"));if(!closestEl)throw"\nLivewire Error:\n\nCannot find parent element in DOM tree containing attribute: [wire:".concat(attribute,"].\n\nUsually this is caused by Livewire's DOM-differ not being able to properly track changes.\n\nReference the following guide for common causes: https://laravel-livewire.com/docs/troubleshooting \n\nReferenced element:\n\n").concat(el.outerHTML,"\n");return closestEl},isComponentRootEl:function(el){return this.hasAttribute(el,"id")},hasAttribute:function(el,attribute){return el.hasAttribute("wire:".concat(attribute))},getAttribute:function(el,attribute){return el.getAttribute("wire:".concat(attribute))},removeAttribute:function(el,attribute){return el.removeAttribute("wire:".concat(attribute))},setAttribute:function(el,attribute,value){return el.setAttribute("wire:".concat(attribute),value)},hasFocus:function(el){return el===document.activeElement},isInput:function(el){return["INPUT","TEXTAREA","SELECT"].includes(el.tagName.toUpperCase())},isTextInput:function(el){return["INPUT","TEXTAREA"].includes(el.tagName.toUpperCase())&&!["checkbox","radio"].includes(el.type)},valueFromInput:function(el,component){if("checkbox"===el.type){var modelName=wireDirectives(el).get("model").value,modelValue=component.deferredActions[modelName]?component.deferredActions[modelName].payload.value:getValue(component.data,modelName);return Array.isArray(modelValue)?this.mergeCheckboxValueIntoArray(el,modelValue):!!el.checked&&(el.getAttribute("value")||!0)}return"SELECT"===el.tagName&&el.multiple?this.getSelectValues(el):el.value},mergeCheckboxValueIntoArray:function(el,arrayValue){return el.checked?arrayValue.includes(el.value)?arrayValue:arrayValue.concat(el.value):arrayValue.filter((function(item){return item!==el.value}))},setInputValueFromModel:function(el,component){var modelString=wireDirectives(el).get("model").value,modelValue=getValue(component.data,modelString);"input"===el.tagName.toLowerCase()&&"file"===el.type||this.setInputValue(el,modelValue)},setInputValue:function(el,value){if(store$2.callHook("interceptWireModelSetValue",value,el),"radio"===el.type)el.checked=el.value==value;else if("checkbox"===el.type)if(Array.isArray(value)){var valueFound=!1;value.forEach((function(val){val==el.value&&(valueFound=!0)})),el.checked=valueFound}else el.checked=!!value;else"SELECT"===el.tagName?this.updateSelect(el,value):(value=void 0===value?"":value,el.value=value)},getSelectValues:function(el){return Array.from(el.options).filter((function(option){return option.selected})).map((function(option){return option.value||option.text}))},updateSelect:function(el,value){var arrayWrappedValue=[].concat(value).map((function(value){return value+""}));Array.from(el.options).forEach((function(option){option.selected=arrayWrappedValue.includes(option.value)}))}},ceil=Math.ceil,floor=Math.floor,toInteger=function(argument){return isNaN(argument=+argument)?0:(argument>0?floor:ceil)(argument)},requireObjectCoercible=function(it){if(null==it)throw TypeError("Can't call method on "+it);return it},createMethod$3=function(CONVERT_TO_STRING){return function($this,pos){var first,second,S=String(requireObjectCoercible($this)),position=toInteger(pos),size=S.length;return position<0||position>=size?CONVERT_TO_STRING?"":void 0:(first=S.charCodeAt(position))<55296||first>56319||position+1===size||(second=S.charCodeAt(position+1))<56320||second>57343?CONVERT_TO_STRING?S.charAt(position):first:CONVERT_TO_STRING?S.slice(position,position+2):second-56320+(first-55296<<10)+65536}},stringMultibyte={codeAt:createMethod$3(!1),charAt:createMethod$3(!0)},commonjsGlobal="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function createCommonjsModule(fn,basedir,module){return fn(module={path:basedir,exports:{},require:function(path,base){return commonjsRequire(path,null==base?module.path:base)}},module.exports),module.exports}function commonjsRequire(){throw new Error("Dynamic requires are not currently supported by @rollup/plugin-commonjs")}var check=function(it){return it&&it.Math==Math&&it},global_1=check("object"==typeof globalThis&&globalThis)||check("object"==typeof window&&window)||check("object"==typeof self&&self)||check("object"==typeof commonjsGlobal&&commonjsGlobal)||function(){return this}()||Function("return this")(),fails=function(exec){try{return!!exec()}catch(error){return!0}},descriptors=!fails((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),isObject=function(it){return"object"==typeof it?null!==it:"function"==typeof it},document$3=global_1.document,EXISTS=isObject(document$3)&&isObject(document$3.createElement),documentCreateElement=function(it){return EXISTS?document$3.createElement(it):{}},ie8DomDefine=!descriptors&&!fails((function(){return 7!=Object.defineProperty(documentCreateElement("div"),"a",{get:function(){return 7}}).a})),anObject=function(it){if(!isObject(it))throw TypeError(String(it)+" is not an object");return it},toPrimitive=function(input,PREFERRED_STRING){if(!isObject(input))return input;var fn,val;if(PREFERRED_STRING&&"function"==typeof(fn=input.toString)&&!isObject(val=fn.call(input)))return val;if("function"==typeof(fn=input.valueOf)&&!isObject(val=fn.call(input)))return val;if(!PREFERRED_STRING&&"function"==typeof(fn=input.toString)&&!isObject(val=fn.call(input)))return val;throw TypeError("Can't convert object to primitive value")},$defineProperty=Object.defineProperty,f$5=descriptors?$defineProperty:function(O,P,Attributes){if(anObject(O),P=toPrimitive(P,!0),anObject(Attributes),ie8DomDefine)try{return $defineProperty(O,P,Attributes)}catch(error){}if("get"in Attributes||"set"in Attributes)throw TypeError("Accessors not supported");return"value"in Attributes&&(O[P]=Attributes.value),O},objectDefineProperty={f:f$5},createPropertyDescriptor=function(bitmap,value){return{enumerable:!(1&bitmap),configurable:!(2&bitmap),writable:!(4&bitmap),value:value}},createNonEnumerableProperty=descriptors?function(object,key,value){return objectDefineProperty.f(object,key,createPropertyDescriptor(1,value))}:function(object,key,value){return object[key]=value,object},setGlobal=function(key,value){try{createNonEnumerableProperty(global_1,key,value)}catch(error){global_1[key]=value}return value},SHARED="__core-js_shared__",store$1=global_1[SHARED]||setGlobal(SHARED,{}),sharedStore=store$1,functionToString=Function.toString;"function"!=typeof sharedStore.inspectSource&&(sharedStore.inspectSource=function(it){return functionToString.call(it)});var inspectSource=sharedStore.inspectSource,WeakMap$1=global_1.WeakMap,nativeWeakMap="function"==typeof WeakMap$1&&/native code/.test(inspectSource(WeakMap$1)),toObject=function(argument){return Object(requireObjectCoercible(argument))},hasOwnProperty={}.hasOwnProperty,has$1=Object.hasOwn||function(it,key){return hasOwnProperty.call(toObject(it),key)},shared=createCommonjsModule((function(module){(module.exports=function(key,value){return sharedStore[key]||(sharedStore[key]=void 0!==value?value:{})})("versions",[]).push({version:"3.15.2",mode:"global",copyright:"© 2021 Denis Pushkarev (zloirock.ru)"})})),id=0,postfix=Math.random(),uid=function(key){return"Symbol("+String(void 0===key?"":key)+")_"+(++id+postfix).toString(36)},keys=shared("keys"),sharedKey=function(key){return keys[key]||(keys[key]=uid(key))},hiddenKeys$1={},OBJECT_ALREADY_INITIALIZED="Object already initialized",WeakMap=global_1.WeakMap,set$1,get,has,enforce=function(it){return has(it)?get(it):set$1(it,{})},getterFor=function(TYPE){return function(it){var state;if(!isObject(it)||(state=get(it)).type!==TYPE)throw TypeError("Incompatible receiver, "+TYPE+" required");return state}};if(nativeWeakMap||sharedStore.state){var store=sharedStore.state||(sharedStore.state=new WeakMap),wmget=store.get,wmhas=store.has,wmset=store.set;set$1=function(it,metadata){if(wmhas.call(store,it))throw new TypeError(OBJECT_ALREADY_INITIALIZED);return metadata.facade=it,wmset.call(store,it,metadata),metadata},get=function(it){return wmget.call(store,it)||{}},has=function(it){return wmhas.call(store,it)}}else{var STATE=sharedKey("state");hiddenKeys$1[STATE]=!0,set$1=function(it,metadata){if(has$1(it,STATE))throw new TypeError(OBJECT_ALREADY_INITIALIZED);return metadata.facade=it,createNonEnumerableProperty(it,STATE,metadata),metadata},get=function(it){return has$1(it,STATE)?it[STATE]:{}},has=function(it){return has$1(it,STATE)}}var internalState={set:set$1,get:get,has:has,enforce:enforce,getterFor:getterFor},$propertyIsEnumerable={}.propertyIsEnumerable,getOwnPropertyDescriptor$3=Object.getOwnPropertyDescriptor,NASHORN_BUG=getOwnPropertyDescriptor$3&&!$propertyIsEnumerable.call({1:2},1),f$4=NASHORN_BUG?function(V){var descriptor=getOwnPropertyDescriptor$3(this,V);return!!descriptor&&descriptor.enumerable}:$propertyIsEnumerable,objectPropertyIsEnumerable={f:f$4},toString={}.toString,classofRaw=function(it){return toString.call(it).slice(8,-1)},split="".split,indexedObject=fails((function(){return!Object("z").propertyIsEnumerable(0)}))?function(it){return"String"==classofRaw(it)?split.call(it,""):Object(it)}:Object,toIndexedObject=function(it){return indexedObject(requireObjectCoercible(it))},$getOwnPropertyDescriptor=Object.getOwnPropertyDescriptor,f$3=descriptors?$getOwnPropertyDescriptor:function(O,P){if(O=toIndexedObject(O),P=toPrimitive(P,!0),ie8DomDefine)try{return $getOwnPropertyDescriptor(O,P)}catch(error){}if(has$1(O,P))return createPropertyDescriptor(!objectPropertyIsEnumerable.f.call(O,P),O[P])},objectGetOwnPropertyDescriptor={f:f$3},redefine=createCommonjsModule((function(module){var getInternalState=internalState.get,enforceInternalState=internalState.enforce,TEMPLATE=String(String).split("String");(module.exports=function(O,key,value,options){var state,unsafe=!!options&&!!options.unsafe,simple=!!options&&!!options.enumerable,noTargetGet=!!options&&!!options.noTargetGet;"function"==typeof value&&("string"!=typeof key||has$1(value,"name")||createNonEnumerableProperty(value,"name",key),(state=enforceInternalState(value)).source||(state.source=TEMPLATE.join("string"==typeof key?key:""))),O!==global_1?(unsafe?!noTargetGet&&O[key]&&(simple=!0):delete O[key],simple?O[key]=value:createNonEnumerableProperty(O,key,value)):simple?O[key]=value:setGlobal(key,value)})(Function.prototype,"toString",(function(){return"function"==typeof this&&getInternalState(this).source||inspectSource(this)}))})),path=global_1,aFunction$1=function(variable){return"function"==typeof variable?variable:void 0},getBuiltIn=function(namespace,method){return arguments.length<2?aFunction$1(path[namespace])||aFunction$1(global_1[namespace]):path[namespace]&&path[namespace][method]||global_1[namespace]&&global_1[namespace][method]},min$2=Math.min,toLength=function(argument){return argument>0?min$2(toInteger(argument),9007199254740991):0},max=Math.max,min$1=Math.min,toAbsoluteIndex=function(index,length){var integer=toInteger(index);return integer<0?max(integer+length,0):min$1(integer,length)},createMethod$2=function(IS_INCLUDES){return function($this,el,fromIndex){var value,O=toIndexedObject($this),length=toLength(O.length),index=toAbsoluteIndex(fromIndex,length);if(IS_INCLUDES&&el!=el){for(;length>index;)if((value=O[index++])!=value)return!0}else for(;length>index;index++)if((IS_INCLUDES||index in O)&&O[index]===el)return IS_INCLUDES||index||0;return!IS_INCLUDES&&-1}},arrayIncludes={includes:createMethod$2(!0),indexOf:createMethod$2(!1)},indexOf=arrayIncludes.indexOf,objectKeysInternal=function(object,names){var key,O=toIndexedObject(object),i=0,result=[];for(key in O)!has$1(hiddenKeys$1,key)&&has$1(O,key)&&result.push(key);for(;names.length>i;)has$1(O,key=names[i++])&&(~indexOf(result,key)||result.push(key));return result},enumBugKeys=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],hiddenKeys=enumBugKeys.concat("length","prototype"),f$2=Object.getOwnPropertyNames||function(O){return objectKeysInternal(O,hiddenKeys)},objectGetOwnPropertyNames={f:f$2},f$1=Object.getOwnPropertySymbols,objectGetOwnPropertySymbols={f:f$1},ownKeys=getBuiltIn("Reflect","ownKeys")||function(it){var keys=objectGetOwnPropertyNames.f(anObject(it)),getOwnPropertySymbols=objectGetOwnPropertySymbols.f;return getOwnPropertySymbols?keys.concat(getOwnPropertySymbols(it)):keys},copyConstructorProperties=function(target,source){for(var keys=ownKeys(source),defineProperty=objectDefineProperty.f,getOwnPropertyDescriptor=objectGetOwnPropertyDescriptor.f,i=0;i=74)&&(match=engineUserAgent.match(/Chrome\/(\d+)/),match&&(version=match[1])));var engineV8Version=version&&+version,nativeSymbol=!!Object.getOwnPropertySymbols&&!fails((function(){var symbol=Symbol();return!String(symbol)||!(Object(symbol)instanceof Symbol)||!Symbol.sham&&engineV8Version&&engineV8Version<41})),useSymbolAsUid=nativeSymbol&&!Symbol.sham&&"symbol"==typeof Symbol.iterator,WellKnownSymbolsStore=shared("wks"),Symbol$1=global_1.Symbol,createWellKnownSymbol=useSymbolAsUid?Symbol$1:Symbol$1&&Symbol$1.withoutSetter||uid,wellKnownSymbol=function(name){return has$1(WellKnownSymbolsStore,name)&&(nativeSymbol||"string"==typeof WellKnownSymbolsStore[name])||(nativeSymbol&&has$1(Symbol$1,name)?WellKnownSymbolsStore[name]=Symbol$1[name]:WellKnownSymbolsStore[name]=createWellKnownSymbol("Symbol."+name)),WellKnownSymbolsStore[name]},ITERATOR$5=wellKnownSymbol("iterator"),BUGGY_SAFARI_ITERATORS$1=!1,returnThis$2=function(){return this},IteratorPrototype$2,PrototypeOfArrayIteratorPrototype,arrayIterator;[].keys&&(arrayIterator=[].keys(),"next"in arrayIterator?(PrototypeOfArrayIteratorPrototype=objectGetPrototypeOf(objectGetPrototypeOf(arrayIterator)),PrototypeOfArrayIteratorPrototype!==Object.prototype&&(IteratorPrototype$2=PrototypeOfArrayIteratorPrototype)):BUGGY_SAFARI_ITERATORS$1=!0);var NEW_ITERATOR_PROTOTYPE=null==IteratorPrototype$2||fails((function(){var test={};return IteratorPrototype$2[ITERATOR$5].call(test)!==test}));NEW_ITERATOR_PROTOTYPE&&(IteratorPrototype$2={}),has$1(IteratorPrototype$2,ITERATOR$5)||createNonEnumerableProperty(IteratorPrototype$2,ITERATOR$5,returnThis$2);var iteratorsCore={IteratorPrototype:IteratorPrototype$2,BUGGY_SAFARI_ITERATORS:BUGGY_SAFARI_ITERATORS$1},objectKeys=Object.keys||function(O){return objectKeysInternal(O,enumBugKeys)},objectDefineProperties=descriptors?Object.defineProperties:function(O,Properties){anObject(O);for(var key,keys=objectKeys(Properties),length=keys.length,index=0;length>index;)objectDefineProperty.f(O,key=keys[index++],Properties[key]);return O},html=getBuiltIn("document","documentElement"),GT=">",LT="<",PROTOTYPE="prototype",SCRIPT="script",IE_PROTO=sharedKey("IE_PROTO"),EmptyConstructor=function(){},scriptTag=function(content){return LT+SCRIPT+GT+content+LT+"/"+SCRIPT+GT},NullProtoObjectViaActiveX=function(activeXDocument){activeXDocument.write(scriptTag("")),activeXDocument.close();var temp=activeXDocument.parentWindow.Object;return activeXDocument=null,temp},NullProtoObjectViaIFrame=function(){var iframeDocument,iframe=documentCreateElement("iframe"),JS="java"+SCRIPT+":";return iframe.style.display="none",html.appendChild(iframe),iframe.src=String(JS),(iframeDocument=iframe.contentWindow.document).open(),iframeDocument.write(scriptTag("document.F=Object")),iframeDocument.close(),iframeDocument.F},activeXDocument,NullProtoObject=function(){try{activeXDocument=document.domain&&new ActiveXObject("htmlfile")}catch(error){}NullProtoObject=activeXDocument?NullProtoObjectViaActiveX(activeXDocument):NullProtoObjectViaIFrame();for(var length=enumBugKeys.length;length--;)delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];return NullProtoObject()};hiddenKeys$1[IE_PROTO]=!0;var objectCreate=Object.create||function(O,Properties){var result;return null!==O?(EmptyConstructor[PROTOTYPE]=anObject(O),result=new EmptyConstructor,EmptyConstructor[PROTOTYPE]=null,result[IE_PROTO]=O):result=NullProtoObject(),void 0===Properties?result:objectDefineProperties(result,Properties)},defineProperty$1=objectDefineProperty.f,TO_STRING_TAG$3=wellKnownSymbol("toStringTag"),setToStringTag=function(it,TAG,STATIC){it&&!has$1(it=STATIC?it:it.prototype,TO_STRING_TAG$3)&&defineProperty$1(it,TO_STRING_TAG$3,{configurable:!0,value:TAG})},iterators={},IteratorPrototype$1=iteratorsCore.IteratorPrototype,returnThis$1=function(){return this},createIteratorConstructor=function(IteratorConstructor,NAME,next){var TO_STRING_TAG=NAME+" Iterator";return IteratorConstructor.prototype=objectCreate(IteratorPrototype$1,{next:createPropertyDescriptor(1,next)}),setToStringTag(IteratorConstructor,TO_STRING_TAG,!1),iterators[TO_STRING_TAG]=returnThis$1,IteratorConstructor},aPossiblePrototype=function(it){if(!isObject(it)&&null!==it)throw TypeError("Can't set "+String(it)+" as a prototype");return it},objectSetPrototypeOf=Object.setPrototypeOf||("__proto__"in{}?function(){var setter,CORRECT_SETTER=!1,test={};try{(setter=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(test,[]),CORRECT_SETTER=test instanceof Array}catch(error){}return function(O,proto){return anObject(O),aPossiblePrototype(proto),CORRECT_SETTER?setter.call(O,proto):O.__proto__=proto,O}}():void 0),IteratorPrototype=iteratorsCore.IteratorPrototype,BUGGY_SAFARI_ITERATORS=iteratorsCore.BUGGY_SAFARI_ITERATORS,ITERATOR$4=wellKnownSymbol("iterator"),KEYS="keys",VALUES="values",ENTRIES="entries",returnThis=function(){return this},defineIterator=function(Iterable,NAME,IteratorConstructor,next,DEFAULT,IS_SET,FORCED){createIteratorConstructor(IteratorConstructor,NAME,next);var CurrentIteratorPrototype,methods,KEY,getIterationMethod=function(KIND){if(KIND===DEFAULT&&defaultIterator)return defaultIterator;if(!BUGGY_SAFARI_ITERATORS&&KIND in IterablePrototype)return IterablePrototype[KIND];switch(KIND){case KEYS:case VALUES:case ENTRIES:return function(){return new IteratorConstructor(this,KIND)}}return function(){return new IteratorConstructor(this)}},TO_STRING_TAG=NAME+" Iterator",INCORRECT_VALUES_NAME=!1,IterablePrototype=Iterable.prototype,nativeIterator=IterablePrototype[ITERATOR$4]||IterablePrototype["@@iterator"]||DEFAULT&&IterablePrototype[DEFAULT],defaultIterator=!BUGGY_SAFARI_ITERATORS&&nativeIterator||getIterationMethod(DEFAULT),anyNativeIterator="Array"==NAME&&IterablePrototype.entries||nativeIterator;if(anyNativeIterator&&(CurrentIteratorPrototype=objectGetPrototypeOf(anyNativeIterator.call(new Iterable)),IteratorPrototype!==Object.prototype&&CurrentIteratorPrototype.next&&(objectGetPrototypeOf(CurrentIteratorPrototype)!==IteratorPrototype&&(objectSetPrototypeOf?objectSetPrototypeOf(CurrentIteratorPrototype,IteratorPrototype):"function"!=typeof CurrentIteratorPrototype[ITERATOR$4]&&createNonEnumerableProperty(CurrentIteratorPrototype,ITERATOR$4,returnThis)),setToStringTag(CurrentIteratorPrototype,TO_STRING_TAG,!0))),DEFAULT==VALUES&&nativeIterator&&nativeIterator.name!==VALUES&&(INCORRECT_VALUES_NAME=!0,defaultIterator=function(){return nativeIterator.call(this)}),IterablePrototype[ITERATOR$4]!==defaultIterator&&createNonEnumerableProperty(IterablePrototype,ITERATOR$4,defaultIterator),iterators[NAME]=defaultIterator,DEFAULT)if(methods={values:getIterationMethod(VALUES),keys:IS_SET?defaultIterator:getIterationMethod(KEYS),entries:getIterationMethod(ENTRIES)},FORCED)for(KEY in methods)(BUGGY_SAFARI_ITERATORS||INCORRECT_VALUES_NAME||!(KEY in IterablePrototype))&&redefine(IterablePrototype,KEY,methods[KEY]);else _export({target:NAME,proto:!0,forced:BUGGY_SAFARI_ITERATORS||INCORRECT_VALUES_NAME},methods);return methods},charAt=stringMultibyte.charAt,STRING_ITERATOR="String Iterator",setInternalState$2=internalState.set,getInternalState$2=internalState.getterFor(STRING_ITERATOR);defineIterator(String,"String",(function(iterated){setInternalState$2(this,{type:STRING_ITERATOR,string:String(iterated),index:0})}),(function(){var point,state=getInternalState$2(this),string=state.string,index=state.index;return index>=string.length?{value:void 0,done:!0}:(point=charAt(string,index),state.index+=point.length,{value:point,done:!1})}));var aFunction=function(it){if("function"!=typeof it)throw TypeError(String(it)+" is not a function");return it},functionBindContext=function(fn,that,length){if(aFunction(fn),void 0===that)return fn;switch(length){case 0:return function(){return fn.call(that)};case 1:return function(a){return fn.call(that,a)};case 2:return function(a,b){return fn.call(that,a,b)};case 3:return function(a,b,c){return fn.call(that,a,b,c)}}return function(){return fn.apply(that,arguments)}},iteratorClose=function(iterator){var returnMethod=iterator.return;if(void 0!==returnMethod)return anObject(returnMethod.call(iterator)).value},callWithSafeIterationClosing=function(iterator,fn,value,ENTRIES){try{return ENTRIES?fn(anObject(value)[0],value[1]):fn(value)}catch(error){throw iteratorClose(iterator),error}},ITERATOR$3=wellKnownSymbol("iterator"),ArrayPrototype$1=Array.prototype,isArrayIteratorMethod=function(it){return void 0!==it&&(iterators.Array===it||ArrayPrototype$1[ITERATOR$3]===it)},createProperty=function(object,key,value){var propertyKey=toPrimitive(key);propertyKey in object?objectDefineProperty.f(object,propertyKey,createPropertyDescriptor(0,value)):object[propertyKey]=value},TO_STRING_TAG$2=wellKnownSymbol("toStringTag"),test={};test[TO_STRING_TAG$2]="z";var toStringTagSupport="[object z]"===String(test),TO_STRING_TAG$1=wellKnownSymbol("toStringTag"),CORRECT_ARGUMENTS="Arguments"==classofRaw(function(){return arguments}()),tryGet=function(it,key){try{return it[key]}catch(error){}},classof=toStringTagSupport?classofRaw:function(it){var O,tag,result;return void 0===it?"Undefined":null===it?"Null":"string"==typeof(tag=tryGet(O=Object(it),TO_STRING_TAG$1))?tag:CORRECT_ARGUMENTS?classofRaw(O):"Object"==(result=classofRaw(O))&&"function"==typeof O.callee?"Arguments":result},ITERATOR$2=wellKnownSymbol("iterator"),getIteratorMethod=function(it){if(null!=it)return it[ITERATOR$2]||it["@@iterator"]||iterators[classof(it)]},arrayFrom=function(arrayLike){var length,result,step,iterator,next,value,O=toObject(arrayLike),C="function"==typeof this?this:Array,argumentsLength=arguments.length,mapfn=argumentsLength>1?arguments[1]:void 0,mapping=void 0!==mapfn,iteratorMethod=getIteratorMethod(O),index=0;if(mapping&&(mapfn=functionBindContext(mapfn,argumentsLength>2?arguments[2]:void 0,2)),null==iteratorMethod||C==Array&&isArrayIteratorMethod(iteratorMethod))for(result=new C(length=toLength(O.length));length>index;index++)value=mapping?mapfn(O[index],index):O[index],createProperty(result,index,value);else for(next=(iterator=iteratorMethod.call(O)).next,result=new C;!(step=next.call(iterator)).done;index++)value=mapping?callWithSafeIterationClosing(iterator,mapfn,[step.value,index],!0):step.value,createProperty(result,index,value);return result.length=index,result},ITERATOR$1=wellKnownSymbol("iterator"),SAFE_CLOSING=!1;try{var called=0,iteratorWithReturn={next:function(){return{done:!!called++}},return:function(){SAFE_CLOSING=!0}};iteratorWithReturn[ITERATOR$1]=function(){return this},Array.from(iteratorWithReturn,(function(){throw 2}))}catch(error){}var checkCorrectnessOfIteration=function(exec,SKIP_CLOSING){if(!SKIP_CLOSING&&!SAFE_CLOSING)return!1;var ITERATION_SUPPORT=!1;try{var object={};object[ITERATOR$1]=function(){return{next:function(){return{done:ITERATION_SUPPORT=!0}}}},exec(object)}catch(error){}return ITERATION_SUPPORT},INCORRECT_ITERATION$1=!checkCorrectnessOfIteration((function(iterable){Array.from(iterable)}));_export({target:"Array",stat:!0,forced:INCORRECT_ITERATION$1},{from:arrayFrom}),path.Array.from;var UNSCOPABLES=wellKnownSymbol("unscopables"),ArrayPrototype=Array.prototype;null==ArrayPrototype[UNSCOPABLES]&&objectDefineProperty.f(ArrayPrototype,UNSCOPABLES,{configurable:!0,value:objectCreate(null)});var addToUnscopables=function(key){ArrayPrototype[UNSCOPABLES][key]=!0},$includes=arrayIncludes.includes;_export({target:"Array",proto:!0},{includes:function(el){return $includes(this,el,arguments.length>1?arguments[1]:void 0)}}),addToUnscopables("includes");var call=Function.call,entryUnbind=function(CONSTRUCTOR,METHOD,length){return functionBindContext(call,global_1[CONSTRUCTOR].prototype[METHOD],length)};entryUnbind("Array","includes");var isArray=Array.isArray||function(arg){return"Array"==classofRaw(arg)},flattenIntoArray=function(target,original,source,sourceLen,start,depth,mapper,thisArg){for(var element,targetIndex=start,sourceIndex=0,mapFn=!!mapper&&functionBindContext(mapper,thisArg,3);sourceIndex0&&isArray(element))targetIndex=flattenIntoArray(target,original,element,toLength(element.length),targetIndex,depth-1)-1;else{if(targetIndex>=9007199254740991)throw TypeError("Exceed the acceptable array length");target[targetIndex]=element}targetIndex++}sourceIndex++}return targetIndex},flattenIntoArray_1=flattenIntoArray,SPECIES$3=wellKnownSymbol("species"),arraySpeciesCreate=function(originalArray,length){var C;return isArray(originalArray)&&("function"!=typeof(C=originalArray.constructor)||C!==Array&&!isArray(C.prototype)?isObject(C)&&null===(C=C[SPECIES$3])&&(C=void 0):C=void 0),new(void 0===C?Array:C)(0===length?0:length)};_export({target:"Array",proto:!0},{flat:function(){var depthArg=arguments.length?arguments[0]:void 0,O=toObject(this),sourceLen=toLength(O.length),A=arraySpeciesCreate(O,0);return A.length=flattenIntoArray_1(A,O,O,sourceLen,0,void 0===depthArg?1:toInteger(depthArg)),A}}),addToUnscopables("flat"),entryUnbind("Array","flat");var push=[].push,createMethod$1=function(TYPE){var IS_MAP=1==TYPE,IS_FILTER=2==TYPE,IS_SOME=3==TYPE,IS_EVERY=4==TYPE,IS_FIND_INDEX=6==TYPE,IS_FILTER_OUT=7==TYPE,NO_HOLES=5==TYPE||IS_FIND_INDEX;return function($this,callbackfn,that,specificCreate){for(var value,result,O=toObject($this),self=indexedObject(O),boundFunction=functionBindContext(callbackfn,that,3),length=toLength(self.length),index=0,create=specificCreate||arraySpeciesCreate,target=IS_MAP?create($this,length):IS_FILTER||IS_FILTER_OUT?create($this,0):void 0;length>index;index++)if((NO_HOLES||index in self)&&(result=boundFunction(value=self[index],index,O),TYPE))if(IS_MAP)target[index]=result;else if(result)switch(TYPE){case 3:return!0;case 5:return value;case 6:return index;case 2:push.call(target,value)}else switch(TYPE){case 4:return!1;case 7:push.call(target,value)}return IS_FIND_INDEX?-1:IS_SOME||IS_EVERY?IS_EVERY:target}},arrayIteration={forEach:createMethod$1(0),map:createMethod$1(1),filter:createMethod$1(2),some:createMethod$1(3),every:createMethod$1(4),find:createMethod$1(5),findIndex:createMethod$1(6),filterOut:createMethod$1(7)},$find=arrayIteration.find,FIND="find",SKIPS_HOLES=!0;FIND in[]&&Array(1)[FIND]((function(){SKIPS_HOLES=!1})),_export({target:"Array",proto:!0,forced:SKIPS_HOLES},{find:function(callbackfn){return $find(this,callbackfn,arguments.length>1?arguments[1]:void 0)}}),addToUnscopables(FIND),entryUnbind("Array","find");var $assign=Object.assign,defineProperty=Object.defineProperty,objectAssign=!$assign||fails((function(){if(descriptors&&1!==$assign({b:1},$assign(defineProperty({},"a",{enumerable:!0,get:function(){defineProperty(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var A={},B={},symbol=Symbol();return A[symbol]=7,"abcdefghijklmnopqrst".split("").forEach((function(chr){B[chr]=chr})),7!=$assign({},A)[symbol]||"abcdefghijklmnopqrst"!=objectKeys($assign({},B)).join("")}))?function(target,source){for(var T=toObject(target),argumentsLength=arguments.length,index=1,getOwnPropertySymbols=objectGetOwnPropertySymbols.f,propertyIsEnumerable=objectPropertyIsEnumerable.f;argumentsLength>index;)for(var key,S=indexedObject(arguments[index++]),keys=getOwnPropertySymbols?objectKeys(S).concat(getOwnPropertySymbols(S)):objectKeys(S),length=keys.length,j=0;length>j;)key=keys[j++],descriptors&&!propertyIsEnumerable.call(S,key)||(T[key]=S[key]);return T}:$assign;_export({target:"Object",stat:!0,forced:Object.assign!==objectAssign},{assign:objectAssign}),path.Object.assign;var propertyIsEnumerable=objectPropertyIsEnumerable.f,createMethod=function(TO_ENTRIES){return function(it){for(var key,O=toIndexedObject(it),keys=objectKeys(O),length=keys.length,i=0,result=[];length>i;)key=keys[i++],descriptors&&!propertyIsEnumerable.call(O,key)||result.push(TO_ENTRIES?[key,O[key]]:O[key]);return result}},objectToArray={entries:createMethod(!0),values:createMethod(!1)},$entries=objectToArray.entries;_export({target:"Object",stat:!0},{entries:function(O){return $entries(O)}}),path.Object.entries;var $values=objectToArray.values;_export({target:"Object",stat:!0},{values:function(O){return $values(O)}}),path.Object.values;var Result=function(stopped,result){this.stopped=stopped,this.result=result},iterate=function(iterable,unboundFunction,options){var iterator,iterFn,index,length,result,next,step,that=options&&options.that,AS_ENTRIES=!(!options||!options.AS_ENTRIES),IS_ITERATOR=!(!options||!options.IS_ITERATOR),INTERRUPTED=!(!options||!options.INTERRUPTED),fn=functionBindContext(unboundFunction,that,1+AS_ENTRIES+INTERRUPTED),stop=function(condition){return iterator&&iteratorClose(iterator),new Result(!0,condition)},callFn=function(value){return AS_ENTRIES?(anObject(value),INTERRUPTED?fn(value[0],value[1],stop):fn(value[0],value[1])):INTERRUPTED?fn(value,stop):fn(value)};if(IS_ITERATOR)iterator=iterable;else{if("function"!=typeof(iterFn=getIteratorMethod(iterable)))throw TypeError("Target is not iterable");if(isArrayIteratorMethod(iterFn)){for(index=0,length=toLength(iterable.length);length>index;index++)if((result=callFn(iterable[index]))&&result instanceof Result)return result;return new Result(!1)}iterator=iterFn.call(iterable)}for(next=iterator.next;!(step=next.call(iterator)).done;){try{result=callFn(step.value)}catch(error){throw iteratorClose(iterator),error}if("object"==typeof result&&result&&result instanceof Result)return result}return new Result(!1)},$AggregateError=function(errors,message){var that=this;if(!(that instanceof $AggregateError))return new $AggregateError(errors,message);objectSetPrototypeOf&&(that=objectSetPrototypeOf(new Error(void 0),objectGetPrototypeOf(that))),void 0!==message&&createNonEnumerableProperty(that,"message",String(message));var errorsArray=[];return iterate(errors,errorsArray.push,{that:errorsArray}),createNonEnumerableProperty(that,"errors",errorsArray),that};$AggregateError.prototype=objectCreate(Error.prototype,{constructor:createPropertyDescriptor(5,$AggregateError),message:createPropertyDescriptor(5,""),name:createPropertyDescriptor(5,"AggregateError")}),_export({global:!0},{AggregateError:$AggregateError});var objectToString=toStringTagSupport?{}.toString:function(){return"[object "+classof(this)+"]"};toStringTagSupport||redefine(Object.prototype,"toString",objectToString,{unsafe:!0});var nativePromiseConstructor=global_1.Promise,redefineAll=function(target,src,options){for(var key in src)redefine(target,key,src[key],options);return target},SPECIES$2=wellKnownSymbol("species"),setSpecies=function(CONSTRUCTOR_NAME){var Constructor=getBuiltIn(CONSTRUCTOR_NAME),defineProperty=objectDefineProperty.f;descriptors&&Constructor&&!Constructor[SPECIES$2]&&defineProperty(Constructor,SPECIES$2,{configurable:!0,get:function(){return this}})},anInstance=function(it,Constructor,name){if(!(it instanceof Constructor))throw TypeError("Incorrect "+(name?name+" ":"")+"invocation");return it},SPECIES$1=wellKnownSymbol("species"),speciesConstructor=function(O,defaultConstructor){var S,C=anObject(O).constructor;return void 0===C||null==(S=anObject(C)[SPECIES$1])?defaultConstructor:aFunction(S)},engineIsIos=/(?:iphone|ipod|ipad).*applewebkit/i.test(engineUserAgent),engineIsNode="process"==classofRaw(global_1.process),location=global_1.location,set=global_1.setImmediate,clear=global_1.clearImmediate,process$2=global_1.process,MessageChannel=global_1.MessageChannel,Dispatch=global_1.Dispatch,counter=0,queue={},ONREADYSTATECHANGE="onreadystatechange",defer,channel,port,run=function(id){if(queue.hasOwnProperty(id)){var fn=queue[id];delete queue[id],fn()}},runner=function(id){return function(){run(id)}},listener=function(event){run(event.data)},post=function(id){global_1.postMessage(id+"",location.protocol+"//"+location.host)};set&&clear||(set=function(fn){for(var args=[],i=1;arguments.length>i;)args.push(arguments[i++]);return queue[++counter]=function(){("function"==typeof fn?fn:Function(fn)).apply(void 0,args)},defer(counter),counter},clear=function(id){delete queue[id]},engineIsNode?defer=function(id){process$2.nextTick(runner(id))}:Dispatch&&Dispatch.now?defer=function(id){Dispatch.now(runner(id))}:MessageChannel&&!engineIsIos?(channel=new MessageChannel,port=channel.port2,channel.port1.onmessage=listener,defer=functionBindContext(port.postMessage,port,1)):global_1.addEventListener&&"function"==typeof postMessage&&!global_1.importScripts&&location&&"file:"!==location.protocol&&!fails(post)?(defer=post,global_1.addEventListener("message",listener,!1)):defer=ONREADYSTATECHANGE in documentCreateElement("script")?function(id){html.appendChild(documentCreateElement("script"))[ONREADYSTATECHANGE]=function(){html.removeChild(this),run(id)}}:function(id){setTimeout(runner(id),0)});var task$1={set:set,clear:clear},engineIsWebosWebkit=/web0s(?!.*chrome)/i.test(engineUserAgent),getOwnPropertyDescriptor$1=objectGetOwnPropertyDescriptor.f,macrotask=task$1.set,MutationObserver=global_1.MutationObserver||global_1.WebKitMutationObserver,document$2=global_1.document,process$1=global_1.process,Promise$1=global_1.Promise,queueMicrotaskDescriptor=getOwnPropertyDescriptor$1(global_1,"queueMicrotask"),queueMicrotask=queueMicrotaskDescriptor&&queueMicrotaskDescriptor.value,flush,head,last,notify$1,toggle,node,promise,then;queueMicrotask||(flush=function(){var parent,fn;for(engineIsNode&&(parent=process$1.domain)&&parent.exit();head;){fn=head.fn,head=head.next;try{fn()}catch(error){throw head?notify$1():last=void 0,error}}last=void 0,parent&&parent.enter()},engineIsIos||engineIsNode||engineIsWebosWebkit||!MutationObserver||!document$2?Promise$1&&Promise$1.resolve?(promise=Promise$1.resolve(void 0),promise.constructor=Promise$1,then=promise.then,notify$1=function(){then.call(promise,flush)}):notify$1=engineIsNode?function(){process$1.nextTick(flush)}:function(){macrotask.call(global_1,flush)}:(toggle=!0,node=document$2.createTextNode(""),new MutationObserver(flush).observe(node,{characterData:!0}),notify$1=function(){node.data=toggle=!toggle}));var microtask=queueMicrotask||function(fn){var task={fn:fn,next:void 0};last&&(last.next=task),head||(head=task,notify$1()),last=task},PromiseCapability=function(C){var resolve,reject;this.promise=new C((function($$resolve,$$reject){if(void 0!==resolve||void 0!==reject)throw TypeError("Bad Promise constructor");resolve=$$resolve,reject=$$reject})),this.resolve=aFunction(resolve),this.reject=aFunction(reject)},f=function(C){return new PromiseCapability(C)},newPromiseCapability$1={f:f},promiseResolve=function(C,x){if(anObject(C),isObject(x)&&x.constructor===C)return x;var promiseCapability=newPromiseCapability$1.f(C);return(0,promiseCapability.resolve)(x),promiseCapability.promise},hostReportErrors=function(a,b){var console=global_1.console;console&&console.error&&(1===arguments.length?console.error(a):console.error(a,b))},perform=function(exec){try{return{error:!1,value:exec()}}catch(error){return{error:!0,value:error}}},engineIsBrowser="object"==typeof window,task=task$1.set,SPECIES=wellKnownSymbol("species"),PROMISE="Promise",getInternalState$1=internalState.get,setInternalState$1=internalState.set,getInternalPromiseState=internalState.getterFor(PROMISE),NativePromisePrototype=nativePromiseConstructor&&nativePromiseConstructor.prototype,PromiseConstructor=nativePromiseConstructor,PromiseConstructorPrototype=NativePromisePrototype,TypeError$1=global_1.TypeError,document$1=global_1.document,process=global_1.process,newPromiseCapability=newPromiseCapability$1.f,newGenericPromiseCapability=newPromiseCapability,DISPATCH_EVENT=!!(document$1&&document$1.createEvent&&global_1.dispatchEvent),NATIVE_REJECTION_EVENT="function"==typeof PromiseRejectionEvent,UNHANDLED_REJECTION="unhandledrejection",REJECTION_HANDLED="rejectionhandled",PENDING=0,FULFILLED=1,REJECTED=2,HANDLED=1,UNHANDLED=2,SUBCLASSING=!1,Internal,OwnPromiseCapability,PromiseWrapper,nativeThen,FORCED=isForced_1(PROMISE,(function(){var PROMISE_CONSTRUCTOR_SOURCE=inspectSource(PromiseConstructor),GLOBAL_CORE_JS_PROMISE=PROMISE_CONSTRUCTOR_SOURCE!==String(PromiseConstructor);if(!GLOBAL_CORE_JS_PROMISE&&66===engineV8Version)return!0;if(engineV8Version>=51&&/native code/.test(PROMISE_CONSTRUCTOR_SOURCE))return!1;var promise=new PromiseConstructor((function(resolve){resolve(1)})),FakePromise=function(exec){exec((function(){}),(function(){}))};return(promise.constructor={})[SPECIES]=FakePromise,!(SUBCLASSING=promise.then((function(){}))instanceof FakePromise)||!GLOBAL_CORE_JS_PROMISE&&engineIsBrowser&&!NATIVE_REJECTION_EVENT})),INCORRECT_ITERATION=FORCED||!checkCorrectnessOfIteration((function(iterable){PromiseConstructor.all(iterable).catch((function(){}))})),isThenable=function(it){var then;return!(!isObject(it)||"function"!=typeof(then=it.then))&&then},notify=function(state,isReject){if(!state.notified){state.notified=!0;var chain=state.reactions;microtask((function(){for(var value=state.value,ok=state.state==FULFILLED,index=0;chain.length>index;){var result,then,exited,reaction=chain[index++],handler=ok?reaction.ok:reaction.fail,resolve=reaction.resolve,reject=reaction.reject,domain=reaction.domain;try{handler?(ok||(state.rejection===UNHANDLED&&onHandleUnhandled(state),state.rejection=HANDLED),!0===handler?result=value:(domain&&domain.enter(),result=handler(value),domain&&(domain.exit(),exited=!0)),result===reaction.promise?reject(TypeError$1("Promise-chain cycle")):(then=isThenable(result))?then.call(result,resolve,reject):resolve(result)):reject(value)}catch(error){domain&&!exited&&domain.exit(),reject(error)}}state.reactions=[],state.notified=!1,isReject&&!state.rejection&&onUnhandled(state)}))}},dispatchEvent=function(name,promise,reason){var event,handler;DISPATCH_EVENT?((event=document$1.createEvent("Event")).promise=promise,event.reason=reason,event.initEvent(name,!1,!0),global_1.dispatchEvent(event)):event={promise:promise,reason:reason},!NATIVE_REJECTION_EVENT&&(handler=global_1["on"+name])?handler(event):name===UNHANDLED_REJECTION&&hostReportErrors("Unhandled promise rejection",reason)},onUnhandled=function(state){task.call(global_1,(function(){var result,promise=state.facade,value=state.value;if(isUnhandled(state)&&(result=perform((function(){engineIsNode?process.emit("unhandledRejection",value,promise):dispatchEvent(UNHANDLED_REJECTION,promise,value)})),state.rejection=engineIsNode||isUnhandled(state)?UNHANDLED:HANDLED,result.error))throw result.value}))},isUnhandled=function(state){return state.rejection!==HANDLED&&!state.parent},onHandleUnhandled=function(state){task.call(global_1,(function(){var promise=state.facade;engineIsNode?process.emit("rejectionHandled",promise):dispatchEvent(REJECTION_HANDLED,promise,state.value)}))},bind=function(fn,state,unwrap){return function(value){fn(state,value,unwrap)}},internalReject=function(state,value,unwrap){state.done||(state.done=!0,unwrap&&(state=unwrap),state.value=value,state.state=REJECTED,notify(state,!0))},internalResolve=function(state,value,unwrap){if(!state.done){state.done=!0,unwrap&&(state=unwrap);try{if(state.facade===value)throw TypeError$1("Promise can't be resolved itself");var then=isThenable(value);then?microtask((function(){var wrapper={done:!1};try{then.call(value,bind(internalResolve,wrapper,state),bind(internalReject,wrapper,state))}catch(error){internalReject(wrapper,error,state)}})):(state.value=value,state.state=FULFILLED,notify(state,!1))}catch(error){internalReject({done:!1},error,state)}}};if(FORCED&&(PromiseConstructor=function(executor){anInstance(this,PromiseConstructor,PROMISE),aFunction(executor),Internal.call(this);var state=getInternalState$1(this);try{executor(bind(internalResolve,state),bind(internalReject,state))}catch(error){internalReject(state,error)}},PromiseConstructorPrototype=PromiseConstructor.prototype,Internal=function(executor){setInternalState$1(this,{type:PROMISE,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:PENDING,value:void 0})},Internal.prototype=redefineAll(PromiseConstructorPrototype,{then:function(onFulfilled,onRejected){var state=getInternalPromiseState(this),reaction=newPromiseCapability(speciesConstructor(this,PromiseConstructor));return reaction.ok="function"!=typeof onFulfilled||onFulfilled,reaction.fail="function"==typeof onRejected&&onRejected,reaction.domain=engineIsNode?process.domain:void 0,state.parent=!0,state.reactions.push(reaction),state.state!=PENDING&¬ify(state,!1),reaction.promise},catch:function(onRejected){return this.then(void 0,onRejected)}}),OwnPromiseCapability=function(){var promise=new Internal,state=getInternalState$1(promise);this.promise=promise,this.resolve=bind(internalResolve,state),this.reject=bind(internalReject,state)},newPromiseCapability$1.f=newPromiseCapability=function(C){return C===PromiseConstructor||C===PromiseWrapper?new OwnPromiseCapability(C):newGenericPromiseCapability(C)},"function"==typeof nativePromiseConstructor&&NativePromisePrototype!==Object.prototype)){nativeThen=NativePromisePrototype.then,SUBCLASSING||(redefine(NativePromisePrototype,"then",(function(onFulfilled,onRejected){var that=this;return new PromiseConstructor((function(resolve,reject){nativeThen.call(that,resolve,reject)})).then(onFulfilled,onRejected)}),{unsafe:!0}),redefine(NativePromisePrototype,"catch",PromiseConstructorPrototype.catch,{unsafe:!0}));try{delete NativePromisePrototype.constructor}catch(error){}objectSetPrototypeOf&&objectSetPrototypeOf(NativePromisePrototype,PromiseConstructorPrototype)}_export({global:!0,wrap:!0,forced:FORCED},{Promise:PromiseConstructor}),setToStringTag(PromiseConstructor,PROMISE,!1),setSpecies(PROMISE),PromiseWrapper=getBuiltIn(PROMISE),_export({target:PROMISE,stat:!0,forced:FORCED},{reject:function(r){var capability=newPromiseCapability(this);return capability.reject.call(void 0,r),capability.promise}}),_export({target:PROMISE,stat:!0,forced:FORCED},{resolve:function(x){return promiseResolve(this,x)}}),_export({target:PROMISE,stat:!0,forced:INCORRECT_ITERATION},{all:function(iterable){var C=this,capability=newPromiseCapability(C),resolve=capability.resolve,reject=capability.reject,result=perform((function(){var $promiseResolve=aFunction(C.resolve),values=[],counter=0,remaining=1;iterate(iterable,(function(promise){var index=counter++,alreadyCalled=!1;values.push(void 0),remaining++,$promiseResolve.call(C,promise).then((function(value){alreadyCalled||(alreadyCalled=!0,values[index]=value,--remaining||resolve(values))}),reject)})),--remaining||resolve(values)}));return result.error&&reject(result.value),capability.promise},race:function(iterable){var C=this,capability=newPromiseCapability(C),reject=capability.reject,result=perform((function(){var $promiseResolve=aFunction(C.resolve);iterate(iterable,(function(promise){$promiseResolve.call(C,promise).then(capability.resolve,reject)}))}));return result.error&&reject(result.value),capability.promise}}),_export({target:"Promise",stat:!0},{allSettled:function(iterable){var C=this,capability=newPromiseCapability$1.f(C),resolve=capability.resolve,reject=capability.reject,result=perform((function(){var promiseResolve=aFunction(C.resolve),values=[],counter=0,remaining=1;iterate(iterable,(function(promise){var index=counter++,alreadyCalled=!1;values.push(void 0),remaining++,promiseResolve.call(C,promise).then((function(value){alreadyCalled||(alreadyCalled=!0,values[index]={status:"fulfilled",value:value},--remaining||resolve(values))}),(function(error){alreadyCalled||(alreadyCalled=!0,values[index]={status:"rejected",reason:error},--remaining||resolve(values))}))})),--remaining||resolve(values)}));return result.error&&reject(result.value),capability.promise}});var PROMISE_ANY_ERROR="No one promise resolved";_export({target:"Promise",stat:!0},{any:function(iterable){var C=this,capability=newPromiseCapability$1.f(C),resolve=capability.resolve,reject=capability.reject,result=perform((function(){var promiseResolve=aFunction(C.resolve),errors=[],counter=0,remaining=1,alreadyResolved=!1;iterate(iterable,(function(promise){var index=counter++,alreadyRejected=!1;errors.push(void 0),remaining++,promiseResolve.call(C,promise).then((function(value){alreadyRejected||alreadyResolved||(alreadyResolved=!0,resolve(value))}),(function(error){alreadyRejected||alreadyResolved||(alreadyRejected=!0,errors[index]=error,--remaining||reject(new(getBuiltIn("AggregateError"))(errors,PROMISE_ANY_ERROR)))}))})),--remaining||reject(new(getBuiltIn("AggregateError"))(errors,PROMISE_ANY_ERROR))}));return result.error&&reject(result.value),capability.promise}});var NON_GENERIC=!!nativePromiseConstructor&&fails((function(){nativePromiseConstructor.prototype.finally.call({then:function(){}},(function(){}))}));if(_export({target:"Promise",proto:!0,real:!0,forced:NON_GENERIC},{finally:function(onFinally){var C=speciesConstructor(this,getBuiltIn("Promise")),isFunction="function"==typeof onFinally;return this.then(isFunction?function(x){return promiseResolve(C,onFinally()).then((function(){return x}))}:onFinally,isFunction?function(e){return promiseResolve(C,onFinally()).then((function(){throw e}))}:onFinally)}}),"function"==typeof nativePromiseConstructor){var method=getBuiltIn("Promise").prototype.finally;nativePromiseConstructor.prototype.finally!==method&&redefine(nativePromiseConstructor.prototype,"finally",method,{unsafe:!0})}var domIterables={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0},ARRAY_ITERATOR="Array Iterator",setInternalState=internalState.set,getInternalState=internalState.getterFor(ARRAY_ITERATOR),es_array_iterator=defineIterator(Array,"Array",(function(iterated,kind){setInternalState(this,{type:ARRAY_ITERATOR,target:toIndexedObject(iterated),index:0,kind:kind})}),(function(){var state=getInternalState(this),target=state.target,kind=state.kind,index=state.index++;return!target||index>=target.length?(state.target=void 0,{value:void 0,done:!0}):"keys"==kind?{value:index,done:!1}:"values"==kind?{value:target[index],done:!1}:{value:[index,target[index]],done:!1}}),"values");iterators.Arguments=iterators.Array,addToUnscopables("keys"),addToUnscopables("values"),addToUnscopables("entries");var ITERATOR=wellKnownSymbol("iterator"),TO_STRING_TAG=wellKnownSymbol("toStringTag"),ArrayValues=es_array_iterator.values;for(var COLLECTION_NAME in domIterables){var Collection=global_1[COLLECTION_NAME],CollectionPrototype=Collection&&Collection.prototype;if(CollectionPrototype){if(CollectionPrototype[ITERATOR]!==ArrayValues)try{createNonEnumerableProperty(CollectionPrototype,ITERATOR,ArrayValues)}catch(error){CollectionPrototype[ITERATOR]=ArrayValues}if(CollectionPrototype[TO_STRING_TAG]||createNonEnumerableProperty(CollectionPrototype,TO_STRING_TAG,COLLECTION_NAME),domIterables[COLLECTION_NAME])for(var METHOD_NAME in es_array_iterator)if(CollectionPrototype[METHOD_NAME]!==es_array_iterator[METHOD_NAME])try{createNonEnumerableProperty(CollectionPrototype,METHOD_NAME,es_array_iterator[METHOD_NAME])}catch(error){CollectionPrototype[METHOD_NAME]=es_array_iterator[METHOD_NAME]}}}path.Promise,_export({target:"Promise",stat:!0},{try:function(callbackfn){var promiseCapability=newPromiseCapability$1.f(this),result=perform(callbackfn);return(result.error?promiseCapability.reject:promiseCapability.resolve)(result.value),promiseCapability.promise}});var MATCH$1=wellKnownSymbol("match"),isRegexp=function(it){var isRegExp;return isObject(it)&&(void 0!==(isRegExp=it[MATCH$1])?!!isRegExp:"RegExp"==classofRaw(it))},notARegexp=function(it){if(isRegexp(it))throw TypeError("The method doesn't accept regular expressions");return it},MATCH=wellKnownSymbol("match"),correctIsRegexpLogic=function(METHOD_NAME){var regexp=/./;try{"/./"[METHOD_NAME](regexp)}catch(error1){try{return regexp[MATCH]=!1,"/./"[METHOD_NAME](regexp)}catch(error2){}}return!1},getOwnPropertyDescriptor=objectGetOwnPropertyDescriptor.f,$startsWith="".startsWith,min=Math.min,CORRECT_IS_REGEXP_LOGIC=correctIsRegexpLogic("startsWith"),MDN_POLYFILL_BUG=!(CORRECT_IS_REGEXP_LOGIC||(descriptor=getOwnPropertyDescriptor(String.prototype,"startsWith"),!descriptor||descriptor.writable)),descriptor;_export({target:"String",proto:!0,forced:!MDN_POLYFILL_BUG&&!CORRECT_IS_REGEXP_LOGIC},{startsWith:function(searchString){var that=String(requireObjectCoercible(this));notARegexp(searchString);var index=toLength(min(arguments.length>1?arguments[1]:void 0,that.length)),search=String(searchString);return $startsWith?$startsWith.call(that,search,index):that.slice(index,index+search.length)===search}}),entryUnbind("String","startsWith");var global$1="undefined"!=typeof globalThis&&globalThis||"undefined"!=typeof self&&self||void 0!==global$1&&global$1,support={searchParams:"URLSearchParams"in global$1,iterable:"Symbol"in global$1&&"iterator"in Symbol,blob:"FileReader"in global$1&&"Blob"in global$1&&function(){try{return new Blob,!0}catch(e){return!1}}(),formData:"FormData"in global$1,arrayBuffer:"ArrayBuffer"in global$1};function isDataView(obj){return obj&&DataView.prototype.isPrototypeOf(obj)}if(support.arrayBuffer)var viewClasses=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],isArrayBufferView=ArrayBuffer.isView||function(obj){return obj&&viewClasses.indexOf(Object.prototype.toString.call(obj))>-1};function normalizeName(name){if("string"!=typeof name&&(name=String(name)),/[^a-z0-9\-#$%&'*+.^_`|~!]/i.test(name)||""===name)throw new TypeError('Invalid character in header field name: "'+name+'"');return name.toLowerCase()}function normalizeValue(value){return"string"!=typeof value&&(value=String(value)),value}function iteratorFor(items){var iterator={next:function(){var value=items.shift();return{done:void 0===value,value:value}}};return support.iterable&&(iterator[Symbol.iterator]=function(){return iterator}),iterator}function Headers(headers){this.map={},headers instanceof Headers?headers.forEach((function(value,name){this.append(name,value)}),this):Array.isArray(headers)?headers.forEach((function(header){this.append(header[0],header[1])}),this):headers&&Object.getOwnPropertyNames(headers).forEach((function(name){this.append(name,headers[name])}),this)}function consumed(body){if(body.bodyUsed)return Promise.reject(new TypeError("Already read"));body.bodyUsed=!0}function fileReaderReady(reader){return new Promise((function(resolve,reject){reader.onload=function(){resolve(reader.result)},reader.onerror=function(){reject(reader.error)}}))}function readBlobAsArrayBuffer(blob){var reader=new FileReader,promise=fileReaderReady(reader);return reader.readAsArrayBuffer(blob),promise}function readBlobAsText(blob){var reader=new FileReader,promise=fileReaderReady(reader);return reader.readAsText(blob),promise}function readArrayBufferAsText(buf){for(var view=new Uint8Array(buf),chars=new Array(view.length),i=0;i-1?upcased:method}function Request(input,options){if(!(this instanceof Request))throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');var body=(options=options||{}).body;if(input instanceof Request){if(input.bodyUsed)throw new TypeError("Already read");this.url=input.url,this.credentials=input.credentials,options.headers||(this.headers=new Headers(input.headers)),this.method=input.method,this.mode=input.mode,this.signal=input.signal,body||null==input._bodyInit||(body=input._bodyInit,input.bodyUsed=!0)}else this.url=String(input);if(this.credentials=options.credentials||this.credentials||"same-origin",!options.headers&&this.headers||(this.headers=new Headers(options.headers)),this.method=normalizeMethod(options.method||this.method||"GET"),this.mode=options.mode||this.mode||null,this.signal=options.signal||this.signal,this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&body)throw new TypeError("Body not allowed for GET or HEAD requests");if(this._initBody(body),!("GET"!==this.method&&"HEAD"!==this.method||"no-store"!==options.cache&&"no-cache"!==options.cache)){var reParamSearch=/([?&])_=[^&]*/;if(reParamSearch.test(this.url))this.url=this.url.replace(reParamSearch,"$1_="+(new Date).getTime());else{this.url+=(/\?/.test(this.url)?"&":"?")+"_="+(new Date).getTime()}}}function decode(body){var form=new FormData;return body.trim().split("&").forEach((function(bytes){if(bytes){var split=bytes.split("="),name=split.shift().replace(/\+/g," "),value=split.join("=").replace(/\+/g," ");form.append(decodeURIComponent(name),decodeURIComponent(value))}})),form}function parseHeaders(rawHeaders){var headers=new Headers;return rawHeaders.replace(/\r?\n[\t ]+/g," ").split("\r").map((function(header){return 0===header.indexOf("\n")?header.substr(1,header.length):header})).forEach((function(line){var parts=line.split(":"),key=parts.shift().trim();if(key){var value=parts.join(":").trim();headers.append(key,value)}})),headers}function Response(bodyInit,options){if(!(this instanceof Response))throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');options||(options={}),this.type="default",this.status=void 0===options.status?200:options.status,this.ok=this.status>=200&&this.status<300,this.statusText=void 0===options.statusText?"":""+options.statusText,this.headers=new Headers(options.headers),this.url=options.url||"",this._initBody(bodyInit)}Request.prototype.clone=function(){return new Request(this,{body:this._bodyInit})},Body.call(Request.prototype),Body.call(Response.prototype),Response.prototype.clone=function(){return new Response(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new Headers(this.headers),url:this.url})},Response.error=function(){var response=new Response(null,{status:0,statusText:""});return response.type="error",response};var redirectStatuses=[301,302,303,307,308];Response.redirect=function(url,status){if(-1===redirectStatuses.indexOf(status))throw new RangeError("Invalid status code");return new Response(null,{status:status,headers:{location:url}})};var DOMException=global$1.DOMException;try{new DOMException}catch(err){DOMException=function(message,name){this.message=message,this.name=name;var error=Error(message);this.stack=error.stack},DOMException.prototype=Object.create(Error.prototype),DOMException.prototype.constructor=DOMException}function fetch$1(input,init){return new Promise((function(resolve,reject){var request=new Request(input,init);if(request.signal&&request.signal.aborted)return reject(new DOMException("Aborted","AbortError"));var xhr=new XMLHttpRequest;function abortXhr(){xhr.abort()}xhr.onload=function(){var options={status:xhr.status,statusText:xhr.statusText,headers:parseHeaders(xhr.getAllResponseHeaders()||"")};options.url="responseURL"in xhr?xhr.responseURL:options.headers.get("X-Request-URL");var body="response"in xhr?xhr.response:xhr.responseText;setTimeout((function(){resolve(new Response(body,options))}),0)},xhr.onerror=function(){setTimeout((function(){reject(new TypeError("Network request failed"))}),0)},xhr.ontimeout=function(){setTimeout((function(){reject(new TypeError("Network request failed"))}),0)},xhr.onabort=function(){setTimeout((function(){reject(new DOMException("Aborted","AbortError"))}),0)},xhr.open(request.method,function(url){try{return""===url&&global$1.location.href?global$1.location.href:url}catch(e){return url}}(request.url),!0),"include"===request.credentials?xhr.withCredentials=!0:"omit"===request.credentials&&(xhr.withCredentials=!1),"responseType"in xhr&&(support.blob?xhr.responseType="blob":support.arrayBuffer&&request.headers.get("Content-Type")&&-1!==request.headers.get("Content-Type").indexOf("application/octet-stream")&&(xhr.responseType="arraybuffer")),!init||"object"!=typeof init.headers||init.headers instanceof Headers?request.headers.forEach((function(value,name){xhr.setRequestHeader(name,value)})):Object.getOwnPropertyNames(init.headers).forEach((function(name){xhr.setRequestHeader(name,normalizeValue(init.headers[name]))})),request.signal&&(request.signal.addEventListener("abort",abortXhr),xhr.onreadystatechange=function(){4===xhr.readyState&&request.signal.removeEventListener("abort",abortXhr)}),xhr.send(void 0===request._bodyInit?null:request._bodyInit)}))}fetch$1.polyfill=!0,global$1.fetch||(global$1.fetch=fetch$1,global$1.Headers=Headers,global$1.Request=Request,global$1.Response=Response),null==Element.prototype.getAttributeNames&&(Element.prototype.getAttributeNames=function(){for(var attributes=this.attributes,length=attributes.length,result=new Array(length),i=0;i=0&&matches.item(i)!==this;);return i>-1}),Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector),Element.prototype.closest||(Element.prototype.closest=function(s){var el=this;do{if(el.matches(s))return el;el=el.parentElement||el.parentNode}while(null!==el&&1===el.nodeType);return null});var Connection=function(){function Connection(){_classCallCheck(this,Connection)}return _createClass(Connection,[{key:"onMessage",value:function(message,payload){message.component.receiveMessage(message,payload)}},{key:"onError",value:function(message,status){return message.component.messageSendFailed(),store$2.onErrorCallback(status)}},{key:"showExpiredMessage",value:function(){confirm("This page has expired due to inactivity.\nWould you like to refresh the page?")&&window.location.reload()}},{key:"sendMessage",value:function(message){var _this=this,payload=message.payload(),csrfToken=getCsrfToken(),socketId=this.getSocketId();if(window.__testing_request_interceptor)return window.__testing_request_interceptor(payload,this);fetch("".concat(window.livewire_app_url,"/livewire/message/").concat(payload.fingerprint.name),{method:"POST",body:JSON.stringify(payload),credentials:"same-origin",headers:_objectSpread2(_objectSpread2({"Content-Type":"application/json",Accept:"text/html, application/xhtml+xml","X-Livewire":!0,Referer:window.location.href},csrfToken&&{"X-CSRF-TOKEN":csrfToken}),socketId&&{"X-Socket-ID":socketId})}).then((function(response){if(response.ok)response.text().then((function(response){_this.isOutputFromDump(response)?(_this.onError(message),_this.showHtmlModal(response)):_this.onMessage(message,JSON.parse(response))}));else{if(!1===_this.onError(message,response.status))return;if(419===response.status){if(store$2.sessionHasExpired)return;store$2.sessionHasExpired=!0,_this.showExpiredMessage()}else response.text().then((function(response){_this.showHtmlModal(response)}))}})).catch((function(){_this.onError(message)}))}},{key:"isOutputFromDump",value:function(output){return!!output.match(/ diff --git a/resources/assets/js/components/importer/importer-file.vue b/resources/assets/js/components/importer/importer-file.vue index 17313aae06..83970614e5 100644 --- a/resources/assets/js/components/importer/importer-file.vue +++ b/resources/assets/js/components/importer/importer-file.vue @@ -141,6 +141,9 @@ {id: 'username', text: 'Username' }, {id: 'department', text: 'Department' }, ], + accessories:[ + {id: 'model_number', text: 'Model Number'}, + ], assets: [ {id: 'asset_tag', text: 'Asset Tag' }, {id: 'asset_model', text: 'Model Name' }, @@ -208,7 +211,10 @@ .concat(this.columnOptions.assets) .concat(this.columnOptions.customFields) .sort(sorter); - + case 'accessory': + return this.columnOptions.general + .concat(this.columnOptions.accessories) + .sort(sorter); case 'consumable': return this.columnOptions.general .concat(this.columnOptions.consumables) @@ -300,7 +306,7 @@ } }, components: { - select2: require('../select2.vue') + select2: require('../select2.vue').default } } \ No newline at end of file diff --git a/resources/assets/js/components/importer/importer.vue b/resources/assets/js/components/importer/importer.vue index f15e85a55e..ae98bd9505 100644 --- a/resources/assets/js/components/importer/importer.vue +++ b/resources/assets/js/components/importer/importer.vue @@ -120,9 +120,9 @@ }, components: { - alert: require('../alert.vue'), - errors: require('./importer-errors.vue'), - importFile: require('./importer-file.vue'), + alert: require('../alert.vue').default, + errors: require('./importer-errors.vue').default, + importFile: require('./importer-file.vue').default, } } diff --git a/resources/assets/js/components/passport/PersonalAccessTokens.vue b/resources/assets/js/components/passport/PersonalAccessTokens.vue index aff75c36da..b2b41e3b6f 100644 --- a/resources/assets/js/components/passport/PersonalAccessTokens.vue +++ b/resources/assets/js/components/passport/PersonalAccessTokens.vue @@ -56,7 +56,7 @@ - + diff --git a/resources/assets/js/components/select2.vue b/resources/assets/js/components/select2.vue index 16e01ccb0b..7b679800e9 100644 --- a/resources/assets/js/components/select2.vue +++ b/resources/assets/js/components/select2.vue @@ -12,7 +12,7 @@ @endpush diff --git a/resources/views/departments/edit.blade.php b/resources/views/departments/edit.blade.php index 739f19f1f2..0a2c1a7d46 100644 --- a/resources/views/departments/edit.blade.php +++ b/resources/views/departments/edit.blade.php @@ -12,6 +12,8 @@ @if (\App\Models\Company::canManageUsersCompanies()) @include ('partials.forms.edit.company-select', ['translated_name' => trans('general.company'), 'fieldname' => 'company_id']) + @else + @endif diff --git a/resources/views/depreciations/edit.blade.php b/resources/views/depreciations/edit.blade.php index 95df4eda1a..b4a87e5065 100755 --- a/resources/views/depreciations/edit.blade.php +++ b/resources/views/depreciations/edit.blade.php @@ -15,12 +15,30 @@ -
-
- +
+ + {!! $errors->first('months', '') !!}
-
- {!! $errors->first('months', '') !!}
+ +
+ +
+ +
+ {!! $errors->first('depreciation_min', '') !!} +
+ +
+ +
+ +
+ {!! $errors->first('depreciation_min', '') !!} +
@stop diff --git a/resources/views/errors/403.blade.php b/resources/views/errors/403.blade.php index 3501553cd2..8a867e3776 100644 --- a/resources/views/errors/403.blade.php +++ b/resources/views/errors/403.blade.php @@ -18,7 +18,7 @@
-

403 Forbidden.

+

403 Forbidden.

Sad panda. You are not authorized to do the thing. Maybe return to the dashboard, or contact your administrator.

diff --git a/resources/views/errors/404.blade.php b/resources/views/errors/404.blade.php index a93b9c7ad9..03e140bd3a 100644 --- a/resources/views/errors/404.blade.php +++ b/resources/views/errors/404.blade.php @@ -18,7 +18,7 @@
-

404 Page not found.

+

404 Page not found.

Sad panda. We could not find the page you were looking for. You should maybe return to the dashboard. diff --git a/resources/views/errors/503.blade.php b/resources/views/errors/503.blade.php index 1789630724..0d330fb8e5 100644 --- a/resources/views/errors/503.blade.php +++ b/resources/views/errors/503.blade.php @@ -27,7 +27,7 @@ System Unavailable

-

System Unavailable

+

System Unavailable

{!! json_decode(file_get_contents(storage_path('framework/down')), true)['message'] !!}

diff --git a/resources/views/groups/edit.blade.php b/resources/views/groups/edit.blade.php index 838ee47453..8f280dfe9a 100755 --- a/resources/views/groups/edit.blade.php +++ b/resources/views/groups/edit.blade.php @@ -57,7 +57,7 @@
- {!! $errors->first('name', '') !!} + {!! $errors->first('name', '') !!}
diff --git a/resources/views/groups/view.blade.php b/resources/views/groups/view.blade.php index 75d6495c56..84e91c9dde 100644 --- a/resources/views/groups/view.blade.php +++ b/resources/views/groups/view.blade.php @@ -52,7 +52,7 @@ @if (is_array($group->decodePermissions()))
    @foreach ($group->decodePermissions() as $permission_name => $permission) -
  • {!! ($permission == '1') ? 'GRANTED: ' : 'DENIED: ' !!} {{ e(str_replace('.', ': ', ucwords($permission_name))) }}
  • +
  • {!! ($permission == '1') ? 'GRANTED: ' : 'DENIED: ' !!} {{ e(str_replace('.', ': ', ucwords($permission_name))) }}
  • @endforeach
diff --git a/resources/views/hardware/audit.blade.php b/resources/views/hardware/audit.blade.php index 6823fcd8d6..ed395ec128 100644 --- a/resources/views/hardware/audit.blade.php +++ b/resources/views/hardware/audit.blade.php @@ -74,9 +74,9 @@
- +
- {!! $errors->first('next_audit_date', '') !!} + {!! $errors->first('next_audit_date', '') !!}
@@ -86,7 +86,7 @@ {{ Form::label('note', trans('admin/hardware/form.notes'), array('class' => 'col-md-3 control-label')) }}
- {!! $errors->first('note', '') !!} + {!! $errors->first('note', '') !!}
@@ -102,7 +102,7 @@
diff --git a/resources/views/hardware/bulk-checkout.blade.php b/resources/views/hardware/bulk-checkout.blade.php index 9cf1d9d11a..65b2072175 100644 --- a/resources/views/hardware/bulk-checkout.blade.php +++ b/resources/views/hardware/bulk-checkout.blade.php @@ -40,9 +40,9 @@
- +
- {!! $errors->first('checkout_at', '') !!} + {!! $errors->first('checkout_at', '') !!}
@@ -52,9 +52,9 @@
- +
- {!! $errors->first('expected_checkin', '') !!} + {!! $errors->first('expected_checkin', '') !!}
@@ -64,7 +64,7 @@ {{ Form::label('note', trans('admin/hardware/form.notes'), array('class' => 'col-md-3 control-label')) }}
- {!! $errors->first('note', '') !!} + {!! $errors->first('note', '') !!}
@@ -80,7 +80,7 @@ diff --git a/resources/views/hardware/bulk-delete.blade.php b/resources/views/hardware/bulk-delete.blade.php index f08209f26e..ed36296605 100644 --- a/resources/views/hardware/bulk-delete.blade.php +++ b/resources/views/hardware/bulk-delete.blade.php @@ -59,7 +59,7 @@ diff --git a/resources/views/hardware/bulk.blade.php b/resources/views/hardware/bulk.blade.php index 16b6d877eb..ae84e9008a 100755 --- a/resources/views/hardware/bulk.blade.php +++ b/resources/views/hardware/bulk.blade.php @@ -20,7 +20,7 @@

{{ trans('admin/hardware/form.bulk_update_help') }}

- {{ trans('admin/hardware/form.bulk_update_warn', ['asset_count' => count($assets)]) }} + {{ trans('admin/hardware/form.bulk_update_warn', ['asset_count' => count($assets)]) }}
@@ -34,9 +34,9 @@
- +
- {!! $errors->first('purchase_date', ' :message') !!} + {!! $errors->first('purchase_date', ' :message') !!}
@@ -45,9 +45,9 @@
- +
- {!! $errors->first('expected_checkin', '') !!} + {!! $errors->first('expected_checkin', '') !!}
@@ -59,7 +59,7 @@
{{ Form::select('status_id', $statuslabel_list , old('status_id'), array('class'=>'select2', 'style'=>'width:350px', 'aria-label'=>'status_id')) }} - {!! $errors->first('status_id', '') !!} + {!! $errors->first('status_id', '') !!}
@@ -96,7 +96,7 @@
{{ $snipeSettings->default_currency }} - {!! $errors->first('purchase_cost', '') !!} + {!! $errors->first('purchase_cost', '') !!}
@@ -111,8 +111,8 @@ {{ trans('admin/hardware/form.order') }}
- - {!! $errors->first('order_number', '') !!} + + {!! $errors->first('order_number', '') !!}
@@ -125,7 +125,7 @@
{{ trans('admin/hardware/form.months') }} - {!! $errors->first('warranty_months', '') !!} + {!! $errors->first('warranty_months', '') !!}
@@ -149,12 +149,12 @@ @foreach ($assets as $key => $value) - + @endforeach -
diff --git a/resources/views/hardware/checkin.blade.php b/resources/views/hardware/checkin.blade.php index c680949f5e..ff2d08e52c 100755 --- a/resources/views/hardware/checkin.blade.php +++ b/resources/views/hardware/checkin.blade.php @@ -46,7 +46,7 @@ @else - This asset's model is invalid! + This asset's model is invalid! The asset should be edited to correct this before attempting to check it in or out. @endif

@@ -60,7 +60,7 @@
- {!! $errors->first('name', '') !!} + {!! $errors->first('name', '') !!}
@@ -69,7 +69,7 @@ {{ Form::label('status_id', trans('admin/hardware/form.status'), array('class' => 'col-md-3 control-label')) }}
{{ Form::select('status_id', $statusLabel_list, '', array('class'=>'select2', 'style'=>'width:100%','id' =>'modal-statuslabel_types', 'aria-label'=>'status_id')) }} - {!! $errors->first('status_id', '') !!} + {!! $errors->first('status_id', '') !!}
@@ -82,9 +82,9 @@
- +
- {!! $errors->first('checkin_at', '') !!} + {!! $errors->first('checkin_at', '') !!}
@@ -98,12 +98,12 @@
- {!! $errors->first('note', '') !!} + {!! $errors->first('note', '') !!}
diff --git a/resources/views/hardware/checkout.blade.php b/resources/views/hardware/checkout.blade.php index 30d0dab505..8608fd6273 100755 --- a/resources/views/hardware/checkout.blade.php +++ b/resources/views/hardware/checkout.blade.php @@ -36,7 +36,7 @@ @else - This asset's model is invalid! + This asset's model is invalid! The asset should be edited to correct this before attempting to check it in or out. @endif

@@ -48,7 +48,7 @@ {{ Form::label('name', trans('admin/hardware/form.name'), array('class' => 'col-md-3 control-label')) }}
- {!! $errors->first('name', '') !!} + {!! $errors->first('name', '') !!}
@@ -57,7 +57,7 @@ {{ Form::label('status_id', trans('admin/hardware/form.status'), array('class' => 'col-md-3 control-label')) }}
{{ Form::select('status_id', $statusLabel_list, $asset->status_id, array('class'=>'select2', 'style'=>'width:100%','', 'aria-label'=>'status_id')) }} - {!! $errors->first('status_id', '') !!} + {!! $errors->first('status_id', '') !!}
@@ -78,9 +78,9 @@
- +
- {!! $errors->first('checkout_at', '') !!} + {!! $errors->first('checkout_at', '') !!}
@@ -90,9 +90,9 @@
- +
- {!! $errors->first('expected_checkin', '') !!} + {!! $errors->first('expected_checkin', '') !!}
@@ -101,7 +101,7 @@ {{ Form::label('note', trans('admin/hardware/form.notes'), array('class' => 'col-md-3 control-label')) }}
- {!! $errors->first('note', '') !!} + {!! $errors->first('note', '') !!}
@@ -111,19 +111,19 @@
@if ($asset->requireAcceptance()) - + {{ trans('admin/categories/general.required_acceptance') }}
@endif @if ($asset->getEula()) - + {{ trans('admin/categories/general.required_eula') }}
@endif @if ($snipeSettings->slack_endpoint!='') - + A slack message will be sent @endif
@@ -134,7 +134,7 @@ diff --git a/resources/views/hardware/edit.blade.php b/resources/views/hardware/edit.blade.php index 4d86a13f6c..9f24460ef4 100755 --- a/resources/views/hardware/edit.blade.php +++ b/resources/views/hardware/edit.blade.php @@ -22,21 +22,21 @@ @if ($item->id) -
+
- {!! $errors->first('asset_tags', ' :message') !!} - {!! $errors->first('asset_tag', ' :message') !!} + {!! $errors->first('asset_tags', ' :message') !!} + {!! $errors->first('asset_tag', ' :message') !!}
@else -
+
- {!! $errors->first('asset_tags', ' :message') !!} - {!! $errors->first('asset_tag', ' :message') !!} + {!! $errors->first('asset_tags', ' :message') !!} + {!! $errors->first('asset_tag', ' :message') !!}
@endif @@ -181,7 +181,7 @@ $("#selected_status_status").removeClass('text-danger'); $("#selected_status_status").removeClass('text-warning'); $("#selected_status_status").addClass('text-success'); - $("#selected_status_status").html(' That status is deployable. This asset can be checked out.'); + $("#selected_status_status").html(' That status is deployable. This asset can be checked out.'); } else { @@ -189,7 +189,7 @@ $("#selected_status_status").removeClass('text-danger'); $("#selected_status_status").removeClass('text-success'); $("#selected_status_status").addClass('text-warning'); - $("#selected_status_status").html(' That asset status is not deployable. This asset cannot be checked out. '); + $("#selected_status_status").html(' That asset status is not deployable. This asset cannot be checked out. '); } } }); @@ -248,7 +248,7 @@ box_html += ''; box_html += '
'; box_html += '
'; - box_html += ''; + box_html += ''; box_html += '
'; box_html += '
'; box_html += ''; diff --git a/resources/views/hardware/history.blade.php b/resources/views/hardware/history.blade.php index 17a02b883a..9a8bcdda49 100644 --- a/resources/views/hardware/history.blade.php +++ b/resources/views/hardware/history.blade.php @@ -21,7 +21,7 @@
- + {{ count($status['error']) }} Error Messagess: Please see below for errors.
@@ -34,7 +34,7 @@
- + {{ count($status['success']) }} Success Messages: Please see below for details.
@@ -73,7 +73,7 @@
@if (config('app.lock_passwords')===true) -

{{ trans('general.feature_disabled') }}

+

{{ trans('general.feature_disabled') }}

@endif
diff --git a/resources/views/hardware/index.blade.php b/resources/views/hardware/index.blade.php index fe21801e68..267b68a56c 100755 --- a/resources/views/hardware/index.blade.php +++ b/resources/views/hardware/index.blade.php @@ -57,23 +57,33 @@
- {{ Form::open([ - 'method' => 'POST', - 'route' => ['hardware/bulkedit'], - 'class' => 'form-inline', - 'id' => 'bulkForm']) }} +
+ @if (Request::get('status')!='Deleted') -
- - - -
+ + + +
+ {{ Form::open([ + 'method' => 'POST', + 'route' => ['hardware/bulkedit'], + 'class' => 'form-inline', + 'id' => 'bulkForm']) }} + + + + + + + {{ Form::close() }} +
+ @endif - {{ Form::close() }} + diff --git a/resources/views/hardware/qr-view.blade.php b/resources/views/hardware/qr-view.blade.php deleted file mode 100644 index 7b6d3eb83b..0000000000 --- a/resources/views/hardware/qr-view.blade.php +++ /dev/null @@ -1,447 +0,0 @@ -@extends('layouts/default') - -{{-- Page title --}} -@section('title') -{{ trans('admin/hardware/general.view') }} {{ $asset->asset_tag }} -@parent -@stop - -{{-- Page content --}} -@section('content') - -
-
-

- {{ trans('admin/hardware/general.view') }} - {{ $asset->asset_tag }} - @if ($asset->name) - ({{ $asset->name }}) - @endif -

- -
- -
-
-
- -
- - - - - - - - - @foreach ($asset->licenseseats as $seat) - - - - - - @endforeach - -
{{ trans('general.name') }}{{ trans('admin/licenses/form.license_key') }}{{ trans('table.actions') }}
{{ $seat->license->name }}{{ $seat->license->serial }}{{ trans('general.checkin') }} -
- @else -
-
- - {{ trans('general.no_results') }} -
-
- @endif -
- -
-
- {{ trans('general.file_uploads') }} [ {{trans('button.add')}} ] -
- - - - - - - - - - - - @if ($asset->uploads->count() > 0) - @foreach ($asset->uploads as $file) - - - - - - - @endforeach - @else - - - - @endif - -
{{ trans('general.notes') }}{{ trans('general.file_name') }}
- @if ($file->note) - {{ $file->note }} - @endif - - {{ $file->filename }} - - @if ($file->filename) - {{ trans('general.download') }} - @endif - - - - -
- {{ trans('general.no_results') }} -
-
- -
- - - - - - - - - - - - - 'icon' => '', - 'created_at' => date("M d, Y g:iA", strtotime($this->created_at)), - 'action_type' => strtolower(trans('general.'.str_replace(' ', '_', $this->action_type))), - 'admin' => $this->model->user ? $this->model->user->present()->nameUrl() : '', - 'target' => $this->target(), - 'item' => $this->item(), - 'item_type' => $this->itemType(), - 'note' => e($this->note), - - @if (count($asset->assetlog) > 0) - @foreach ($asset->assetlog as $log) - @php $result = $log->present()->forDataTable(); - @endphp - - - - - - - - @endforeach - @endif - - - - - - - - -
{{ trans('general.date') }}{{ trans('general.admin') }}{{ trans('table.actions') }}{{ trans('general.user') }}{{ trans('general.notes') }}
{{ $result['created_at'] }} - {!! $result['admin'] !!} - {{ $result['action_type'] }} - {!! $result['target'] !!} - - {{ $result['note'] }} -
{{ $asset->created_at }} - @if (isset($asset->adminuser->id)) {{ $asset->adminuser->present()->fullName() }} - @else - {{ trans('general.unknown_admin') }} - @endif - {{ trans('general.created_asset') }} -
-
-
- - -
- - @if ($asset->notes) -
{{ trans('admin/hardware/form.notes') }}:
-
{{ nl2br(e($asset->notes)) }}
- @endif - - @if ($qr_code->display) -
{{ trans('admin/hardware/form.qr') }}
-
    -
  • - -
  • -
- @endif - - @if (($asset->checkedOutToUser()) && ($asset->assigned_to > 0) && ($asset->deleted_at=='')) - {{-- @TODO This should be extnded for details about non users --}} -

{{ trans('admin/hardware/form.checkedout_to') }}
-
    -
  • -

    -
  • -
  • - {{ $asset->assignedTo->present()->nameUrl() }} -
  • - - @if (isset($asset->location->address)) -
  • - {{ $asset->location->address }} - @if (isset($asset->location->address2)) - {{ $asset->location->address2 }} - @endif -
  • - @if (isset($asset->location->city)) -
  • {{ $asset->location->city }}, {{ $asset->location->state }} {{ $asset->location->zip }}
  • - @endif - @endif - - @if (isset($asset->assignedTo->email)) -

  • {{ $asset->assignedTo->email }}
  • - @endif - - @if ((isset($asset->assignedTo->phone)) && ($asset->assignedTo->phone!='')) -
  • {{ $asset->assignedTo->phone }}
  • - @endif -
- @endif - - @if (($asset->status_id ) && ($asset->status_id > 0)) - - @if ($asset->assetstatus) -

- @if (($asset->assetstatus->deployable=='1') && ($asset->assigned_to > 0)) - {{ trans('admin/hardware/general.asset') }} - {{ trans('general.deployed') }} - @else - {{ $asset->assetstatus->name }} - {{ trans('admin/hardware/general.asset') }} - @endif - - - @if (($asset->assetstatus->notes) && ($asset->assigned_to=='')) -
-
- - {{ $asset->assetstatus->notes }} - -
-
- @endif - - @endif - @endif -
-
-
- - - - -@stop diff --git a/resources/views/hardware/quickscan.blade.php b/resources/views/hardware/quickscan.blade.php index 8ceaca9ba6..2b81d858f3 100644 --- a/resources/views/hardware/quickscan.blade.php +++ b/resources/views/hardware/quickscan.blade.php @@ -16,34 +16,7 @@ } -
- -
- -
+
{{ Form::open(['method' => 'POST', 'class' => 'form-horizontal', 'role' => 'form', 'id' => 'audit-form' ]) }} @@ -64,7 +37,7 @@
- {!! $errors->first('asset_tag', '') !!} + {!! $errors->first('asset_tag', '') !!}
@@ -79,7 +52,7 @@
+
@@ -90,9 +63,9 @@
- +
- {!! $errors->first('next_audit_date', '') !!} + {!! $errors->first('next_audit_date', '') !!}
@@ -102,7 +75,7 @@ {{ Form::label('note', trans('admin/hardware/form.notes'), array('class' => 'col-md-3 control-label')) }}
- {!! $errors->first('note', '') !!} + {!! $errors->first('note', '') !!}
@@ -111,7 +84,7 @@ @@ -121,26 +94,27 @@ {{Form::close()}} - + +
@@ -1019,7 +1079,8 @@ }' data-url="{{ route('api.activity.index', ['item_id' => $asset->id, 'item_type' => 'asset']) }}" - data-cookie-id-table="assetHistory"> + data-cookie-id-table="assetHistory" + data-cookie="true"> Icon @@ -1079,15 +1140,15 @@ @foreach ($asset->uploads as $file) - + @if ($file->note) {{ $file->note }} @endif - @if ( \App\Helpers\Helper::checkUploadIsImage($file->get_src('assets'))) - + @if ( Helper::checkUploadIsImage($file->get_src('assets'))) + @endif @@ -1098,21 +1159,21 @@ @if ($file->filename) - + @endif @if ($file->created_at) - {{ \App\Helpers\Helper::getFormattedDateObject($asset->last_checkout, 'datetime', false) }} + {{ Helper::getFormattedDateObject($file->created_at, 'datetime', false) }} @endif @can('update', \App\Models\Asset::class) - + @endcan @@ -1123,7 +1184,7 @@ @else
- + {{ trans('general.no_results') }}
@endif diff --git a/resources/views/importer/import.blade.php b/resources/views/importer/import.blade.php index a3b4cd2bd2..54c1c90be4 100644 --- a/resources/views/importer/import.blade.php +++ b/resources/views/importer/import.blade.php @@ -86,7 +86,7 @@ +
- {!! $errors->first('quantity', ' :message') !!} + {!! $errors->first('quantity', ' :message') !!} diff --git a/resources/views/kits/checkout.blade.php b/resources/views/kits/checkout.blade.php index 7ac7de5d0c..2433a6631f 100644 --- a/resources/views/kits/checkout.blade.php +++ b/resources/views/kits/checkout.blade.php @@ -31,9 +31,9 @@
- +
- {!! $errors->first('checkout_at', ' :message') !!} + {!! $errors->first('checkout_at', ' :message') !!}
@@ -43,9 +43,9 @@
- +
- {!! $errors->first('expected_checkin', ' :message') !!} + {!! $errors->first('expected_checkin', ' :message') !!}
@@ -55,14 +55,14 @@ {{ Form::label('note', trans('admin/hardware/form.notes'), array('class' => 'col-md-3 control-label')) }}
- {!! $errors->first('note', ' :message') !!} + {!! $errors->first('note', ' :message') !!}
diff --git a/resources/views/kits/consumable-edit.blade.php b/resources/views/kits/consumable-edit.blade.php index bcc5683f56..7834d2ad4f 100644 --- a/resources/views/kits/consumable-edit.blade.php +++ b/resources/views/kits/consumable-edit.blade.php @@ -14,7 +14,7 @@
- {!! $errors->first('quantity', ' :message') !!} + {!! $errors->first('quantity', ' :message') !!} diff --git a/resources/views/kits/edit.blade.php b/resources/views/kits/edit.blade.php index 491810caf0..feea7e6eb1 100644 --- a/resources/views/kits/edit.blade.php +++ b/resources/views/kits/edit.blade.php @@ -41,7 +41,7 @@ "ignoreColumn": ["actions","image","change","checkbox","checkincheckout","icon"] }'> - Append + Append @@ -75,7 +75,7 @@ {{-- "ignoreColumn": ["actions","image","change","checkbox","checkincheckout","icon"]--}} {{-- }'>--}} {{-- --}} -{{-- Append--}}{{-- TODO: trans --}}{{----}} +{{-- Append--}}{{-- TODO: trans --}}{{----}} {{-- --}} {{-- --}} {{-- --}} @@ -109,7 +109,7 @@ {{-- "ignoreColumn": ["actions","image","change","checkbox","checkincheckout","icon"]--}} {{-- }'>--}} {{-- --}} -{{-- Append--}}{{-- TODO: trans --}}{{----}} +{{-- Append--}}{{-- TODO: trans --}}{{----}} {{-- --}} {{-- --}} {{-- --}} @@ -143,7 +143,7 @@ {{-- "ignoreColumn": ["actions","image","change","checkbox","checkincheckout","icon"]--}} {{-- }'>--}} {{-- --}} -{{-- Append--}}{{-- TODO: trans --}}{{----}} +{{-- Append--}}{{-- TODO: trans --}}{{----}} {{-- --}} {{-- --}} {{-- --}} diff --git a/resources/views/kits/license-edit.blade.php b/resources/views/kits/license-edit.blade.php index 09259663b2..34727d8531 100644 --- a/resources/views/kits/license-edit.blade.php +++ b/resources/views/kits/license-edit.blade.php @@ -13,7 +13,7 @@
- {!! $errors->first('quantity', ' :message') !!} + {!! $errors->first('quantity', ' :message') !!} diff --git a/resources/views/kits/model-edit.blade.php b/resources/views/kits/model-edit.blade.php index ec1daf59ec..d2a4a06e64 100644 --- a/resources/views/kits/model-edit.blade.php +++ b/resources/views/kits/model-edit.blade.php @@ -13,7 +13,7 @@
- {!! $errors->first('quantity', ' :message') !!} + {!! $errors->first('quantity', ' :message') !!} diff --git a/resources/views/layouts/basic.blade.php b/resources/views/layouts/basic.blade.php index 2c781264b3..7efedf73b2 100644 --- a/resources/views/layouts/basic.blade.php +++ b/resources/views/layouts/basic.blade.php @@ -20,6 +20,7 @@ } }; + @livewireStyles @if (($snipeSettings) && ($snipeSettings->header_color)) @@ -74,6 +75,7 @@ @stack('js') + @livewireScripts diff --git a/resources/views/layouts/default.blade.php b/resources/views/layouts/default.blade.php index 0ac2479f99..e9c1553bba 100644 --- a/resources/views/layouts/default.blade.php +++ b/resources/views/layouts/default.blade.php @@ -80,6 +80,7 @@ + @livewireStyles @@ -133,7 +134,7 @@ @can('index', \App\Models\Asset::class) @@ -141,7 +142,7 @@ @can('view', \App\Models\License::class) @@ -149,7 +150,7 @@ @can('index', \App\Models\Accessory::class) @@ -157,7 +158,7 @@ @can('index', \App\Models\Consumable::class) @@ -165,7 +166,7 @@ @can('view', \App\Models\Component::class) @@ -182,7 +183,7 @@
@@ -201,7 +202,7 @@ @can('create', \App\Models\Asset::class)
  • - + {{ trans('general.asset') }}
  • @@ -209,7 +210,7 @@ @can('create', \App\Models\License::class)
  • - + {{ trans('general.license') }}
  • @@ -217,14 +218,14 @@ @can('create', \App\Models\Accessory::class)
  • - + {{ trans('general.accessory') }}
  • @endcan @can('create', \App\Models\Consumable::class)
  • - + {{ trans('general.consumable') }}
  • @@ -232,7 +233,7 @@ @can('create', \App\Models\Component::class)
  • - + {{ trans('general.component') }}
  • @@ -240,7 +241,7 @@ @can('create', \App\Models\User::class)
  • - + {{ trans('general.user') }}
  • @@ -252,11 +253,11 @@ @can('admin') @if ($snipeSettings->show_alerts_in_menu=='1') - +
  • - + {{ trans('general.viewassets') }}
  • - + Requested Assets
  • - + Accept Assets
  • @@ -332,7 +333,7 @@
  • - + {{ trans('general.editprofile') }}
  • @@ -348,14 +349,14 @@ @can('self.api')
  • - Manage API Keys + Manage API Keys
  • @endcan
  • - + {{ trans('general.logout') }}
  • @@ -377,7 +378,7 @@ Toggle navigation - + @@ -389,22 +390,22 @@